{"_id":"@twreporter/dual-channel","_rev":"63-f31a9756f53a0f4ac63642380dc1337a","name":"@twreporter/dual-channel","dist-tags":{"latest":"2.1.4","rc":"2.1.5-rc.0"},"versions":{"1.0.0-rc.1":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.1","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"20bc87d20754f22a357d9c87f1927f10a608cd53","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.1.tgz","fileCount":33,"integrity":"sha512-kan2PhBBVwuVEWsuoKS5wWli5qiqRboOVr8VLLBs1mFCkPeA/cjmgoJkwHlW39e2RhPxFTA6o1J/tgu8ogzPCw==","signatures":[{"sig":"MEUCIBJtwmT+EeIRQx39nDT8q4zeM04COYsqmauGhtjjh1RZAiEA6FDKBy8fFButJGxM6NoRrvQ2cffSWkY+L3pMTMaQGxE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeSjr9CRA9TVsSAnZWagAAuXcP/3E/dAIaRaiAhpzVkEUd\ngyoyAy2LjRffLAvbc59SI+FQlZKnwbrorpv72zIUoxkr4Y2/Oo7cbWO+7+TG\n3R4sIlj87mOoJOUn36jPNJk5RG3PbA3URLQ4KBoVG0PCvSUpZ8K8i2bgTtHf\nXv+cVk8b/k2Mlbs/sfTWhLaOrzuivlWjuFNlmvKRJbvKcJ3U5qpIW4E0oHkZ\nmNa4+owGYyZ6ime/8NMdI7up+d85If/tKeFSBQfxR7CoKM7UdFomkFQ09mMV\n/3BziAtCCq/JxpK5QHG16tM2AJR0UT8dBKSxaL8OhBwRTfxaq5JgkXf94N7+\nM+F3jt4WH0rVSnruK/xCFXmbUa9gV/NOOdSoukJQrxLVPc3GRam+oGxDjWcp\nHuoEyvk2wzg7GCkepNs8i0aUgZI3M1AXA5e2uZ3T8OOuXCdPxh4JN2gFCUh5\nz7cVzrpFQq1zYTa7ii7W7DkJGQdmcvZ3xss8V30Bds9mc78bAmewU9ErSURy\nnB8fnJX0xaxvY/BmeJnKbtd078T31SIzDKONdlUlqfhRRpDNe9sYyTpGLvXs\ncSRkymEhK4DFBUXrFbpsP/PXF99I0Fb9qYxummxTSUflDbPpFU12sm+M6SeO\ngqHywpPNzRv0WBGYH9r1x7JqdCgoUR+Kc75lwQCl6a0NkvJlJsX2rF6aInDE\n58me\r\n=pdEB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"330e190e350f5535ab7e9c9805110bf05df3f5fd","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.1_1581923068958_0.0037540260530031233","host":"s3://npm-registry-packages"}},"1.0.0-rc.2":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.2","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"40f504a87435ebaeac9bb0f1401c81e3c6e9a156","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.2.tgz","fileCount":33,"integrity":"sha512-WktvM4ZWfbtrhXo2YabVDhIG8ojLsBg45ma0l0YzkVtG3CFCjS2ozklayHhLFGWix/WiZiz7wPg7/zwCzRE6tw==","signatures":[{"sig":"MEUCIAX8lWlLwSbuV3kIudeg+Y7sshNJVGkjJtmjFnvpZ+YPAiEAxbsHpIiBZD1s2lCb04uQCHRMLn4F34XO6xc3FCSO0Lk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84776,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeSkNgCRA9TVsSAnZWagAA+PwP/1RI6q9khVTmtFp2AGto\nBtCkBeE8iMLPkObZL+CaumLLgnP6KqiU74xar5z4dcwmYV7tTGi9wJvOYSyJ\nHsUwnV8M6Y3zqly29YHen4efip9YnU1vm2+bAeM0Yq6PwatVeX/LB0kz9vDQ\nsYZ06xk5ElAKjdIVKZ8jFYwIGPqO2z9nI9ZWVtLWW8p/+xF3g5gRocbvTb49\nG1TBO7UnzRDhPjFCrLfAW3IHgzk6eKDx7z6xFwS9eBWroUXqOXkHl2u60jvc\n6TgClnxo2aCHb5v4bv8zsTCgLxh3UEeoQ+IzIYLnOo4R4c/Iip7zVAPBP0MX\n0ZNEkMwr/EidctzScKDYrUbpnvKLiWLWfOLHRDPn68E+i+GEO1XDFT3guZtc\noNqObaSa6RUgpCCuslLk6bXwZoWkIBK/iR/lsor+NuMb888cuAovPWkkQ0zt\nLkFkYL4vOLURPu/fPb3YbcYghJFJqXmjIR8nh51mpmI/UxECnFHTrQDuXTTH\nUbngmaS6p0paQvmQTNN+9TAPBWUeiaAOKkxO8PlOYup5rJaOucIsSSJepyOm\nmHU0Pd/2DfrBQ+fO9SNr17gx8k2AnKSWYPECjtblAPGspQCfq9df9pH88bSj\n3U4qwLcCL1OA6ZICmPrxhrAyoF9n6E9si+eYKaRMlvHVNuc2hEKATjK7mmTM\n//WN\r\n=Jvdz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"48deab73906d21fbd9199203878ea20244d35173","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.2_1581925215900_0.562632052100928","host":"s3://npm-registry-packages"}},"1.0.0-rc.3":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.3","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.3","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"c0f75b4e1032654581f5146190cd0108d52a67d0","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.3.tgz","fileCount":33,"integrity":"sha512-fmx/qvfdyS9JfYWozNqtBKzrn7WA5CTnllNziSkKC60UShpWTEAmZfy4PdqMv7NWi9BsdWKi+a9Z9x69bB5ggA==","signatures":[{"sig":"MEUCIEEHBbmW8d7cgOlR9W0df+UdgRoXSwJqSyB88a+p6UKCAiEAggLMOlr8PkSK3T+VI4AnCUGfM1Vvy1Aj1zSKlrdikhk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84765,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeS6waCRA9TVsSAnZWagAA8xEP/0VqvxIGTCjHM3tgbMCZ\nzIfymS4/IftRWf0exHFxeCejLVd1Udt/RgJ67YpyRA2pKVQ4jMsSsSbXRZJd\n+IydqJ8I97cSFmi7PyRpJ+XxjQmHFfDtRZd98U9ebTHQXLBLloNqz+KQwwqH\n8bDOvit9uI3XSJWfzugMTijvY/eaWvZ90ydu39mmWXp4h4XptvOasGBjAv/i\nijM2kzLXLipFhh8Ap45og+MT4WVsWf5ixE5C7Td8lELGTNvMCIl45VyV5jVV\nnkvDNJgPxsu7kZk0hHwBUdNGcZz38MbIzi1L85W4RkOlvRAHo1ymDlD8y5gA\nkAGF8U6Y3IkYwdqN68jxryfblPeFD0TPvi2UT9qtZsx98luT55c2Psum1soA\n6yr3zzilGBeXm5V1KJ4qd9DHrA9yBv5IvyQVV70qVZOw18ZLoEsS3eAi76xm\nQJvgiO7h26gdKW+mlZ84zQcDlZ500UKwjxUEDJH79koh31OcnBXtmYsH+tfv\nrtDMlk6TJ/K2T8B6TRomWDPW/1Gu/5hlbFo5TJvsu8sIIvz8a6d77ZlSh8Ij\nDM3L91cq7BlFpnyBuxv3WCANbVqZl8nL8+CqwkqZGuzX7+oJTmZ4to9W99ot\n/wMv1NV0KkPQZj1E8jj6erF+fNVDd0mqp6VLEs6IhoUycw/g+FNEDKDXeI4v\ngXgm\r\n=ZPgD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"2e68d76f5e4f9b1a10e464902a609c017e240293","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.3_1582017562386_0.3003340114756541","host":"s3://npm-registry-packages"}},"1.0.0-rc.4":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.4","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.4","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"5a46eb3758e1f52897b31e48b92dd8fe2118fc37","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.4.tgz","fileCount":33,"integrity":"sha512-mNWZvmUyZFJf4R8zDU4LPAUir8j/Gi3huWLWgnCrsu76BXPedvjxLsVEh1sJEi/879VYX+FaR+du4GhoXGd2pA==","signatures":[{"sig":"MEUCIGz4UBaQSoC9wJ4CWMl1M8dKWBbr+zLwkxQc509uQgVCAiEAlFPgLhQEZTMWNIa7DCuQkVBrK8cRL4vw1NZA9PKhbiE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84998,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeS9DYCRA9TVsSAnZWagAA/P8P+gKQQcC9nyuRcK8SeywE\nnDMA4kZ3TGaAv81DJ6c2xRp8paREnK17XGvahy4XxistguFw+Qilxxy3FAX3\nMbbhzNaW8aXrIln3uYBE3cHWWLwrngewlAxi4mmdKVtpWwCKJ0FbS/vlP3Pr\nYJDOvYt7m9+G4QEfs9w1/FOeCstx8n+uwn9nMR3BiWo8CJAm+0IEDtR2LUXN\nhqG3JETxqrVuCmNbynqARDbAotve8ZPuR6Dy+HUYnq0ZpfUGE+6Zj8dMpjlL\n691yzDHR0RnNtBaiw/sGYwgxD1Zmb4ow7087a9pewmHjreoBf10VxNmcsUkU\nGMa0PZOp5e/cboCdUN2me5+YEjs3wHp+KKRIKVZzW1zwVNRmy+5iOKvmFQ9/\nDk/YJuP50SAqZ0O0IsrpQO9gIvWwumxwxPmYNtNN2jvRrexNQpdwxVyAcjpW\nAhBx9xLfPEwQPi1OY9oD/hgvFQ0O+Y7OG+si5QPTro1jCVOHzYivIHMInkFQ\nnUtKoj8tvzObIwSWbMnFkdCp5Gu0FR+3ZkeDWeveSp83PF6DPls6CaOPas0K\naMBjUfcsv1fZACIuQ1LxB3V9fjIbwKv+2RARdTnTb6n1ZlLWGRst93uyZFS2\nGlAa+9xyj2v9Z3hPfrPHREoNK7UCGaSsHI4LWgXrBvt+gM1tJNGd9LyZc/AN\n7p8e\r\n=eEB7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"303fbda3e75d58a3ddf4abd9f9932a4f4e5ea534","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.4_1582026968065_0.5361557422366248","host":"s3://npm-registry-packages"}},"1.0.0-rc.5":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.5","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.5","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"3780b7fb137422338eee88b4d6dd483f3a58991b","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.5.tgz","fileCount":33,"integrity":"sha512-I/GNWTluafP2wifOUT+sCJSj+0OR/7Icoy6250OleQb1cIR+8skroD8MV5TyLiyf5BOaQd7O2E4/JGLb91kVSw==","signatures":[{"sig":"MEYCIQCIsYz4r4T14KnRuZyc6K9mfwZOZCFUMSJIdN50ZrEamAIhALmS1uMcUlR3iuivbXPh6VXAjxTOzxmzsBEpMLIuYp4e","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84998,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeS+AkCRA9TVsSAnZWagAAQpsP/RTTrxcr/RayuwxrATYN\nS4XnsDHUoTIJtMceLcRz5/3THTfzhC7yEieSdI9zHcupvQ1UP0OgRfMnOVHl\naTuV6MZ7YC++AgfgZokBrisqB6MadVL9cr13byaUXOLI/I4T58+d8bAygtG/\n7Hx4X9I+HI2q/2BJu4ZR7o1qMkCz3q9bHYb2v42SFkux7SikPtGPtefecZyZ\nP7pM9mj+9i871F9tzJxE+rPxl3mMPgiEviB9wLaPIofFjZC/V2nE0trL2I5F\n6Z+kY6PyeH0Pgy5MPXbHbsRaHK4o4gorTM5vU0GmEC9TZiM96+zxkorkxelS\naOHQA/KgjHpz7mid536k0TGW65dP42swtum0tlxcGtDH31nz2xeRooN7uO2N\nEK4Q0YGZY3ccyv7O2UxAdNfdyAazkSq4PfQVEADbKm9mVVQQJyVLqOr/NVdl\nPk73pZ+VHryIEbvQf1u12F8dF2xw02Z6avpx039gq0WHYgl7YhXtH8gvM72U\nzDagqEfaVBo5RQAiE2Swu5Wr50nlINIlMzqjXOGcvpaa7wFIVcCuGMwoj2oA\nK3auuRdF7ELMHe/vPKlmi1efQsjgWA+g7vcVZq3qkGx2OIlKJXslDzFZIl8H\nRr7SA0M4qPIfIq0PDpXzIa3+ZTakqD+1/WrZR4nCcNGA7wZuQSgVseuR7/Qa\niLx/\r\n=AL68\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"db9346835722d6c9d1b126fc6ad43cf945394c4d","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.5_1582030884207_0.834373304614775","host":"s3://npm-registry-packages"}},"1.0.0-rc.6":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.6","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.6","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"81256108c74e0733e3b2478f1ca556bb57b29288","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.6.tgz","fileCount":33,"integrity":"sha512-z9TUniiVrR3BiOHkjfFXBjgbsU3qh7Ed4BOPsJzKW7OVp7U3Fnqw2jZokMQRBvyqL1JOoNW3ttLKwk9xVZLyDw==","signatures":[{"sig":"MEUCIQC5viMa4u99khb5Tzr7O58PQgxRgeYCNCx59P3NE9RviQIgXTyt6/u7Zfsl4HwbXzbw4SjoNV3xppm21EDLPSkn0Rs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85306,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeS/grCRA9TVsSAnZWagAAWskP/1S9UaHb6TDfKNKkVrGV\nYbCLDa53+Q1CDfzoFfRt+ODMuEita8xYfodfC/7hQOaTs9XUfmuEaDQ7kq6z\n+eKkl6Plj3e0tiMcmpWJwA+gBK6YJuqxSQqf+LtpKCXUboMJ3af6y2F9vhcn\nBQJiW18lttA5W7GzJUN/6uZ365yEx4oTtnrQ/txPptVcB2OvoZWwcNZqZBNQ\nolEYR3GY3qCKREaulglr/ESplDe8Du/gvdb8NXPl80R7QF95gof4nV+h4wvV\nLAY0X22qUpkFAoYQdPh7Hd0lgRK0T/VKXz2nvyp80kZAWspVf/Y/8nbhnl5n\nwrzVVOElcBcmt2XDBm/7EI9t+TU4mAoDzl2cgYyWCpZoGusyoKn5Ixi4XstD\nO5RWstT9K+wKFQafGqnY9vJIPKC2xm9Z/SQOSospi4lfmVGlZ/DRIl5MPlgq\naiuMDCQvbY4qjVF4ZbcCHkgNgxP/66G32MVYJHm5eibz6ew/em7Xzs+6Z4Ee\nm6hsroUKFAGvjMEAplRQtTtzlLyg8vtebxct4GmFFDWwpXAFtKW9PQjwLNz9\nrYZXrAmVJU2Y2wGIDm++IErQ6eTALobrOFglH8VRrM87A5TrThUIzyYyXHU2\niMUqSHh2Pd1gZxYoleryMj95RPBDcvqrCD6uUF3oHvxlC+aJ3/BHTNfJ9IEr\nj6KY\r\n=9oFd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"edf78387af9828031f92c4ddc9884fb83765c2ed","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^5.1.1","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.6_1582037035219_0.21563536012055673","host":"s3://npm-registry-packages"}},"1.0.0-rc.7":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.7","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.7","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"de39e7047623c7e764ead0ae33ea6d2a2dc9fec3","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.7.tgz","fileCount":33,"integrity":"sha512-lorAT1RUV5XQ8Gn+2kt/g86ylaJ/pbDnUzVVon7U6yqWa7r5lfTJyrhsvBlVQWxceR5SQseODds5wS/UG//6iw==","signatures":[{"sig":"MEQCIFIgLK34wmquk3x6xInk0QZf4tPb8VccITOqs5MaIgq7AiBVkJAEuSBltBRGUw3+JdQ5wmUJ59OdGTkVpzO5DTqSRQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeTKe7CRA9TVsSAnZWagAAp+kP/1XtYyzEnbWXRbwcdFVn\n9OfWlwLcQJSOSO0PEZp9lJoG/C5cnXj0dbwFWkEKfiVR288+x7DsseEhbmyo\n5P0QahUfJLESLh8KUNAwnoM1OrbzcFZKNaxkFCWapOpW/ZXetIDLSsQJILWe\nqrn3xo5/1SfAwYcutX1Dz//vQCXX8oApORqw8TPQFmGbRNggvw35lcXA5/UK\nlLdKSsRwcrJtlANN2eMB6y7WOXyFl1feBU2zaaS/bcL9ILQJqKxHjqymnW3u\nCW9s2XkFlxkiBZ8b0KQn/CKZDFljETqfWyDd+PMtYBMSNvrN7B6ktLceOQ2w\nft3Au8IrfpygV2ClCpxQwqP14mdueZbF9NJ7Ft2Ch/jCjQOeptxBF+mCoVRU\nY09ZEMKUJxuPSgRd3R4eE03ZHh9Ai3sGkl51Lg1RRIF64+PdLAkDOVep0cA8\n6TNcQtRy7P+ZSWN33my3PtFc77lDeYZFLKJkicrYDh5+rqBb0A9ux0DZ2gzm\n0JMSKbDjWFOZjjIEaU/sKhNhmpQUGMwapp6/iTk9Q0F0cg9Uuhrw8zxjyggG\nFmSIvzIg1r2VS/60L8BI++h7LUoT5AuOmD1hmCGgONLeX4K03SYYy3lrOEuM\nOa5VxImJ3Mc7FboXAnu92ov7K0rpa9nwQdvr7ZfUX5AsZ15FKNFdFuVWkS4x\nIGGJ\r\n=42KE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"3a65e27fa5b230f7ca46dff8c344ff6b44a583d6","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"redux":"^4.0.1","lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.7_1582081979258_0.6187998735400269","host":"s3://npm-registry-packages"}},"1.0.0-rc.8":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.8","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.8","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"7363b05ee03042ae5d28da4204e3ab6c3dcf5311","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.8.tgz","fileCount":33,"integrity":"sha512-fLim6p9ggrfw8MYfPspBDSY+NXEB+S4BmRD0H2/mE6N7HC+FkM8QCN+NmTVY2GdgXiQjGBvBaLceLzwtiTzzFg==","signatures":[{"sig":"MEUCIQDuWgMbfrfqaR3n1Z8YmOGtFhuOUgmE4WGf9j7G3o7VZwIgW+x/8g/stD+Y8AD/1oJv9xfgq6zOMs2c4Q2icpwsj0Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeTLI8CRA9TVsSAnZWagAAF1cP/0jV5RgxRerPocKyfKh0\nT/5HisgJefSl51JduTqphkQfDicHpMWKQ1BmPgRBSGUOD9q/iqAWMDsTTurk\nrGift+6fHJpviNAro7VP7TDoimPvzj8igdNxhBbUERhL7ujzq02GRizFF7qO\nMCEhYzgEi6ID1OO9klo2yT5RnUuVufH+7vORbfH9pDkdiT5qrf55WKIS9xsI\n/wu6ZqyGXiZUMxh1/dj8lrNFydx8ZsOzyh41FNDRWQC2FewfrLbVErSwFJhg\nNBJk2Q9RGjRTNvy6eZ1ELLAva9AgiXRczYbm4/ZnSZRx1ondhl0+T47N52wx\nhht6nPZ8by7D67joH/0bUqLJ/w8jen/6hpiUP4rIgZ7E+1yQu4OoK4nv2yVk\nt2/R4lqC9g+UlJuGR9+zDFgxnvf55/LO8jGl3aDJnIIKti1Yq6ZViDuHdTm7\nZlUAnRJsMxtRgJLHQADktWjw4v6oKSWw15yw4VVRRUyVQIkP82sMA8AF688o\n4dk4nH6ce+G4TKqBi/C3bRK8WF4/ZBPC8QgyEmI1aW2lk0isWVLxAMHhLk34\nX9pdivSyoQcx1/N0dhMfRPoMXS2d9iKOArajeKDFHEu9UcJNuu/fUuPbKKsw\ncXHusKny5iW7pIsN7q1Kdefb3xvdCwm0P3Rv4X86/QZ2Vag++To8+Cofp3LW\nH2Jz\r\n=mYNZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"b5aecf88436616fff4a4c21f69a980e54c2c9a57","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"redux":"^4.0.1","lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.8_1582084668065_0.4739235300688942","host":"s3://npm-registry-packages"}},"1.0.0-rc.9":{"name":"@twreporter/dual-channel","version":"1.0.0-rc.9","license":"MIT","_id":"@twreporter/dual-channel@1.0.0-rc.9","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"88ba1c4100a3341eedabea55739ae00fb643b4b1","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0-rc.9.tgz","fileCount":33,"integrity":"sha512-nM9XXvZhnJ+lH7a3vSOupWlMdSaHNgmdiU8Xf7eyBNQcaieAYps32QZHYZzaiKdT5qWejp246k8RsrDI8KdG7A==","signatures":[{"sig":"MEUCIQD+Jl9zMdNc05OiztOMMI6/9CA54BXmTM0FOLXNt60iLAIgM8bFjZzpKKDCAAjeMZedjw1edbh5UWz3KzcwYpa1vWQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85162,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeTRYzCRA9TVsSAnZWagAAPVoQAJsygqx3sCaVjaErAvSN\nlxcSyYO+Z6JiBI9ggg88CAgnZh7Aq43ssbmUOGaS8Fzt7O07XAwi42GvZeb0\nIE8ay6+/slac+S9sYOdrxaMV2IKl6b+4mQYyCyDSwHtGlwlpirvjO5Tt7uk/\nRt/iX0VzCEpR0IczkKWbsJkiRXXeBq60eXgy+vgeL+KQGylw+GK5/h2g58Z/\nc/A6EXxfDyrWNsPtHcbYD0rzEx6oS1qML7fEBXJqUGcekuFq6uvkYIOwFrv0\nfgrfRmN4H0+JmMSwhsQDzJPFx8GPzyvM+ugSp64g7Q+6E5lKJZtAL/ZlfPuh\nB/uRdSxdnEvMMEZO++KtpDXFxFHlnVefLfZf5qi6TaKQmfC+P+3/VmNSsSWj\nNdiUJgv7AfXljI1M7M31UwifwGbY1G9ahTBLwMUZPPwCDAFxZEnmAuKxOj47\nkpfdhNAFbpJAx2Vw18IaGZ5kMiAUA4x3Paux9YIZAylHImNKFXN3nm1ZiUYV\n49CMTfhwxJ/uXllrmM9EB0eiaP0qjdVMWP60xRk52+MTESblO2jaPZW7qZIv\nUgtoMmQHo7i1LmpvCzQH+F7lgjXWV8JnghspqwRu5pVcjEckeXPOlJlOLJwd\nTTBrEKrysdvM3FC6a/HacfVNWWEna1c+1nQY+W1/x0iQT9NKtlBbh5qL0+/4\nhhT8\r\n=+SM4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"b5aecf88436616fff4a4c21f69a980e54c2c9a57","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"redux":"^4.0.1","lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0-rc.9_1582110259066_0.8788926065955596","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@twreporter/dual-channel","version":"1.0.0","license":"MIT","_id":"@twreporter/dual-channel@1.0.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"e821d58bcda4711b9ea380cd7fbe05a53fdb80f7","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.0.tgz","fileCount":33,"integrity":"sha512-6BNIAEiAjbtYq6Rps+y2qAnsjFLLdthyvkB5JltfH7cBy0WiRrEm1AMFKuOdG3aKejaXWT9UTGtBVPAQRm//JQ==","signatures":[{"sig":"MEYCIQD2he8khx70jdppGY+6bwUm5q9PtYPZqw03Ngqg23AaHAIhAIfo43s8SJted4QDq60KBPanOGPEfF3RKSICqIUJ20tG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85026,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeTRmzCRA9TVsSAnZWagAAuQUP/2v0p8q/w5EvZX+2cSEw\nco0ij8k0X1MosYxWJmMNas6COtVsYJEV8HO79ETZU5GwH3lbqc3XqgtQMoXF\n8W9C8ATO2RId0i2G0WT4ss5Au2F/JxdT65CmPGxbpnw1Dc38zsPMhwYdI9jK\nJIa6yIlC+OwRBfGSAlENgS9OTWJ97QwQgI6piYZQpDCTmmqPfz9XdTZs7b9x\n2Co9h8XyEsfkq/UO6MJI5XyvQ1BWVwBE1DE5KRizDLvDFncwH9fwyaJDQTXQ\nZVs2126p5N9cV89VQ50iDdB3ap0eQFdsC1eAS3jFDyxmmm52hTA9Ek9C4NQC\nQtHdl8IwEywE2qb6aloZCrgLL7uhz1RyTGkp62qOjg31wolOeqrAeHLDPThF\nrSRNkN5a2KtddEonP2XADxpl2fDVD2Ckw/msLsfiO9Ya/woWtBo/0lSG9756\nY4OYK7hHX3EAJTBbdGS+6OkmI/Oh//lRYzqsgKGZ+gWHz/lG0b1PmkMmYgDf\n9YJmdQZtWJaSX6IQwIvtAkAmDTSvxa4AtTKBGIOUTfVOP79jDV6V+jikWFnx\nTh8/xH5SemkV8G2UWpRV9wOu4B7qTEgMP9VmW1cRBdTVq1rVunfazgDP8toU\nuM9VehWjVu3yEmUAmKTHX6rCOV+gUwEwEWOJBeEhRkCtPghty3yA22fNBb+s\nujQQ\r\n=LLUU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"50bcc74163df5b10dac447517a525cf86319d3df","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"redux":"^4.0.1","lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.0_1582111154589_0.5042494460316731","host":"s3://npm-registry-packages"}},"1.0.1-beta.1":{"name":"@twreporter/dual-channel","version":"1.0.1-beta.1","license":"MIT","_id":"@twreporter/dual-channel@1.0.1-beta.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"a466e5d4d5c78e98ad2d157ee25555d4d8e73319","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-1.0.1-beta.1.tgz","fileCount":33,"integrity":"sha512-X/Lqphbqeni8TI2Wz/M8SnTMN+7aEj/hSThJ4ytPrZ2IXJEKeLPuC//+7X1/1xY3pKFqdpXilHSNYmEkj7gBRQ==","signatures":[{"sig":"MEUCIEaDJ0mEIhxJGIYljn/JKujmNlZMXQgBTtEtdddT914fAiEA2TxY9dHaqceTTxLavcZmTpugUr5Fh4LJnpdeVoXojAw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":85199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVNTLCRA9TVsSAnZWagAA4r4P/iKtPv4AMedZmxvulHPc\nbPVB4ncG55WX3INfQ9UIoingYasc0cJS/VZ3KRrxg+99q3/p/SGU813ZxIyH\nuxtTlWdTCj/8rTl+k183nCxwTuXeiylWFNbKpvAkmGWTC7XwpEYSiCaHrpqm\nM8/v3AVCpT1hmXNjsCYZBl5XAso9AYg9OL/JCN7EYmtAkWV/6Z6/6PdtiFS2\nKVK2/nGYtvN0kmnt+EDIEXYTC9kmntm824EqPs1JW6/zJ9aBHDy8+I2lNIPn\nU99Mg4mtK+iEB21fMFVDw8+fy/0tPzMv20G6Kn0L4sa9eRNq859KkpMQGXRB\ndUBN5SN8zGJgdQLNOoxJmvLljNHDnQkq4mxWOVTsKvRriSs7H2FHOAKYtIeg\nnPBZB6GGobLt08eb3i/OezZs7RprWcVw1SJC/MHXy39T7Bdw8UtfZ/5PRsYk\nqFxfsZs3Q0otriC0Bn3lEp3V3wTKPhdXxWqKGs1ZyKzygxphoIsVin+Ht8PV\nSvk7mzmeJVnm2GWpn417VKgomVvAh0thZcRExn5p0hY3BsdOCe8k2aBuRidn\nA5ekC81oDUtMQoY2UbdJnOB0F+sadxlBVyg8kmYMxN7n4lH3TtQUmnb3PfYL\n/1Wz3jqeBdfucWfy0PirJrL2SSQndwQNmkC5XcD7qx38u+HKXVqNZGftsu+D\nBmIU\r\n=fCz1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","gitHead":"50bcc74163df5b10dac447517a525cf86319d3df","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.9.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"12.6.0","dependencies":{"redux":"^4.0.1","lodash":"^4.17.11","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","webpack":"^4.25.1","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"peerDependencies":{"react":"^16.5.2","react-dom":"^16.5.2","styled-components":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_1.0.1-beta.1_1582617802804_0.19426169114141545","host":"s3://npm-registry-packages"}},"2.0.0-rc.0":{"name":"@twreporter/dual-channel","version":"2.0.0-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.0.0-rc.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"a5a6c8f280f27c3edce63dea9d5963dcbbe4a60d","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.0.0-rc.0.tgz","fileCount":40,"integrity":"sha512-XjoeHB8fshkaIF570MkzZMGerj9Pi5N2Sn8zgTh8xqjx3XLfcTaljM5Y3U0CpMIXLglU1ocU2g/K371+9VOrKg==","signatures":[{"sig":"MEUCIH8uDgMcHdtYE7AKn4T/2nkuzoWbieUjgFtZH6QsuMxHAiEA31PrRNWobjVUVGA8zm6kB4ez9nVnGEpvtOFpJvOilPg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":90838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecvcgCRA9TVsSAnZWagAAEicP/R2qBZsmqqAELq6g6PQG\nY61HZkqbYzkad1WVLXM5fqYE9iRFAe2Nj0BXsEXxgcOaEzoy4PGyRdjUlOF/\n51p8vSQQuKowmIvzcXL1ejm0h8TiYp8/p5V7FP0w3cfPKbXUNKuoQH7zXHXk\nlqBz8ZFr+u4Qsa3tVwPHq6wsKgyiJrEhMFq1+euv+1yq+zavB+gAVlB2Cvxf\nHPkUOVyG/ejeYVQ4wdI9FHpLGeR/s+36nkMOX9nM6mdILshXDGqXPDW4CNHo\nT3kLbRS9wli8a7pU5ShgkBOOlXJtzfA8a6adsIYcaoGZ4CemIqmnZZkPapDK\nCaXghw6534ukhaIIFG7SlU8PFYTSJMeJR9UjPGLtfidc1XCqPsGwNBW2DRJW\nx7CfhY6WgUoKch9v+fKmjcxPcVNFJCwd1AbMfvw7q+bLZvKbE6usJf+9oBiR\ngoPz0BBuclCBtLbQPucwj0UpaqhsBiugqQD8NQ1ziEnH6w/9fUUabyuVxnoo\nvC66NVZf69CFykZU+QhHq2i9s9ABCYFzxaefijrGQnRwC0zsQ5XtS35NCVa1\n2mPg6SLmqb3VsoFLGNzUx8kZ/GejHSxuvjVtpNbs66hzl1MGQNrUhnuW2fT+\nS9pdGO7o5RF3lai1ESjuXvmwEMRPC0RtKM4rfWTkdJ3DPMH6d2NAL2wKzvqC\njIHy\r\n=tk17\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"5bb8d9d5e140aa8620c00173260237c54c7b9416","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.5.2","redux":"^4.0.1","lodash":"^4.17.11","webpack":"^4.25.1","react-dom":"^16.5.2","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.2","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.0.0-rc.0_1584592671973_0.9273170690398038","host":"s3://npm-registry-packages"}},"2.0.0-rc.1":{"name":"@twreporter/dual-channel","version":"2.0.0-rc.1","license":"MIT","_id":"@twreporter/dual-channel@2.0.0-rc.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"420a7397da5ecfda5b2ac53f1f3ca7197100458e","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.0.0-rc.1.tgz","fileCount":40,"integrity":"sha512-X8VLXqodSYX2Zuu/Ph/RQt1F/SPB8ZdtPMrSRz9BTD7sUG+xdbdp6Y+C+ZnBTjfwOjnjqIcbRtBv5QNiP69+7g==","signatures":[{"sig":"MEQCIHVpW4l/p/4fxV/lsJ1gjZAiqbG11aIBexW2dxYaOJdIAiABODJ1zSESBMunedq56fHaRfsSxRabEZ8ftqFmVgkwYg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":90838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecx+dCRA9TVsSAnZWagAAhSUQAJlCBRpptO08s0rjmfih\n7iwbr9zF2nmWmc7iIxuxTHYHdQAFPKG04VCopZ7UEH2LeXKA/DZ5G31cKO9v\nqqnupey1CO5aY9F/va+Iuq7XLFnBq7H9PygzCcBkxcrtHVafU8wc8siKaeeb\nRDrHxstqFeZgeVJ6DP8U6tl8oHxqmO6Lm7Huz5+2SzlQajVBpY6UPf4fCA/M\nbDd/tJ+veXGFsBhdCn3+n1CrXevgx4+25ngsh75be8QSftZKW7/l2b/thTId\nGSFHopu9MD7WcKvvF7RfobvNFu1rk9Go33EBx5p2OMP6TyxRynDT3q8vM6/X\nR6S6MEODDY72X0TGBNbNKLRozNnuMuHhoDZqTwTKwkfAxlSr5UQzQyb9fiK0\nOeESIWGM3JODDrdeos85yHI+FLs8etz7Nj7+QRgbPhmdy0PqngrbZfMpM/l9\nh2O/rK8T+hF5pp1a48G0qZEVTOS2e20OamN72gp1VhzYtnN8ESWzfFhBgoiu\n3Rf6iillclc+zrBa6Ld5yGntWMNiN5sH5wLNBa6nsQySvdRlIJHaWFqiDl0d\nY4cLlY0O1ZpB8bguXSe+/szm2G5cPDlBmrw5V8S14g4toMXF8BUrJB8iK5Sv\nJfZHn1eJFj/+hJLIoYi5AW9/jvXdrMg9f+Yk0rTrLO/0GTuOlt1nNsfzke8h\nfsVl\r\n=Xs3g\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"4c39f64405adb34159966e5010b1df75ec6b7db5","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.5.2","redux":"^4.0.1","lodash":"^4.17.11","webpack":"^4.25.1","react-dom":"^16.5.2","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.2","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.0.0-rc.1_1584603037109_0.38769277369119437","host":"s3://npm-registry-packages"}},"2.0.0-rc.2":{"name":"@twreporter/dual-channel","version":"2.0.0-rc.2","license":"MIT","_id":"@twreporter/dual-channel@2.0.0-rc.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"a4ae91cb93211393d345a474af6f134fefaba55a","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.0.0-rc.2.tgz","fileCount":40,"integrity":"sha512-o5shOlSLs5dtq4ADfODmhzlHUlT/A7VLt2g77XdtXuSaO/MWgfEcSwGkqUVvlw1Qi6MopaLwuc+kW/1HomnyPA==","signatures":[{"sig":"MEQCIFZ9ffpieQEJyXWkdD/57cFyXdetscO7RPUlNgvPxHbSAiBF7EeUGBIPR3OmRHEaLhlf/A+sENjST5nEwix29W+iew==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":90825,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJec4utCRA9TVsSAnZWagAAAUYP/jRUR7ufkaw721rXOUd9\nfQ09x4huzPAHM2TugG8i0rUPOrYKFLMgiNt4c+X6a5WT/PdrfoWVKu4f1vrY\nI2Vi5FzkiVsmYq8yWMzfaPkfeQCHvZ2DeA70RfsGJSI6B0uvnBS7J+gV+ld5\nqF0R+XedC3Xxzu5aEuRL5fYzJF85LOVT0E3sSTFRz/xi9GbVvvu4A6MFpeuK\ngm9uKZ0PY+4irfEgQ98aAAZhuX1BBJmILGNinVHHRyE9FaObD60zFAosod0y\nbQHlhDhmTj55BM0bpj1uWEFGEscHo8rTTTSnc8tax4PWxtOctbqIOMHq9x6K\nrg0ocHTZs2QVzM8LdomURL7WkjesyapoyiG8XvHBZhE9XrCrte3iTLpZ1N/N\n0j9iOow59Yk4aTINyMMNXxc5WeBa3J75dJApOZZkFj090E33tiU5keJqqRbB\nPncVEK+rW2+Jgk5eNnimUg1MraH66sTzc/bbfSbTAZrKb5LYjj11/8P9bQrq\nlmjSOyH/upxMkE1sdU65GQMBV04dw4b1wRH2COMvwzEiVsMrjJtf9A0kqJsG\nvMFKA+HO8wIYI/D/Sa/rrBXFaT9Z+6ulS81986CiVfVVIVbla4GoVb0p/B5n\nQJJhJu8lQYyDGnZ31KKoSAcwuMmB6lLnmLyXGvJIPWgFkzkgkoB1h+oUSjvl\nv2Q3\r\n=3Ty3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"85fee35ad7f5c0d4b91ef592ccada29125dfbf3e","scripts":{"lint":"eslint \"src/**/*.js\" --ext .js","test":"jest","lint:fix":"eslint --fix \"src/**/*.js\" --ext .js","lint:staged":"lint-staged"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"pre-commit":"lint:staged","_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"lint-staged":{"src/**/*.js":"eslint --fix"},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.5.2","redux":"^4.0.1","lodash":"^4.17.11","webpack":"^4.25.1","react-dom":"^16.5.2","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.2","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^23.6.0","react":"^16.5.2","eslint":"^5.7.0","rimraf":"^2.6.2","express":"^4.16.2","standard":"^12.0.1","babel-cli":"^6.26.0","react-dom":"^16.5.2","babel-core":"^6.26.0","pre-commit":"^1.2.2","lint-staged":"^8.0.4","webpack-cli":"^3.1.2","babel-eslint":"^10.0.1","babel-loader":"^7.1.2","babel-polyfill":"^6.26.0","babel-preset-env":"^1.6.0","react-hot-loader":"^4.3.12","styled-components":"^4.0.2","babel-preset-react":"^6.24.1","eslint-plugin-node":"^7.0.1","eslint-plugin-react":"^7.11.1","babel-preset-stage-0":"^6.24.1","eslint-plugin-import":"^2.14.0","eslint-plugin-promise":"^4.0.1","eslint-config-standard":"^12.0.0","eslint-plugin-standard":"^4.0.0","webpack-dev-middleware":"^3.4.0","webpack-hot-middleware":"^2.24.3","babel-plugin-wrap-in-js":"^1.1.1","webpack-bundle-analyzer":"^3.0.3","eslint-config-standard-jsx":"^6.0.2","babel-plugin-module-resolver":"^3.1.1","babel-plugin-inline-react-svg":"^0.4.0","babel-plugin-styled-components":"^1.8.0","eslint-import-resolver-babel-module":"^4.0.0","babel-plugin-transform-assets-import-to-string":"^1.0.1"},"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.0.0-rc.2_1584630700671_0.27402415295208704","host":"s3://npm-registry-packages"}},"2.0.1-beta.0":{"name":"@twreporter/dual-channel","version":"2.0.1-beta.0","license":"MIT","_id":"@twreporter/dual-channel@2.0.1-beta.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"d5bd37faa5bf5be90c03ac2e0f9c9c5f41d69d40","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.0.1-beta.0.tgz","fileCount":41,"integrity":"sha512-sqd63Ovewazl3W3IqU1GRLdqx16UBgRX0smnEOJoozDSychASVIuqP2jctc26OPrCi4rGIpZAo2qAJbv8VJ8gA==","signatures":[{"sig":"MEUCIQCjK9q87vSG+tiPKFo+Adsee9zaZtQwR0tfnGjzNHjpnQIgLmLF5bG/c3oxOw4gLLxdAXpdhPvKwq+PAiFRM96V74o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":462407,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeexMQCRA9TVsSAnZWagAA9j0QAKBOcHN3yxjS1B+QcP9f\njtdIkMxwVNh3zO/OSPvvkgLXxrf8FvCtD/LduNQ4ZRgMS03ogZOZnFeOWg1P\nOnFwoyp9NL35MUFybOzZ055GVHSY8jHjUfzyxStN/n+xV0sITIfoaocTFMsg\nLQQtR/tUsuoe4ItR6X4ZtWAyYfwVnjKiJXvOaGYDtE6Ca0kgqWnKfXSftKEH\nGvX2AlFaMZ4G3ckXSeVq8I8gJvdMzdLHcDutyPGn82wr0YRjSjxeARN8REQE\nmdOOWDQaRWOdJEVhBEDznnAS4a9cGEr+p0yaU4h/bvKUbUfh0ScAhhQLXifD\ncrR8Gl5EoXUAktIJ9Z1Qhz/nrtn6tT/51Wyis+wrEpRgTvdd4hCOZWFauzHc\nhEuFwsyTczbAMSwEfE+vq9d17EdV5KskY7zFLi18l/5kmzAndlOfvmUvDdJ8\nPnepAFq2lsqSGyuCsxTizcm9hY5bLrNwBZOYd39Fx0zVoU/hJd2bg22DQLUk\nw58abtxzXvkAaPkooLuEBS7SJPVsbsWicW6BkSr7ohSJYxJd4PGY13Lf0Dp6\ne1xQNa6NPJWgxsbsNc4Y9r2rFVcr9rJFfAHT8DMmD6EtoSiz0QEy/ra4+abP\nlN3kjbvP3l4LdDP/9DpY8rU3EzpGQMBgqJZBU8yDQ0rcZMjB7LvleOog1qlj\n8sch\r\n=4OUB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.5.2","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.5.2","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.2","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.0.1-beta.0_1585124111977_0.05345179417487933","host":"s3://npm-registry-packages"}},"2.0.1":{"name":"@twreporter/dual-channel","version":"2.0.1","license":"MIT","_id":"@twreporter/dual-channel@2.0.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"8f565d57746b2716e94abd1cc46de875c4a0b39b","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.0.1.tgz","fileCount":3,"integrity":"sha512-h6djpUCvm+UqguwDipb0ZS33D7HOuqJYQPNakJZYnb6iUPLMt3cy3ZMlOZKnxaWjTgfJl0jY0PMJlOUXnVVF9A==","signatures":[{"sig":"MEUCIDGF7dhc5MeAs3N2BKZ766XE72SdVaXhSAKn2VdLzY1yAiEA6KZYd1NwAJHa5/xy5tgXfhHoTIWHfcT2bOz6v6PB8qY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":5556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJefg21CRA9TVsSAnZWagAAm68P/0g1UM+ZJIN2JIpPr2g7\ny+DuAN+sRm2EnPy3yj5hePpR5Lx466biEUgspkLxKAlliALwI/EDe3+80+LH\n7LnCmFe12Euw0GlXo2ICav3/kw0wC2gDDc0+KDi/+deRnu+VckLhI+ZlNV0C\nqx0HBRV3AsTh6e3qHaw3ic89U0ICbWHdHiZuJhTslOcHjO+/vTVwXsf2Kqtr\nLbztUkV8x7u6mwndU0IjinGD5/GCk2dFKdwO4X9hCwh37pTIL4Rdt0nCwrzP\nVmWGzinYuouwnMJhmbGiO1LVQADsayX0qDuWv778m9PsNIR9b9O8twVqOU/M\nwvaqOAbEvTl6UK8+174YqK2g/PoOtwV5lrm0XIhXRyfmTIg+ulyAvTZuQXaA\nMQ9dit2Brj7kURxjSlFEDYszHTbf4eIhfh2jiOpN1SREtAWPv17s6bIYurMK\nZfe/+7kX8kIYcuNWwKNgtwqsyOXWoX6SmPQ5OImNlLGdsni4c5YIetLFOdQN\n+G2iX9S3fsoOes4JkPeoVzH2kNW5N7MdfcRRK+sbDIDhA6GEbHsOkHehu//6\nEGl23IlGnxk9WXXHiDm/H062peD4NYjzKCGpk4Is33V626n/DWT8a/OZb+6t\n9mqi1KZJjZBmrkYQQagaCH2o7dfm2n13dnbiV1qQs2M1+pXAcx3Ui6ZDG8jY\nE21K\r\n=zRaY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"5f585687b43ec672958fae15b08163b35cfbda90","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.3.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.3.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.0.1_1585319349215_0.08489303909831847","host":"s3://npm-registry-packages"}},"2.1.0-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"d8bd2f2170b7bdab622fa637074dc2d9620271c1","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.0.tgz","fileCount":4,"integrity":"sha512-ddI+ei7CB1ma0OjeyTC7yxlgg0ou3aDwn5AU5CE4XPgg6tUEXE+pUIjTrRqkzcF0uERcA5rxjHBHoCmUP4X3LQ==","signatures":[{"sig":"MEYCIQCz9tzDTb2hzTHYbbcRiCXv7JAHk8j7OSAvOnNgWgblAwIhAOOfYHF4rxblr5w2SDvWpYBY6hD7BhS4ZQ6GJgeOYC+a","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":5936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJegg+iCRA9TVsSAnZWagAAKBsQAIoEugC3dGIA5h7yQMiR\nXZsIL/y2iP56VHQqu/ArdLAFB7VwiY7G6SlZbW6BKz4z6cOAJg/Xp0iNuUJR\nCW1BRACG+AuL2F+btC5bSok89PdLu9eU4DOCeWm3zMj4bYdLdef+yTqxy0ZC\nCox8WLDbDB+fipf1kJCReVjggbZn6B+RUvh2YK5fvlEZPJ9ZT06JFMsiV+Em\nDZRWBX+utODB2Affb06RWCXtLNZniWdV8NobssLvGAkBeGSxEC56U7JO9Pwb\nnWxoz5VCo/vFPw0k1OjychCLFM4Kq9C6BqpGeaGgmBHUS5p1933j1DKgCUi1\n0T7Urfbuk2OG3eE0CrkbpURVjadKm3ZHGZj5Lb6RJoh6IcZ1URrqXfqTm5wK\ndCzayucSWO4u9SojESRwnGEYly6YcVNY8Y8s71enw8ZFlu8L2KT0/RNVmI8c\nAEqAXIz/8fy2hnJ9cm4/C2JfBY018h+qk+D3OrYjnD9NCVjuscYofKMwagbd\n49lk9tKpLqlT3tsJGF3A0ZpBeG541exVuRfGfIiMI+J5zb8ALrhU7vUwCdgd\nIte4D2CWepKuSAcY87woUEXMtMX4aP35Z2OfAqXmk21GG1jlY8Jsgo76lLvm\nBinldvHjMm3tEvFLToq2/tGW49LBum1U5GJjl2lEpzGrbAaaaf3EqFPDJHqU\naV3D\r\n=aMVT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n\n### Using webpack to bundle dual channel react component occurs errors\n\nYou can adopt Option 2 described in https://github.com/twreporter/dual-channel#import-react-component\n\nIn addition, you can add `target: 'node'` in your webpack config. (See https://webpack.js.org/concepts/targets/#usage)\nAdding `target: 'node'` prevents webpack from bundling nodejs built-in modules.\n","gitHead":"154b6d7c7dbed360d58316a7e3717547cb883fb6","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.3.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.3.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.0_1585581986205_0.43163514431641503","host":"s3://npm-registry-packages"}},"2.1.0-rc.1":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"33b7867607ab4a92ffbc091ca28b7b1ff9f9fa4a","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.1.tgz","fileCount":4,"integrity":"sha512-jKq5K0cM7rMfdaosVjsUlz0tRHHxPcE9XEfyXFGk01IiwfCV3eyIdBY+Pp33JIztqrUfXse/OQnpLoOoHyta7w==","signatures":[{"sig":"MEYCIQD3mHNNovUmsNZrEMLV8eJdNCXFh7H+4c01tu+cqAFR/AIhAOgYR+dIFth5o7rA3cauSIyKNTqf36ac10+Ce8T7rBjd","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJegxRWCRA9TVsSAnZWagAAU6cP/A0/MCpN1q1XMttR9CDI\nS+sd56K5Is9eLSvyQHv8vSXv3EI5duJ36iIi2UBPobXd0qdImSRchrlooGUl\nf47J6YizJjQ7ZgaV3/4g0xs2Ru7WR9RzIJZHQlXo/Dc/eR1X4msg/bWKMx+Z\nWyPQdRDYP8zpepgDg8sqY6zN/db+BhIyfMFDQR3JpvJ/kuBoNhN6joFAanWW\n6/hQ5jINR1Rd6D0Qmg4datNIZXa/MxhO8Hq/p8OBw+mbW5W8KEe/GDJWlGc6\n4MKaivrzmnds7rA1kxOZ43FOxDYhKkWuIN5/KfDk6158NLQoRGWI/JhdH6/L\n7RpzeRnK8w9LseA3YA3S/PH8f0HYu8scSu3rMgP3gxuxNWKykhiFQ7yXkSYD\nRh2AJ+VFM6uWFERGvqYfUZvdvZudHoOGlUS+lVUHP0egBgiKHulJ8UfqHfCw\nyfUko1KbWjUodHf//Hd+ZCXr3UpLHelU2MyeVzSbM6BktBloqacZ333RlQP5\nsQDQ9UnJoDEk6q4pVW9IgITeo1a3yXbprwSh+GPVPD2NKKdxcETlg2Tvs+B0\nlQ0asS5IeIf5A6eI0LaBhnQX8m4PhrtKQO0Aa1t/tTaZsVORt7RjnIVGc1Vd\nC5iByYA7bMDf4p84EjkXI6xha1ofOAOqPBRTsAPS/Fl5RG+p5yY5eoPDWuo1\nEUxC\r\n=lWsr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n\n### Using webpack to bundle dual channel react component occurs errors\n\nYou can adopt Option 2 described in https://github.com/twreporter/dual-channel#import-react-component\n\nIn addition, you can add `target: 'node'` in your webpack config. (See https://webpack.js.org/concepts/targets/#usage)\nAdding `target: 'node'` prevents webpack from bundling nodejs built-in modules.\n","gitHead":"2103867aa94e3a0d1a9a8b26d2ce736b4b495fc9","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.1_1585648726081_0.5469621844871453","host":"s3://npm-registry-packages"}},"2.1.0-rc.2":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"12c2dc2dbe53e5651bafb264e0093f247e852971","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.2.tgz","fileCount":40,"integrity":"sha512-dW3qHjGlLurZC9p6swiFt1bvuU8rJekDCMYnsRo4Wau94sey3Gn0pZvD9rKCtyCblyrgSQ4qTU5IiHdbj39C+Q==","signatures":[{"sig":"MEUCIQCLMZvW+jGk4Jk3YwsAIHaed2PwwV8k5t5lHf+55SjhsAIgYHkU85dLmkGFpUVajuJnWCSALqAaQTKLEE/MoDCTkos=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":491312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJehEQFCRA9TVsSAnZWagAAF0MP/0PSAJglWv+S/vKkltc5\nXQTXWJcSwWRGv+jzc3VR+stfJ9ARiRKO5DELqpwPFUDHGdFifD5bUDKkQXBw\nU0SRVvdAIzOjPVYjCLOvHtmAd9VPzUqfT/vvGu3EA6XKq0TamZQY/CGMIQj/\nOTCWj4SQ4VSmJW7QrAAyo/ZYcCdjopJ6q3s7ApIMbDAY3csZRkJyvh8sZEgJ\nlrtghQVXwRYxIs5mV0UvwbaeZbqiwwCabwQ1xeM/6zRg3bRplvlGBZR5jFT1\nM/lmkUirMlwBHYIaKYxBH1aeFS79ODLy8YatNjJ70S2h+tJpZTMZSdxBAYH7\nUfVn54sEUn5IHVGzrd1kvInqLvi9ZKozLqcjxd5deYDFyR2k5eqTYRMFA7ev\nRvl5iUgmNRw90eXuF8lRjQpBwXabCuKLjhco6JZ0PAMpIegvPYKuwb+zeCDn\ni6qnjtIM3qxKV1nySd4t/ktjRAOqw/CpVW9QPbJDNOzSh8YQbaFK9f/WtyaN\nSIavKEQGA04i7FUf1hI7XIjPFrPfnyjL3x3jzE5+EhB0i8VsUGMcJUAlh11i\nLPSiMjnqpiKadeAOeCbGAy7MHwJwL8MMoI5yHKgd/FJ7gfy1Bmiag0ZKYe0n\nNCD2YNljQEPgviFonRhwj82eFp10VFdeJWEAMBcJX39li/EYML1cOLyD+qsG\n7dOw\r\n=AtzR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n\n### Using webpack to bundle dual channel react component occurs errors\n\nYou can adopt Option 2 described in https://github.com/twreporter/dual-channel#import-react-component\n\nIn addition, you can add `target: 'node'` in your webpack config. (See https://webpack.js.org/concepts/targets/#usage)\nAdding `target: 'node'` prevents webpack from bundling nodejs built-in modules.\n","gitHead":"e2d13c4e710f003c8223e310f37e0ba7aa57e52a","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server","prepublishOnly":"make build"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.2_1585726469299_0.5490504699788299","host":"s3://npm-registry-packages"}},"2.1.0-rc.3":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.3","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.3","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"567aa80b0f077759f5f99ce02b85434e0a4ee948","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.3.tgz","fileCount":40,"integrity":"sha512-eeRHFuRBwhKIyo6h3CT1mbQGtAA4xTmqm+AvADilZNDoeDHMy0RqFJaYzV3hSeJRWW3Ylb5IIshhRK+uOsf+dQ==","signatures":[{"sig":"MEYCIQDbZ7CTA5YdsS3uEYnjE+LhsUDuiPWphmphO6QPy+JjIAIhALVCf5zkBkP7d7iw4uBT/8WQDNgBRVpBtzsZhWMz/Btp","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":491547,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJehHPXCRA9TVsSAnZWagAA0a4P+gOhvMPNwp/G3oVCtmcc\nHhuoj+0pkSZGt1cdRCu2Ot/ET+sW/n6B4eRQjKN+NDsQW+azzbD0rDkBYRGN\noDonk2DiIgePJprzBbRoTrc/2gkuSpF7I6Swq/XQh3xY13lIfA5ITXg+ufMS\nUr7bUwZHFz+mAbJkYXQHSA+fSMuJNAHYiRWPqTwGedNzIMQtQRoVXsXrr6IV\n9uvciUq/YfJSxKPfb78VvbQVsIJ2KoRA257sxjDtd8GxT++ANZz/WMRQeOZX\nAahEv0YuLWrTEgJfubd8BbqLPuwuM4uZYcbHZmEO2+l6aGsiaFHW99HHJS3o\n9Ii+tnWq7iYvHSI0I2hdGNfG3Hix9MCkCpIA23T9OR+4LXV5bTrjol3HbR03\n06KhrDJGp4qvg7S4FQJS7nbsik0xTAH9YxPuLWKI43vpw/IecdBXGjZINWTC\nIvJaJVlh1j+sWs22LF6fTlKXSuezdhgsZF05QzGgesWKznAFgAEr+uof/two\nuXWdFQh3Or7zmUf0Dg88uEkhgMlXYZGakLFcIh3zp0rzWf8iIiweIlnEjowP\nfXNEDiH9twWvz8+IXl+T6r4dkP4Cy9gOgaI2FXxmBi4SmtDPEONQyHO/Bu6r\nxhtIfJSylEN1wKq580Q8mnHzjFB/NzH3EKeLeUExc5bvhL+f8Twxx77UT3lR\neObv\r\n=+TuN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n\n### Using webpack to bundle dual channel react component occurs errors\n\nYou can adopt Option 2 described in https://github.com/twreporter/dual-channel#import-react-component\n\nIn addition, you can add `target: 'node'` in your webpack config. (See https://webpack.js.org/concepts/targets/#usage)\nAdding `target: 'node'` prevents webpack from bundling nodejs built-in modules.\n","gitHead":"0f8364f1bb3412a1ad60e43403fe8b364ef7afe0","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server","prepublishOnly":"make build"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.3_1585738711188_0.0851462133076819","host":"s3://npm-registry-packages"}},"2.1.0-rc.4":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.4","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.4","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"1120c7c92ec12969563769d4d0b2cf26d267c7f0","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.4.tgz","fileCount":40,"integrity":"sha512-MATQURFihEh/IzyyPdAlHBCO1GGIBVX7pv+vmJQPGpvd0cKN96auMUZXAN0F0xiFnxFooBhosXjMpKnK6DRz4g==","signatures":[{"sig":"MEUCIE0p7ok6rPJIDgDJ/nz1ZbtatOVAdVV3/p2Ovf289oj9AiEAgOEpil8jIPF062RVhwokJD2mf0sEzIPpMiCmJQtF078=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":491742,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejFupCRA9TVsSAnZWagAAgDEP/jCoL/+dGgjxd5iEYZKS\nXdKJn+ko6rpbnDpmGaezIGyK9Q6EKl11MtB9YYCwrszV+sJGKH81pZk64Z42\nUiQYwNB/c6itH/pw4Zh1kwyRDo0LTTaAS6MY52Qi9/acXkNEJtRQjdKUAlfy\n4L5tFa77ydRZKXrpNPToSXRuzwK01u3m8TKKsBB4eHLt+0u9x2NJNq7Kfcac\n0T2M10aXtZfgO75Hfs8tcUHS3j1Urg9QJkoPb8+s/3S3nRa5B/+4qB61qF2o\nJtnUO1qd5lbPFPk0JYJnJr5GsTyVJP5Svfbe+HyzpVmO6V7ebuFTZjzFASSz\nfkU21CphS4qx/jpB2Vpka+AuMkxNCrG7CTEuIGI4nvGpBWreD0jPRdKCmPSf\nQQrO9/WbHZB5sek58pP1WiCng2IbFUlnoirGIuZy/BSYz1yZ7MqEJ6rryVgg\n5emCuIR4Gku93C72DjJAI329SsYjJJ0n2tk3WV1+xjoL+3cL6fDj/CqGV4aL\nWLfMDn5ZeMH2JKgAS3epdPlqnk8JnFnQJI1+zbJZDHN9PAzA3d+68leAQKIY\n3jf4Z0FQzDo6PpJN9O2YfH93GrVtstFl4PALJD/qNjAA7TIRq1dQnIUaoVib\nCNJUym0Nqt6GKONmeVfU58aBe0TydFjuFLn8g5d6mJlEFfV0OlffNW4h7zZN\n1hEh\r\n=8Es6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n\n### Using webpack to bundle dual channel react component occurs errors\n\nYou can adopt Option 2 described in https://github.com/twreporter/dual-channel#import-react-component\n\nIn addition, you can add `target: 'node'` in your webpack config. (See https://webpack.js.org/concepts/targets/#usage)\nAdding `target: 'node'` prevents webpack from bundling nodejs built-in modules.\n","gitHead":"e11d5de28cf93869ad3909924e7606f761791f45","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.4_1586256809027_0.6206955265430751","host":"s3://npm-registry-packages"}},"2.1.0-rc.5":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.5","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.5","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"1011edc2ff9956d1dd8dfb6c211b4f8c646a9d0e","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.5.tgz","fileCount":40,"integrity":"sha512-frpM66lif1s+HImRr1mAHUXLDP7oKfWFsM512Ao8lCsLdeeSxvyAl62pT7fJe7/JAcJuWRGozvLZ1Ae2ncJM4w==","signatures":[{"sig":"MEQCIALtfm51tfF6+Q2EuSnVi99bViLBIsl1mTZckMMGULP/AiAVOl0IJOWmdVxAzIm44oJZood/LK8YbzPVsuPriIMzRQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":491911,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJejW+wCRA9TVsSAnZWagAAfTIQAJRMdhO3wyLk7YlSanA0\nQZlaPceBNfEvUEeM3owOdyW90P7YTJIb6MmRB96hwEiViLhujhX14VhjsA/S\nwZP7KYnGN1dmuf/JGj57I60Tlw1XK8zkv2gCtVamRVhC5KLsHQQPcRnu7/8a\nerG6Wp3zV+Nb+hPDaKrLA4f1T0vRRy/pFtJoiJqt0C3cr0mU1yai9ZtBTVLX\nq3t2Ujw52gh13gvCEsgqKhIvuEtdIwspmbhHN6R+j7kxULGYfbkkUtcEfDls\ngOsYQcbWWjbSR36QtjfZ6wQBIWD3wl0UsZ/DZFJHdi/tyZ0ulABPjWzZONxF\ndqqJpt6z9XgD3uVxtw/xkYSTozf5i2ajkM2S2ogPuXoFzH9qUCocoeUniQpV\nHhVtAJJngTI/clQoC3thmrH/P+DCCekdpEhcsSR3lRdmO6rkplcywJgIjJwa\nAE2wNLz6TTmWfP67EOuTgtIAGQ9ad3QgGRpU/UU5bpPW6nwLO2WBT0w/AbDb\ngikKi82iodEk4kE5BI5iD42aTQbjzRk6RrobWFwQMHy2GPvK+lVA773yKDRD\n2MSQJmMa829Ni+l7unWA0t/R13rHRGNpYarvH254WUVvgsE0GMhdxCG1WkxM\nxknomwP7czmxtlVPaLCARhH3nPCaAe4D7p4A21BJsnceqeK7y57UfVLrqkkv\nvpQj\r\n=BSah\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"c77e22d5875d7c534b79c96a9c075fea5bbeaf11","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","@babel/polyfill":"^7.8.7","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.5_1586327471746_0.9211357883741105","host":"s3://npm-registry-packages"}},"2.1.0-rc.6":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.6","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.6","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"3ad66f962cf8476d39130a9cc7e9a0dc6337d9a4","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.6.tgz","fileCount":40,"integrity":"sha512-09kjIbIrp7Ukpp3dS5xPcFGe85iMMza9yqNl/yYQRYuT2j1cu/Qb3bqieaROZYixyZ+SQ6cAsDmfyPYOmN1kag==","signatures":[{"sig":"MEUCIBeDPDL51Ha5cRTYNPQ9bOa/DBB4bHZpDhS4XW1gcOIVAiEA/8E8TpAKwDLtitK/zyd/pTbbdJKwoGTjd95hg8JL0rY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":458587,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJekDhMCRA9TVsSAnZWagAAtSYQAJAeKCr5fAN9PShpNLE1\n7n+oKsK56IANIG+TUE3/xETs/kVVADVDCXit12/M+MLiQ18uD/s/fOZAWZ9Y\nNFopqJ6FEnO67jp84zgVqnMFcvqcyLF8zP/dZmvIRdM6/4LxoUbVL7Rk8az1\nA+2piu/wuJ0JHrs6nD5Zd9GZNARZFtu7MiozezeOLNE8Yf/5EWVQjZvJ3beC\nifqTa5qrJC0Ed8ULlC2nCBjUe3U31dPAAgsfd5QsykTMEI7D+07g5vpM9ZCA\n+6+czQ4oIHcTBdpIIOxtBYE8oNRucTnJt9GkxdFGSPOZkx/1RetH8suzda5A\nzEIqotpOHektMMJJUoxBW/SNXPTjsVsmdHk/AIpCAjjsQL6y6F7ZKCwebp3g\nIbCb8SHQAx2dUOiefenSgwJhC/iajE8kHaZ6V0+Ywp19edbPwhAPhdpt3fMW\n/GBFpP6hF1BdacpNOvzmi4i9icnOciTBySa5wQ7hm1P8ApOyxCdxtp7LvdN4\ngOG5dIjO42QGnNGawUherpkuP3/w+bt9ikPw5qjTwMi383pHSCaecludurzy\npWab4XNaFVKTBjlBkAkopMX7edP5kfBRife0GA1oLSV5EUNcg4k8dBRChIOb\nVBnjNd0lRrme81oUsNuMPNZqusrhmuolMn2C9FBp0R2ew97eGeJ4shYSh9sF\n+IQP\r\n=TJvW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"86ec7cd7b3482769505ee0ae14fec78de03d83dd","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.6_1586509900392_0.985802919451136","host":"s3://npm-registry-packages"}},"2.1.0-rc.7":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.7","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.7","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"47d1d6ff916f3339a9ffde9e415a33668558e276","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.7.tgz","fileCount":40,"integrity":"sha512-9YbZQbR2FiibHJWflrxa5wwWneLKiugf5upUEXO/bBlXIxNQPp85WKHPPSUubV+Xzz4jCwFyR9yMgh81lf/ZxQ==","signatures":[{"sig":"MEUCIQDRv/7rZbnQAF7XqTtVH4ziE34dQ7f/AAc6o4+2ky5zyAIgWQqRfZvcj0kfezKlcZEJHoEtOj9qHza2bscS6R2tZPs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":459238,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJekIGOCRA9TVsSAnZWagAAtT8P+wStAmA8cZjtywcApPS0\nsPLgTYgbYtZCLdZWJ3ducriGsqUwo9bo78Gp8AB1L+D0KlaDAvqzdLY4a4Lr\nikaJPLXHtMH6OAi1U8G/scpQpZykkX/2lPrYkZNqTdbRvGJSQyaOhZWozOLM\nHytGfx1WDYNLSofNxZplSbfYGg6+y08Bw8HdOMRMr3fPi73B1K7xDoi5XSrR\nB973wERS0eOAA/qjqp+MHyX1D2Yg+ZoCDIUm+ci2HPMW0wg+gm4DC+vi3gmn\nRtUZHIbmB9A68amYRPFZcKMjTG2xjzl7SjmSL18+hxiV6Kw7fuIs3AFz0sQC\nq5RoFF6metVhU1IHyyWZuezl/qnQptw4i5Cjj+bt7arkum33YPs2y+NwbGa3\nWdsn+KGUqR8oc6u67nbobIzmQk/Su/noW8M0W5J8we0MciyTcn7vG6m+wAzU\nArimzhPJ2A95DwdqXOcr/WI8jg0cuTAtx30rOpnoD8VXtsHc0tzw4H6sWcEU\nY1bdqb7gRSsrkbddZLHrtXrCU6VNUnU5DSCTAbpZzJ9GCQRnX6Ii3eokDVu5\n1AIkd/JxU86b4XWZlQPMrvA1OtLd5qqmu520mL48I56deN0JHCv4KrWLjFXk\nKgsRbsuWrjkgYfFpINp1auTBf5bDkAsw+Z8ATN0SKmfjimQUlFfGA6X1up8b\nEdLV\r\n=/Fam\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"eef06c95fbe94ca2f549a56395c46c9825fa45cd","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.7_1586528653945_0.35985086701203994","host":"s3://npm-registry-packages"}},"2.1.0-rc.8":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.8","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.8","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"8a2144963feebebcad2f83b888f29f6fae9b5026","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.8.tgz","fileCount":40,"integrity":"sha512-uO0QTAmLe69l+uSk3xJCIRyBj0KLNuVUUvrmq412/fYvZpPP50opOmuKg45YD8IqjDXSiPxQKxTWDSAwYABEwg==","signatures":[{"sig":"MEQCIFwrUedGnxVPcjTMC9MGGMEqORXs3wU37BYnYmpqGWjbAiAe9ggsftIKButavsYnbe7N+c1Kw0Gucw/iwulE0p1b6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":459469,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemAkXCRA9TVsSAnZWagAAINEQAJHDlTR/8ivM2MXzD3ML\nNtXj2x722qE9l2RCOdG9oxGu8Xj9JJ154N2RCGSOm3TB9GChWj5omO/0wVz9\njj4ecUOAFcOvSq6PnfAP++HpY/413dheEh8XUG2DX6Z4TaGW4zvioowfQKkC\nfKmPKl7xYPaGolSBCRs/dwrp1kI0V4uE3TNkPLJGAtK2hlCi1QSo6GWp3yXP\nmRFySQsw4fPKiFo9i1k8rZmMDbSScH0872aoZi+txwVpXRaxJ4jXfkU8gWsO\nLH9+j/e+d79l9I9GY1jf06W3gdA5Mn/Nvu2qSaaB5z2vz9HM9AKgmgXSuHT5\nxH6F0TdNtR4uFq1jxD360TcyB7nIsYVXn6q4ufit+BlK6o/voCaVX1ZcgFy8\na96AeG3ldM058VF4ps98lZijfkTU/8EMaxrobm6HsJdATH0GzohfEVnIl/Q1\nCP8v47Dl5UFC14pQEXzqg4Rt+wUg0QcV1cED47UUimSrf9ANTXi2QgROcw5B\nLVWDFhQ/0CK59t2q1ECTkO0zh9i33U/B+/r5FyKy8nS8FX2kRq6dQ+Wbd0B8\nd1a0PamQURooj/mpDsGiztaBtoN1sZ1LJ1EsfbAUActleRayN0D50o8/L1yN\neNs2g8fbXDZXSX5CTa+4b48sEBqZdDQKXM0+QtP0wJTgC7UHmKL0eYNF/e0r\ndWWA\r\n=tvRl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"72593e659f33b76b66ba4582015473ddbe4eb079","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.8_1587022102442_0.2943821633059651","host":"s3://npm-registry-packages"}},"2.1.0-rc.9":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.9","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.9","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"dbed822731353b2461f08641adad184083c1971b","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.9.tgz","fileCount":40,"integrity":"sha512-NW/4PVxE1acH1kxCVCWhxIZrHO842zvSHpjvGyhP3WW3kovgHM4LPOfVczJ980pwjBPLJue+gGd9C0a7fIGnTA==","signatures":[{"sig":"MEUCIQDH9TexKWMOkJmmQZKcPbShwms/jiJ9IOSSqJhn2QhYGgIgXYsQLAxb1q+/K+VnGVObN4BXCRIkbi6zbyw7m01B8Xw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":461461,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJex6dbCRA9TVsSAnZWagAAhjIP/RyDVePo7erc/HgvOTCa\nPqlThit0+sjyJlOLt1xnBp7ToOxKqo9wMqhLbjM4zKWyRlgD/nCC8jP69RaC\noJ6cWZG8jba5cJweqiVsfUkySupMm4mA5K/iZpmA3lbBLqIL7blmUETNOqj3\nc2NdjAeP+9U1A1iEEROHt+AOvg1oF2afsmEvVwU8sCpVZScE2gQ77x+CL9PB\nObws8wktHcwo/4jRT7akNu2ex7kwxA4kEDRpGTHfiOFyBIkZMJAx6VdkmIWG\nYBCY5T4q3/5dLimQ5U4iMtqCwxuMzwLC70tGSlJ+Gll0d1s4RjTi7fCy/lW9\ngrJHrLdh0MaMQK1ZlGg8k4kvuCAZnRJwbtlJb460JQtZqmJv+Vn7kurWAdNb\nRcDysOI2GQXGjNYXG7UymE72/6i8AqMvVZMjCJNWY1kmMxkvzAx1p3KCgsUf\nlb3lgNzyneo3IN+/3cjuzDHXpSaCItchUe0J63Rwi1MnQwfNvELX/S1Wl33B\n7whWb1b9zRCmnXBNqxTMmL6HbULZ2FfW8KHEZCpigRyHGkAg3A6eZG1AjPxR\npPqGlHumvKIzDyzhqx66RSC9zIyubJbszmcq4YsnV6SsSMFFzgrERL6agyrI\nZNwGZ0upUGwGLKo9rzC0YyYhlb0C8VNVh82AEVs97q6r/kyR7EPEwgWiqX1A\ncQ0r\r\n=8Rya\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"9dc6ae0aa4fb71d31c2012ebcdc8b7479920bd42","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.9_1590142811486_0.05000825030431377","host":"s3://npm-registry-packages"}},"2.1.0-rc.10":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.10","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.10","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"dcc5ff38511d1ebb090fdffbb6a2d799f6223fa0","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.10.tgz","fileCount":40,"integrity":"sha512-nrf25UtrTRTYhBVw2773hMuARgB6yqTsPVG8Y7L9LLpjjISuGrNESPUNUZRUt/X7WegrUR8mWaqAwmiEPm+K+Q==","signatures":[{"sig":"MEQCIEhIjqy8XU0PnLB99oZvnQbr7Ai2gu6zR2NtHhxEK2ZhAiAMLEXZp07cXEvoNEB8HWoTIKGH0ujoIg+Y2gRS6lCMfA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":461696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJez6D4CRA9TVsSAnZWagAAeMgP/1pAK5O+WqR59COz50iW\nVDI1Vhj4TIt0bw3dtKKv4rQoofBcWSaQXjOaLqdYSYXjgKZwOL+zUsNdRqid\n2gIu3ZOD5vMnhZgWAcO2xpvFMzNbt1ornNDWVMP/INwU3QXuQEWuiUWeZXv8\n742wSbaaf/EXgEu3A3kV5pj4Wg2NNEPkpeWt2FiSStzOngB6lrKYQ2ZuOK1e\nedw9EAlZS69wLn58ypGXWZhtxmvof54qn1xiUtKFzilknU3jxfmZCWvJGF/b\ntpeLfzGN38nlhuMXSLHWgm/emjzGUoNOwa1wIkNOHerw/HsT9/+m4lq1eDWE\nbBl+9rsGONl30n3iZ/a/jCAhYe7NoWpXHk9sNSZY2Rz4CkkDO4aU2+Rk6R41\nWk9gb7XJTGeFNRGSDFKhe0gf+Zd+nsUdrKGyfgQmn3SMlC7/YMbMtUkDs5O6\nhJIT9JbJ9Mm1Ejvy+A42sSNY7RRZSU7r/mn7nPW6c2GbWdayl+WK7HTReZbs\nmME9K4X2OsW/r0ee/Afb5CaUjhNDHL68b4grJonGxkzGBBzmujCRR0huknOm\nG4Jq8WJDoEhh+JqbzkBeGRqKELOyllPIJfafHX8ck2g/2EjGSsNuXiczQny8\nfeprOKxVV7fvgKo2k+BUcrzWlRHfOzyUfiy2PsIa9MFXVdSr/FEWXKQpycWb\nXCyU\r\n=GacZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"fb480edc67ea47b9b98814d379514ea73b050f84","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.10_1590665464173_0.09034842393383613","host":"s3://npm-registry-packages"}},"2.1.0-beta.1":{"name":"@twreporter/dual-channel","version":"2.1.0-beta.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-beta.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"1edb0e3c218c29dc1e15ff21970df9af3d7cebd5","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-beta.1.tgz","fileCount":40,"integrity":"sha512-CR46GSLGkRGOgqE+SldXban6V3hVzKxiPIgev8GuHDVNUSCui1Y+T3jxIWT+cXht+DQxeZz62ukPHXHpG/c4+Q==","signatures":[{"sig":"MEYCIQDlaxlZY5oiT531W0wovjntba3FwaYjp1IltG564/+mUQIhAPFpXAVllEXafzLlCNg9IVipRH45AY5zbYKdCORtTSJ5","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":470319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJez6D+CRA9TVsSAnZWagAAqvsQAIUIiX4PmzpM9yXrdPAp\nKm+XA99OLP72D+1TYM+pPQHIlXtLVp6eJKMfuiMXc2agzJMqXJ/d6mJ10vdg\nBMZea+ZUEra7jrp9lLLcxbP7LZBZBaoJfWkyZwAmtgcwNgu42P/nqi0oNAXh\nf3TZu31FuaNa6zI0BEWuENkRGvXQ8udTLaA0No68+t3Yk/HIhADSmt5tyCfk\nWbxeZobNFMtM2pjtksF3XcrPxqiCaPKWsVYcMbPsejM9h82+Y8ltJmosA0l8\njWEgeYIQLqV6CBqEzO+HCAA371UuOMGTPkVTL1LEOoakLEktwEYK7gkIxRNc\nWKTstRmHRCuPOWAoMYSIex9e5LkStv2cRJsm/SSYLkjbZNvMMy0PzWfLhoep\nN6EeSwqtWA0hs5xS5Jujikczfngu/LZR40wQS6xm60IVwaMWPEObPYYVm9oh\nofraB3PRtgZM/EidIgGdM5/eGGOUVSi2i93CiRlTbMwnS07DncK7Ex56Z/Ej\nof55IbbS3geh1kBr1z5AO0FYJ4etn5aO3Xsds6nx/11/ubhIAbjvNLwUg9BE\ntlvFtMJarkhuekQ9t8wTeKxPnBqX7Sn8ogPSDCKgasGuyuV8OVHbyUwfK23K\nT+feBQe2b1UZ1foRK9B4aSmjfuin+PZn9jAgJt4KXIonTU3wPHR1w+f1+jdI\nmKFI\r\n=Gu0s\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"yucj","email":"yucj@twreporter.org"},"_npmVersion":"6.11.3","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.17.0","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-beta.1_1590665470313_0.4127013147483545","host":"s3://npm-registry-packages"}},"2.1.0-beta.2":{"name":"@twreporter/dual-channel","version":"2.1.0-beta.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-beta.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"890e6a4fe3b4729678b89d1facaaad91c12429df","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-beta.2.tgz","fileCount":40,"integrity":"sha512-y+ltLUJBMOz+xbyexOTlkI7MrNOrMYTgc/cNp2zal9Js6pKgg02M14HGJ1mm0cvas/EEpAj31vfb61kf4PB60g==","signatures":[{"sig":"MEYCIQD8hfQT6MrTn0/KhOsV7JFh4aSFsr9tnLUFijXSgIfleQIhAL0A7pQOyoeExveWPUJF+ZHyn560rpfa0YtQh/0/2NTD","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":470321,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJez6NiCRA9TVsSAnZWagAAOPQP/ju+iQr2iJ32hKGOnlOx\n5D6h1XmWkYTLVupsqZzPk6OMHaMGQjF6gfAfkVsuFkWJrbrGrMPEXi55Lrxi\nGmUwOiFVi4vlCV3DjjacxCiMpQpztg2VTfj/JNtF7Cv1PwJ3io0PCYqd9Kyf\nUq0HjOWFMmco6a89RylOV1Dz78OmP8Je2vZfblstIl98/yXzyiglmR8QqNCM\nkqpLNEm7NKwBEd6VOmYCqk5t6shHpesCIPdeiFtqr5o0fc6P2wjsWwtTuMu6\nuT6l95EEsvDHe6z91bEpog0L/Ha1jJWLT9POLnanUo881rZ/c/CSkT9f3QyP\niUIm+ueFhd3AnRMzWYIweksO376jApEAH6K9i63TDgdNVymrinqJGB15H81F\nh6+K4cLNEeSQ59QNC8fwcW96Pos8hnAQJXT8R/F00tiegtY4LlF70oFbuyv7\n5oxceRRkGWkyJKP+57sOtv0hKWpmKQ9Vz2fVqQ6UxYmjwH/Wo1msVSrrhPXc\nLDbsw+G2TlfmT1KTvQbfXq9+hshTLCpnU/h2z1RsXGO3FUR/V3qDYHQLaT4m\n7b2Pl31CnEfb7xhhQDFIRGGhD3meYQ/4xsYsvjxoL6mQmWRIxqTla7QRtlbW\nCrPa1wC3sS4t8Ux5y2XhbG+/QDOY2zmcY9syiZr2gyEds6aaRGllKIkWioq9\n6tcZ\r\n=PLXx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"yucj","email":"yucj@twreporter.org"},"_npmVersion":"6.11.3","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.17.0","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-beta.2_1590666081515_0.6992778111765274","host":"s3://npm-registry-packages"}},"2.1.0-rc.11":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.11","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.11","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"061075b490ae96f27e83309a371389f000ae64cb","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.11.tgz","fileCount":41,"integrity":"sha512-cVFM8Zy2nfsfQ1b1B5EwzQGzZNz85NSPrUqIR7YAog2OTpvV2kd5NiPORkMxBLdbcSbD/18Ihfe/Yg+5G0OXgg==","signatures":[{"sig":"MEUCIQCQkLGz7+lEQ+MP60caqby/13hYc0x1cBPaQD+EwkMeIwIgbznOg2q0Zof8XjMxY7RbMJHcNvbFbfEE/7JFw6fyF7A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":473300,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe18VmCRA9TVsSAnZWagAAvv8P/2JKyF6jBsIL2RNv/pV1\nadiaSf7UT6pBZyXPGn9V2plUrubTL+OsbB7F4sEOD74UvLeYQaZQxZx+NUQQ\n2g/mAFsEohbMnI66oKLSDjXBn9a3w2ZJvYZAL+V9XVvCrgMQxFiFZqx94BGa\nruYNzmHmAx1AGvkM3gjBNqTgo7YcY/rxyyGz3towQZxe8nR64zsG1BYxczvk\nPj2plSREA6i4XRucv+hG4hcUokDZoGxudRfFaZAznCufO8oJETL+4eKnKGiG\nq0zdv5aMPadBLxk7H/INzOXPTZtAvUtP5dj6AQR+0oB0Bdd55+ClmMD0iW9U\nXf2dZ1UzpegtJbq+2VcW9wdW5GrwLomz3x+BIHk6/OCZMvFkmYVJjS5R1k/w\ncZNz8v4/gN0BsZa7At2ZT8hh0MfuK9zEaeJ+swEUOq0llB+pjjYV53Gcl2Tk\npIwxIxWwSnvfHjjM6l0y+9ety+fkX4YMRXX4fv96naFmF0WFnyvJuOIYYQyT\nQI+LTVKVlR+3kuPdCHr12/2Vf6rjRcyROFGNB2tkTluEGvOB/Vq9yRyUt9qo\nBmR7Im5y/USHEVdXin+R0rCzRsELr1mhtJtV4W1MBaBh0APiCDjlzWEhVYn+\n81mdxfmQ9m9o6qfMaNioCkgvWbvULGQHxMMEMHMSs7lLA8T0WQ5ufPEzpc/P\noEYy\r\n=RtRg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"bc3d466e242d28da2460cb3efcb4fff0bdcd1bcf","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.11_1591199078441_0.7658820835120441","host":"s3://npm-registry-packages"}},"2.1.0-rc.12":{"name":"@twreporter/dual-channel","version":"2.1.0-rc.12","license":"MIT","_id":"@twreporter/dual-channel@2.1.0-rc.12","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"6d8b3a6678339bcb9f90dc627f1e39028f273376","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0-rc.12.tgz","fileCount":41,"integrity":"sha512-kUUR7eHaKER2q68D6Av+t1jAyt7nuQZCXOM3Oj6j3aicOa+xO+rQiPfWkLlKL6YPulMAEWuL8gtfaw8A/IFZTQ==","signatures":[{"sig":"MEYCIQCYHZbmgriIBDriNDmsFhU62vMy7/HHnfIPtKyJWTaxnwIhANUQOqAMiBRFRbt/P/fNmOM0yMkP1BEHQzTH1KMTSTC1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":467864,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2HxzCRA9TVsSAnZWagAAgzoP/2pJqBRPnVInWPzyqn6S\nF6VqrdWwz10IcRtPaArGEIk5rce4M+q/8ICz8OCJdSxpBZOsfWibiij2BqG/\nlBUDDrL4UvKzYrvWYlw41fV6big1AqImwgkNC1OKTtxK41JN6eoqDQzrj+I2\nwHXVkrHpQiCMEjO/m1FIhjqNiBzeHdFaZ7piiqXowIQm4t7AIko/DykDHOZF\nFsp+cVQxthn7Yn7vzCF+/WxnQxagFFPFzPZestzvDEHz2SN/lN2TFhIiiVDW\nebQDly6iy5fruWgu7ySVkwKJnXht1g7FPB5K8W8dO8hj2KPmVP0GW+ZJe+vu\nAyPI4ndtmD7CT7EacIWyls6JKRrbAMtZpx/C/17WRUL/up8TS/d6NO+x3ptp\nH1JmGEdXjw/+z33UNsprGka1NPs0a9swUq7q/IP+JhfpfkbkRXrGoIV6cvQg\n/KsMJ82PHnBRrqbBdU3Zhb1u1SZ53U2G+Sj6uxHcUeqWXzGegv9Ia6yFkWRG\nH1j4BatLUFYf3zUyuvM9eaEZVaanhzqkd6X2ZdPZMIAuxSR1nT3WtXyLkrHy\nZLj2zAYEnm1khgOV6XajcbCSSRYLboSLtVBb8O/yVaEUBflfuPapU8yBXLe+\njSHsjI6vlEFNr3/5+vG1o9XK1chMXiUAmaepwX4QTyFuIeOeddHT2cG9ohLq\n+TZ+\r\n=Gu96\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"15eb3448da52c510f45cdcc9a479d75a995179ed","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0-rc.12_1591245939078_0.46786718159756235","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@twreporter/dual-channel","version":"2.1.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"dec03dbbb3e48cb3115b15c27150545bbb8b042e","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.0.tgz","fileCount":41,"integrity":"sha512-UfJueqI0gVn3MVsPOmVz8wD9Dv9T18hIXwfXHhFMs6AE5wUCnyFd/B/jGKN3KCHv290FWvgf5Wv3QpZaIeHkQw==","signatures":[{"sig":"MEUCIQD5Qkyfv5m49uJl6VF03NP9ub9ymTU0ix0qCM6J6bLlCwIgZbmBbe0mJZQaRJttoJMl4U71cScPASG7F/Xjq49LeqQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":468074,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2NoqCRA9TVsSAnZWagAA2JIP/jxm3nlr+FUP9ARR7Pk1\nThjK/WKeNcz4r5X2oXKQyIfxhH9WYeE3/TuG9ggrMHLLbn2p3q8Sjv8Nficd\nW2AaqBuV5UMaiG9k/PxSiGzjq7RpIz5+KFwjitBocBfMzYebGv45wju6A6mk\nETFUVcGCSsFahI72v2FZFeS9B1Bcty39/HOBLGELtKwyDs2HKwJOzIICHiqN\nagzFRnzAUmDjn0N6j9TBpaAVMGOekda9fy10P3zoAfLaZZFKP+2ZqvJd19+1\nBUx0Orjy9nfaR3ruyFP/7Fdt0PCDNAu4Dlcjk8bTr9gLD71jXkmxr3lg7C4L\nZhvlu6c4YpmCMKLd2V8O44vc1KNmgwy5QTI66A2E8U2fb5zoV5UMzIENrsxk\nvIEw1vDWffv2O9e3jP8po2LVtjJy/vWaxLkMPiOqx1GpcRP3iK72RSZdtcVR\nxvIv/kmkUE9ZkGX/55dwX8/xkymqVQYbqoDuaOm+PJaPahHLxyHsfkGyNE0A\nkHEvofz4V6R+wggLndEqsHFSbusaDbC2YTsVEhASDfxj/1UDQ1lRv8eL+ZZb\n6nTNrhb+ZLQRGFVfOOxxxp4s9MdUD5g5HCLRG7XXMxLu25sFPS+xvyd6t1oE\n4F8mTTUbNaGrV5u0h2JvrFaRZFQXyIDtJQ/dPJwM+r/ll0TDP3LKgUONph1I\nZVeK\r\n=8bti\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"6c10cb1f69e3aa0a8b54f9a0a11eb957995a9fa0","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.0_1591269929947_0.2039353992253301","host":"s3://npm-registry-packages"}},"2.1.1-beta.0":{"name":"@twreporter/dual-channel","version":"2.1.1-beta.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-beta.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"4e4a8d445212770f5cda2c9382f12aef295f73ae","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-beta.0.tgz","fileCount":40,"integrity":"sha512-oozJ5L0WXOiVC4frEEr/g/V93BcIBSfdNYNWC3PgWHhn7iA1CJ/+a5iWDTsPSmV1HDJ1uu9Ld7KmsPkMcgErlA==","signatures":[{"sig":"MEQCIBNmCuUtk9Q00udAS5zhOJFbFbMbCquL5EhfeOdhZkRKAiBFSpOz0jawycT2PLoDHMk/6F58hbZ/dW+RShhLLWM44w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":467206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe26bMCRA9TVsSAnZWagAA0TkP+gP7DDnNUWvDR37PYiYk\nIXpzSvpXNq1QbzxBMWu14zQI+1T5UJryEgahreHcPhg3VdWjHOBoEiabIDfg\nksDerDJOiiXmAl8pa8OChM1Vwjj5aY69/fQkOTT3DBgk4w9vIS1F8+CAvBGn\nztqwez7pRaydZ582ihINjlafPbFYmCW2CALYQxER0n/PbMNgRaSFMCQgBpYK\nZgFdmcDJyaSvc+f5AAJtR8PuKxo857cd4vqdK5YvL6kLwE2hUygO1ldFu1NJ\nZvq/nm3upAbNKx4N7/3nflm52xWzuIUCbzV6Um/uJzuiVhdqUu50Za6Z9kBT\ngK7nHojFBX8X8Qm57kjkp7sCcz/Ko86g0sv4GlYzbZrOy5nvwEAFYycPAxE0\n8YIQqAR+fZg+VnWeUKoYauA4XOvKCWvyfDovy8J4sxV48IMSXdJufd7YnQ8s\nA72Y4yRYEmfIb9dqM5pgBI4mNnrRBB3gAaPkJf6IiGSik65erqdVnb1WL/Li\nqjhQLpe5a3Fa117qMs34H9yV5WyPNf7bcob3mup+QLVQVfltb0vh+4H/SxE9\nKG5X5fFXJjmONSh3OQpw3758zO4sH+TNKRCRgknwKjqw6p054dgBl2o7MnsV\nhIsTx8eErhRiDMXloEb7PAWMIe1Ad7wxfHJxR/JHKDHG3R6fHaz6+vpLc6pt\nwBba\r\n=zMEO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-beta.0_1591453387468_0.9923115782495393","host":"s3://npm-registry-packages"}},"2.1.1-beta.1":{"name":"@twreporter/dual-channel","version":"2.1.1-beta.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-beta.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"f9b204bb95d92681a81b0b94a3561fcdde74133e","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-beta.1.tgz","fileCount":40,"integrity":"sha512-Us7ROk0NPJP25mucLgvzo7nqP13UrQDOaLEq14k3rNQ4xLLxgRrD4UIKakyqQynnTuFn7VTYIgZZ84yIdU1Y/Q==","signatures":[{"sig":"MEUCIEWd/w6xrjKcWYR9rMwfyzXr6J/e83xM1lXE/KmSshB3AiEA52aKZeTw7Y6RaJJJ/mZBCe0ghDeG/glqDCuTbsbvKUU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":467240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe26j9CRA9TVsSAnZWagAAQrkP/jLgfdSozqDw7ZIOVkgA\nDiXl7nW6vEPGzfmDaadEyIri1zcV3enkcJW2MJ/dfqJ5Efy3RM+ODOuAZlDa\nCPzclkGSl5jiCWJIxN6Ueb+vnAzwGwRitoWY6CIdFPclwc6gxRczThgzEye5\n+SixYIDJ3TKKiB3VPl6HzRXqJaCPA9Qa85rYV1vLIyHK00Gk4tFz8b4iSHGd\nrmtvn+NyRVVzjcm5Kfn/1CVZ8OYpZx66ftSJQjczdFdM4k7psPnZcvNj2rEs\n3GsmaP9rKRN3i0QKk4NtFeiubOm5nOw3aMQqugEFX0FNEA9iEanC96MhjezV\nlkL5DzyJZxc4bc1iglxHH/CRjpGiovyRYVYxoV51zVdQ9I4dyZDs1z12SodS\n9VLr+QDsXoINggM2q8Ygn0G1QFGjVzNGjCzEWThCwPqQMgHmFAsJY7ZVob3y\nF3/13x6Cq1LtiPIeW//5lH1xnYVWkYI1RgtOkiZgqXbkjqiDiRJLmb0Ttxrn\nwfSzpx8DR5aJFM4jiXfr3FOJt58bC51WWvTmP3hl40SKQSTMX0oksqeBoyoy\nJckSPwxaiqnJXFQuEOcBs71VHMMxbvjnyYPfR5YUJTwXbGf0c/rKzcOfQOxQ\n4J6Jkcwb4+1QgmCFUoRBXw7SZ0gh4NmkUqTN7JkEPhpYNzKI6duK6qAMyuNP\n/uEY\r\n=xkkt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-beta.1_1591453949436_0.6208659381449948","host":"s3://npm-registry-packages"}},"2.1.1-beta.2":{"name":"@twreporter/dual-channel","version":"2.1.1-beta.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-beta.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"88779c02a7601d49e66a6b23ad78c9b5f5f07a64","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-beta.2.tgz","fileCount":40,"integrity":"sha512-KMUuyQy8ymkP8EqMTdO3nQL/3bDlaxCK/pdS9zB6G1bQhChaIa1bXKEAS/doXc3Su6hv1kTJxfc7+SF9+r6MWw==","signatures":[{"sig":"MEUCIQCBXWqYl5SB2Y3j1ER5b8adtDqr67EP8z+45f+PMd4argIgYx/Y+mtRbZI05HwtyTbQW+t0MEN0m4Iac7UULwsU/W4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":467514,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe27IECRA9TVsSAnZWagAAa8YP/2nrzXGleFccOUnvoqAX\n4WXWj5jKRc56660Gur5/3AyMRJOzLzgmTHUaJQOCYROwjtWlIpQFLhBE4QZe\n4se09Nvodk9p8oz0WW/Anh1s5RuqwJEhMwlqRGGGPxOg3511C+LULhtYLzcq\nbDNJX9hS0hGyPsnHHLajd3Opt/uwhOQf8Yb1Oho7JoVaFdSIadyYqEPNSJh3\nlj8PW3SrZspun/O/1YOrygIxCyr0zp8YEVnj2jdcPJ1a5qOVXFP6A9uilL6K\n5GYILtnccaaHFM1eRfvO+EDPhjFkPGXzFDno3XI09tqFBXaVHpZIAshKuQpz\nsNUpOsQWCyDOgaLeNDC3JT9q3v5GrjkcnyotUXXliUhFDbO2WhvWq42Lw7+/\n5FgLmLZ720gL2IZVTYVHqwaecm3vcSifaytYqIMa8xT81zovRcf27sHAzVtA\nJgUAzS/mkRjpGvoYSh8XT/Zku+GUp9v9NDdJyp1gGdl4sgjq3QJW1yQyZnsT\n1bKWq4K2gFNaDb5k6Sn2zTruNTdfaV5S24gdrSpszhaxQ7CulRhRWiscef41\npRHHLg7WdcdXpnQhSkp+nvaYrUf4UVC8Y/hbBdX2jQLrENYWIYFsJLtTWGaz\nfUT8tTvY8HtzGCMJMbEFFsQw+Oh8mLGzy8Nd1Nrk2OHVEv/q+RRwFWqUVfJr\nhG1w\r\n=15NC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-beta.2_1591456259761_0.08780539346775496","host":"s3://npm-registry-packages"}},"2.1.1-beta.3":{"name":"@twreporter/dual-channel","version":"2.1.1-beta.3","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-beta.3","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"10ea48a3b5e219f86dfdb56af588e6eb2b285a71","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-beta.3.tgz","fileCount":40,"integrity":"sha512-0xSerj/zLpS7G6vkMovr4nPsJVxEyfG7TUIFKinqYB75P/fL6LmANKMxyPn/nQUd4hj7ybN4oEra6qIFmcp9kQ==","signatures":[{"sig":"MEUCIQDtV+U3VlMDndkoRWooxxOSYJ4qCQ8AbPwATza6rhYqFwIgWawbmcZ+3MoZXJ9Gc0B6k4FNmaUz8bRdksGkFw9Ibko=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":467514,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe27WICRA9TVsSAnZWagAAmUgP/2hrPUdrejJZ/J9jeBLo\nPefl1sO/7gPX738j56oacHv17cLel7AHHshMGApoUjtk1A/H3VclOtVQHW5i\n9wEskcmE0yPuBo63+OvHJeenyZ7Bf/pkZp3hPTM4QkPkJRTXyNohIyYB+b2n\nXZ+nY47HhPA9E+ZSNeXt7S9IaUjzdWy9VAHcb9unRr+95qHxC9Ka2Wni9C4A\nG8/EBETw4kWreP3yoG84ZsXQj8CgxWNMGTVclGCD+qk+Ch9ygcMi8lnF7pCh\nKaWhMilH/zvwOqtsDkxEUq5gpMlLb8KsAz/PNYa+zb2erFci+By93kD5xPkw\nm+vGoD1UftzNO1ZzwYu6xO6jrgTzNudGAtCdd+ytPWL+NZiQkyY1zH1IVdj3\ndfj6HZm4uTNhToNDdQxlpl7Fz7x9nZJhQHVOtsytVfOFCa+M9C+kYebQslCF\nycDcdsptN6buuN9kTWbeePSqOzYa9n8D72PXg/92HE4yJMcnVO/zIi3W/1fG\nKA/QM5nsT9sQ+9A78TTQXe0H27D5l3UAmnSB/FZzWhdtONLHcumdoMcyNmmG\nx+s9FZ279omZ64phathpaz6hUPn3U38zKHy6a2qDXcQitrgvkFLQ2Qetl5hh\nIfWE0mM9u82oW9E5kmqOxnmF2T26TUEecojUlr3SCaOzIosoerloahblbsct\nzAzL\r\n=DJOf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},"_npmVersion":"6.4.1","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-beta.3_1591457159929_0.6047469886475825","host":"s3://npm-registry-packages"}},"2.1.1-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.1-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-rc.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"e41f2b0ebc2be2184a22d48a0716a75bfdf67a7c","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-rc.0.tgz","fileCount":41,"integrity":"sha512-fyu9M41DaiZImGB1bYqDZbhDUti6YPKFmR7E1AHF7HDh48ZqZ5DEGj6ln7gm9cHt13pYA2bekx6r4yqsleVcBg==","signatures":[{"sig":"MEYCIQDoVhPavUHVhjP6utPDqI15teFwuowNKjzHDH/4LCzD+wIhAN54AO+xmFZoZwY73AEUV0MFDj82pMDMkqW5SyHg8/JJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":468655,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6JHZCRA9TVsSAnZWagAAbPkP/19Lu4mRdh0tfVxGGrck\nPQACNjU1Z1wmTv/XXPnLfy18zOSN9fXZEyeOMOjcPJ56YFDmk2BxIct7HiWU\nvVccj5z9ysZt6sk5pBCzrdgj0g12NTgj2nAs5EgyK6X4SL+qAIf3w0oKM0ET\n1zMoaAvlwhDO4gO4HIgyacU/sy5XMlfrPXpWhRaDyfgfAztn5lVuXqiWqf8q\n/21W89UGkUDI+mz3xCjr5SGRJFoVMg91TYQ6WeWA1T7eHwNNRARszdxUGElr\nuQ8tWEdXxKfCmAXw/OcJc0PsarrARXHoINeNU7rO3Qq+rJa89qKsUgpED4ir\n6QxG+Aja8bUPx7FbSehFNeJsif/qJYVmCMu5qD2e03XcUWifoNqYDpTvDWYs\nuE9TFrslBOYF/hqhWuPyuCdTH0BAGU7cLxDj4rEzlq54jJg1yQYU2QuJ4kCu\nlKMLbeWq8XeJIGBLeOBa03sYtb5ddO8T9yufmoPjSjmFK2tifNiW4aB3lNDN\n2Kiq9Gw8n1p6w0YYwBWbW8aT7MbXN2j/F4l6DFmSXGKkU+eLU9GdFF/hH0jV\nMqHJLZQ7uAYkDxuUGE498ZaV8ByHfqOYAJ2lyWsuQHNL9YCY25q/GBmjqUW3\n1oY1wU9R8KNFb+4RV8Mkit1EgZqctxBpQxggraGjKO28Ha/Gz4xN2U1A294z\ncGtV\r\n=KAfe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"99080cf1aeb37128071358c541e498e91a531841","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-rc.0_1592299992464_0.9587409293205844","host":"s3://npm-registry-packages"}},"2.1.1-rc.1":{"name":"@twreporter/dual-channel","version":"2.1.1-rc.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-rc.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"ee4266a47cd4037e6c3e51bed66c72d45ccffe28","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-rc.1.tgz","fileCount":41,"integrity":"sha512-VjcSdwKTbGC9B/paw1AColRmlyC2BYo28tCkfC5n3oa9QknUGhWVrRo+MOtvSSoyALCLrqeXtlRQW/i0T/0X3w==","signatures":[{"sig":"MEYCIQD6q2qcdSF68mqxY+nN+Y7rqpViY7Nil3aYteweL+1xugIhAM0cfqcJCrobDlG5fNCa48tiN8x/kCFnsl04FZX7/06S","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":469875,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6JnPCRA9TVsSAnZWagAAK4wP/0m3jwa2PauoFc7NiA0+\n0jBEK74rLUi0UOm/te46SNO+kcfB9CSJuRJj1nff7EpIr5DZRPdNwawUIUaZ\n3AAVVywLfSqwAtRwzUZgFtAiYY0VUYnX4ITPuMe1SgXQRLdnKhT/1A5ICUvQ\nAIJrgk9kvUYoyKuEIzRHlcGOvSp1yKnApQ4ubItTebAGDh1cYxpAB3G1gLvz\nVotbIXi/XLxQcUmsSL9N2c2bD8e0eJfc54S/2kJhfm3lw7W/BkoG/DeFrlcn\nMBTmZ9RUqrIaiBxIjmwBsjKFFDOMfhwOk0DE9njNNHhOqf/HE+pvrm6Eriep\n85nPNdILi7/CJQcAhuG6IVBqeiQ2N6QMmY6IhyNrKKIFrLRVoBPKdg9Q2+No\nnwtOuVsx566YH6+3JSTbAvu6oS4UpmIqsJ93+1Eju7cIr2uA6WGmTZ4jZHSs\noHQJUKUC3jVV70J8lAwirTDFmRhU1xTS8NMNvtrOYoTmS6bY4FB/flxUx/Rp\nVde8ELn8E2Nxg+UddUU2aTZ0qyPC57xUtOs0maGK6GgmJkJiXFU+MhCfS8v/\nd6PrvPdH9wq87XGLJL8qDP765oQVFcxA68BC7BHsFUR6ImGqe4j9yc0lNhYs\nPk2k4nxNKoZSoApUlm0Xh4C6/GpWOC/gylrMKxegFuaZbJxmVSbml1qTgGTN\n6U6K\r\n=h7Vg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"cd2341e03eae4092b3c339fa390c3b63874c5aee","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-rc.1_1592302031332_0.11867318418208805","host":"s3://npm-registry-packages"}},"2.1.1-rc.2":{"name":"@twreporter/dual-channel","version":"2.1.1-rc.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.1-rc.2","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"0a1320ea3a4fba2503e59e8cbac434d13113c22d","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1-rc.2.tgz","fileCount":41,"integrity":"sha512-8KB61GVnBXLw6xtkuG34301lmOaVCrdLl2/NlQ1umVKlguNofTRXXCZYJ6wXNDRjKeUjBwzj8NOynJ++4vblzg==","signatures":[{"sig":"MEUCIQDy1DnstbiR+oBIeF7iPYQw91RZsBlmZsEgWxUp0p/PpwIgaKYaZ3rnE2B7Aq3ye74wMSrmheYjHJT1LjM8uqv8/PQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":471603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/VOcCRA9TVsSAnZWagAA0r4P/jYVVU+sLM7FJWNTGUdZ\nRYb1f0+7kDziGSIDPDWI8BYcGV5Ohfg8BjGlpsDP5KVcFLsZS2InCkOIWA1T\nmwcFW6ht/g0X7UoUgIkii0xeg9saOdJluV1IN593nGASNZwMyugxv0Ym27Bk\nGZe6nGlbh5tKoJ96SCEtXWBaCY9KBf3WLQYlfG1lN7N6BlnH9fIwU02bigqv\nUeN+rZffHWwQa83eQFRndOhwwkSwtzlT5JlzPc0uCkXJR/abqPdLnHlBmmW0\nWbGLyhhKqIJJKn9K7fAx35yXEOQq0fA4H4L58oWqpXw+Qg5JqpBuu9gayc08\nMeExHaAhZFAz1u0tk80pm44mfTKXeytHsQJLZZaMV7YNDPhT7V9HmaKnHUjM\nzn9SQ2F2vV80VkcBlbSWmqfH61e4GYsrDU9Dnq41AEDe6W0aaPGO3IZ90dk4\nRjXFpXVugYmIeK0/E6aSpjwd5qzN2X7Qi/DxpVKQMbOe0mpUGDDS5Q6b10Y7\nLAosNR0XaWEm3sfW0ioZVfnhUZIIPY7l1m/WbYVed0pUgrVsshuCpRX+sk5o\nZl7VyEvUTnCp3Bzky0guN1MBSPTaIP66artDZHreR72JRayHIORX0XJ57X9/\nkus8ygQzl8WVW/wlZHXrgTBrtGRnljpAlz0NAozx5TBldI0l2fpP9gWbF0FN\nxGRj\r\n=axEr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"4494283b9710d656d7b41f0c6f4aa7dbf3255e9b","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1-rc.2_1593660315666_0.7458524553423265","host":"s3://npm-registry-packages"}},"2.1.1":{"name":"@twreporter/dual-channel","version":"2.1.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.1","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"64c6ed812516c4237dc1f8a58573baf348383f79","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.1.tgz","fileCount":40,"integrity":"sha512-pkoJRLcaZnNCPdIPdqZotW/YmQEUfhr8SBtEsVZKvrgxqHcxYZJPXaQq+ydi2rB7mvX7V1pcxJUdZ48kpZBa8Q==","signatures":[{"sig":"MEQCIFDCiLGRr1jR0xqH3TCbtBbqn+RG+bW67DMiqZ2rM7VqAiBoWCOg130G3VAhxLYOXz/xSC0R5JCFiEvLmtPD/dKKaw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":470840,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfECwfCRA9TVsSAnZWagAA4l4P/RpsOjltkn29rZtPe4fA\nmw2VJEgxIVpCMS2v2u3+j4+zmucgsvAHRMwbLgpB8qgzcSwvzfPaZPeIEfv+\no2Iks4ubXgHBD3NNQbjSXXh2wSLqoP4087XODTFCssbbFpthBd6adby1PsUu\nJGGv6PnVwlL53zHccl7EWAm1i9EeRx80oyLg08MucHIJJBnXIM1Q5ryrqAKH\n1q6cQIqzMJyZ2FIUcm3Eb1qO/ln4e9IFveDsU5O7XgduhqPel881tEX2i4Cl\nnWDVqch7ad7A9ziQEwv8jsrENwxgxks3cNkjfbFVTbHz4VqxNyV2FRYsv2Bp\nPH0JHBO7wWTFedpC3xpjrLDPW91HYjQxHwpr/kanUOCkKi/w6alOK0/dOSW8\nB5RZhnPFkpgfyoH0Nt1yDkaKHFYai4M4HdyZ0WmetH4jGhxCgGWsuvhY6166\nwR3LFhK2tyv8TvnEK4nbsgbhHvKvgjW5FHa8I7o8bsjHcgmujfLVHVZoSx+h\nC3Ls7BPVI/rZrAI1lGWT5pwBzXW2D2vaMNSsj4z+pwWRtZ+4Dka6LfsZPQkJ\nNpsohU4/BrGEuEqfEb9M62pd1I4ZjEIPvwq0loIkiuQBj9K3/oRX9VG/XOUW\nVCkhwLWly367n18+KaIt5Xe4v88iq5/AN4aKz1KgaVuENQgtbJJ1D+4NFWzY\nLZEv\r\n=k9Hj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"6.5.0","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"11.7.0","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.1_1594895390507_0.012931735180391923","host":"s3://npm-registry-packages"}},"2.1.2-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.2-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.2-rc.0","maintainers":[{"name":"babygoat","email":"babygoat1124@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"twreporter-admin","email":"twreporter25363030@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"}],"dist":{"shasum":"d3b2581945abb19e228dc7137f127ede889e0c7d","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2-rc.0.tgz","fileCount":41,"integrity":"sha512-hLzWSRRykDYR/KjngVgzGy2lbaNJj9ysK3fDLORS84YesX/oF7OXa6pWSAU962vBmEeFNRDvFOAK5Y/QnPcf0Q==","signatures":[{"sig":"MEQCIDQP+ioDROtkHKHlsFSjZsv0Tm7BdOJYUyGR6ETIq5SuAiBt25orVAIBoYRQbKYYr0tmE4PPrairS7RNUCmoyCSnGQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":472206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEDHyCRA9TVsSAnZWagAAlpsP/2RITU9MJj/IQC2HexFB\nkNjA7trNi/yVxj1XfEe51hvj7u4zcdweH5GQFXzbcb9vUcvo1wkIXyLyx0BJ\nBL9DLnrHIRUA2fjLFLUB4IIby7fT+vye6AfDp6IVx0OpHDzs/XkwfAzc5Rpf\nwHkCmsNB6WT2SqrPuDl2zCg99XO1Wr0wKvKwxjUwAoqgBfMc4fINujR2KJ3p\nlT0EDyVa+cRxTTHSVayN7dmPxTwAtt6kMjWX3kuolXVSuGHSxUMTFrRp7ZbO\ngvpg1mU3ABgP7VNZR0HeoxuSWyQS3qCVEh4k2Rm0gVApa25uceY8CBY6TdVb\na9l2MHe5y0HgNH1z1Aj8Y16hxx0LbxjibET78WkoSOtJWaEbOLCuNglN/qzb\njmE/vzRrqYen2A+sDo7ghkuKv9sFqivp5kHzp8h9vgr614rLWUvQ/JixSugr\nhEpM947ULqYhaFoW9hErvV5uW+TwC2ZIa/+kDMTZPJ2c6BJquJNqYGvytttW\nYk3JolwwWa2lZizgoKJTDq4UeHy5uIRQ6SCA2meOW7z9m3W48amXogiXlF73\n6M7jWJODlW365Hv57LHdDoSqJcumzvRXQLAZfU68sF9OoPgtpJthVa6OlmEO\nUGiIql3VDS4mfkmtHmm/SQP8BatPkx2fAsRHfGxxOVX+GymQLOfQa1VaYVOa\nsUi2\r\n=289A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"ec96c8188b88b9555d65bdfb31fa5a11e16b15de","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"taylrj","email":"stu005606@gmail.com"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2-rc.0_1594896882376_0.11639600736009759","host":"s3://npm-registry-packages"}},"2.1.2-rc.1":{"name":"@twreporter/dual-channel","version":"2.1.2-rc.1","license":"MIT","_id":"@twreporter/dual-channel@2.1.2-rc.1","maintainers":[{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"},{"name":"twreporter-admin","email":"developer@twreporter.org"}],"dist":{"shasum":"dba34bb5156b8dfd76e13006d9f2c027f1f2e0b8","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2-rc.1.tgz","fileCount":41,"integrity":"sha512-3hyXoed+9fb17LYB+ZbkQU7v+YgM54uQvH7sVYPFxlluq16zlnR5lUyqY7QBsuLL4IspZWf5ztkfsDSojnESSg==","signatures":[{"sig":"MEQCIBesqWycTWvJeLOVh8nDlYA4UAZ9SXaOt698+L/t4DR7AiB9pjHeVboJ0M2LYvTjgP4vuUo8BRPr8hA7vgq+v2oFMA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":432882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfjF9nCRA9TVsSAnZWagAAW3QP/10fXV1weetWBLGyuhXR\nnNUDqPhA63DhEQkrxrA/moCmN5zoLO6A6G1HGZrTBlcK2iO3Ad0TEswAEKle\nyl3/F71xujRpje6BGDx9eZ5viBs0eaeShQ9I6LmHjVICvdjd6p+dWm15RktW\ngKQoaK+R/NFKAe4b9Jc8U6tVATnk8eQUSo7K8nWgEvATPh6jlSVGzzzjRw0H\nh+CqZef6kiV2o65fzJB0/vPaL3Q8o41OfnQRjvcxQoesU5hokDIZTR9TIupt\n3R1ZSmmpsxS/DcTwe/OCNHaseIQCvPhpVsNND2djqHMSrN7TAY7fj622rL3t\nfIcl//G0jHnhLB48E1npyJpBpVGipKifMrLtHNlRaX437eJUJDfklnEme++X\n5MboHSAiQzwB+DSW4jrbry2hFXipXukgSaPG62LgGIfpq/m/uv+EJ1zAfgnn\nUuFAmmNVcauFaLUya4iymFr++l8uTLcfp/kcSuY5i6xUTDGLOlifNAhPNoU9\nz/9vbJtS+2znSHTQp2TIFCZJOmQu57mdcrF/r0nu0JVPHGev4Wa+OWE4Hgbr\nWf5LLVX5ZbzdGdF/cUQ1cX18rKW6AHMbtxJonNxWxpOkETWVA86hQxpqWMBI\nqff0JNFQJNfVMNkzUPONq9OJVHku6fanB/FcnV1apB43DZG1G6rGKWUPYD6g\ncoie\r\n=NHKy\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"e218abbcad6d09cdd673d1e059f136867ce73bdf","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2-rc.1_1603034983504_0.8629753457367226","host":"s3://npm-registry-packages"}},"2.1.2-rc.2":{"name":"@twreporter/dual-channel","version":"2.1.2-rc.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.2-rc.2","maintainers":[{"name":"nickhsine","email":"nickhsine97753017@gmail.com"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"yucj","email":"yucj@twreporter.org"},{"name":"twreporter-admin","email":"developer@twreporter.org"}],"dist":{"shasum":"dd0ddc762e0b297bc5e0b2a0e5a82e6bce15441a","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2-rc.2.tgz","fileCount":41,"integrity":"sha512-r9ujSKhKeiT3tWX1deomTWC7/hOWyedVLN9XM/MLS2a85+LwpUBS29DS8JR6N3IUhB950lh7C+abm39NCgziVw==","signatures":[{"sig":"MEUCIFhYDDVstPCy1S2QLzabO8+EkLIYvYwGzgcGnbIbh0IBAiEA5VudCYCr6L1YFywEsigCnQBBseSjwH22gLDhhw/KvGc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":432884,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfq36FCRA9TVsSAnZWagAA6QEP/igyL+vamPlafgllvVBW\nNH/9RPO6U+qAj+kbIKY6oTA9Pka+thRit1llJFJYnZiS675G0pGrczPkdwJD\nSwK3Eoxo56c6nXxuoD/svGEIhIlSkYjTg0WTLK/bCyskLKPkbpH8esM5Vs7O\nKAbR+8aMh+1b7DoOOYx9iosv7gLB0UWru/9lIv6JVsjVz6bFMFUIVCqAM+GM\n75eqPGaTYSG6GnfPKKPUWDQwuylqXZHiEtuAAO+AMRlmYOjnfYYjybuqcVsv\nW29ZqnswLsyc9ovh+lVcOFHZ9IwVZ1jPFJo+aKTTEO3Xkw4UPIjcsmQiWLtq\nRUQ8u2RxaVc9KJQaHkVxBqv0xkMkl99mJM8e0ETtsRBhWoqeM40PI4kJ27yz\nRc4hgj/njRtHmjGqYy9ptpREKXkC5YgV9EIODtBCqlunsfxoxGhdD76fpSVV\nv76Hx9/iL1Wn4LS3zkcfmwHsGfavl4A9DwlNV6qV8H2wyH3h3rnFFQa38WzG\nJ9mG4SLV7BXoDwBVvAF+fLTSjDBAme1jtSRy9Z6swTxqlBJgDfk3Jl4sS26r\noEUijAlUcJZOkE7L2nDy3IuoSZ1fsz/mn1YYB0MyoPohy7oFU6u0/+P73H3U\nmoU8V64iIJ1Bp9q65+oDZTUCG59M1KxV7hvo4tWQqF1pu8XGgKP/N825t7zl\ndBPN\r\n=+D5h\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"71e583326e918a84b39024e6f4e0dcefa8df4a65","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2-rc.2_1605074565002_0.433811732844106","host":"s3://npm-registry-packages"}},"2.1.2-rc.3":{"name":"@twreporter/dual-channel","version":"2.1.2-rc.3","license":"MIT","_id":"@twreporter/dual-channel@2.1.2-rc.3","maintainers":[{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"yucj","email":"yucj@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"}],"dist":{"shasum":"453592eb827021ec3bdc73e47b3cf839439ce23b","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2-rc.3.tgz","fileCount":41,"integrity":"sha512-G+kp2shEFDVcfELtpT+RImvMwCdqlg9WvuuPoiP5PDsjHPLGAcFv8mKh+PVo+whFvFEq/ZanGDyqO86t9KaH7Q==","signatures":[{"sig":"MEYCIQD0Bsf+28Vqgg6iP4tVbkWHEsG6JD24DWFxIyRblPvPVQIhAIZBbF+gIvuXiiWA254kCexqfdwXPKpWsZ/fOO/IznQ/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf7ZmUCRA9TVsSAnZWagAA5kIP/itxi4pN6pE4pbOST41u\n+VqRuYdYooK1LHmkyffRQ8YOFWR4vG8viC0HYxSODVfUOToWmy/FZ4NBocGn\nIh+HoOiyfrs9xi43DpCBcYKA8Uxthn3CX20Fs01S5T5iAu/Es0jP7Ai9FW3h\nubjE5TcbBR2HpFFJqiCqge7Lp0Iy/G9HN0pIl38aUqaYCm5fmgqhGhLP1eWP\n5nv7irPUwi95GiVQpGBQYjYSMh/RiFglE0RVucwBI4oYj0cj8wXiqH9emcYC\nbjidMY2W0GUcORiUMsGTT/OY6eyMdXnF/yyc3KKy6FQQ2UDwZw94wxj6nhrP\n1dtM7umLpO0LvJLSEyuZf851c1B8E/+u1cI2PdaDLv91eNV4CNoYlyC3gkVI\nwq8A8yrkX6UCej4/0cxrwrxcqqikudb75pCRpaPFKq6M3jxuP4sJ47/hgIzK\nM0lqqsP55fb/wPuc0SY55rDqQ47GZanEfjuvrNB5NzGYHTQQChJK/l4fRk1Z\nYRFMJYhgE77LvTZxNYLFjtbUXVYs7ht/fLflx5zrwfEKFaJ6r5oxjCwShwXc\nWfVbACDtssRjlp1Tp5S/1y3cF+P8zykIxG1/iR4uap7Yz3V8oQSTXMVYFDSU\nHoZDI3D4YMEMhwQ9MqcafT9QEum06ia488W+7KlN3lvMfq955CBh2YNcIh0B\nD2Y2\r\n=3vt2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"ab095f8f2d365f02814ad5e14576d6b0f7fbc0ab","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2-rc.3_1609406867636_0.5231340859896583","host":"s3://npm-registry-packages"}},"2.1.2-rc.4":{"name":"@twreporter/dual-channel","version":"2.1.2-rc.4","license":"MIT","_id":"@twreporter/dual-channel@2.1.2-rc.4","maintainers":[{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"yucj","email":"yucj@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"}],"dist":{"shasum":"e6ca72205cb24773ec1aac21426b95aac3dcb673","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2-rc.4.tgz","fileCount":41,"integrity":"sha512-0CrrcTS442faskTP4ZUzIwHs7skqrqDSaXty4phOJ3ADlknmrLEIyZbIZ20FXWONKr5VjqMNxM6gY8s3UHNeNQ==","signatures":[{"sig":"MEQCIG2KhQ/8Fdhe6qEHIwB88WJOdj4bNS3LsERQKZdyiqqFAiBBQHELAQAlS1cblFYc02xm9O6Ce41eKb4kHTb/eYmaSw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgi2WpCRA9TVsSAnZWagAA6kkP/25Tp/7U0MKroGQGz0O3\nFgQrpynEY/9q9Y2dWDZgtzWpjPY3tQ7L4uXem0iui5pL3HvU5ST9a4PLajrJ\nzhX22LxmL2HOVdL1iuj+0T91OQB127DhhUZPTy7gEIcCyahNeNpt4HRgVxnf\nEi0OxuC6aTEOBfsthZ4Yf65JcBZ47RM7tZW998wxPcRgTlExmiIbmrzo2WC2\n1lmpBcBr8SrSikVXAUFjFSUpKzmiE+kgKz6N+03/DoAMuF7K7FdltBG6vQ1z\nosBDB53+J2qqzs8fyx9Mu1qAcbHKbCBRtuPk/X6Gq/svE3Ku0bpB05O0ATT2\ne3tHeKgTGC5r4XfkTtjDBByGppJvK0ZAeBYfAehSN6CM9CcI98jm5WW+FWNv\n1OVPHF6aeku96/1jA14x5aLUQIPrOwRT4BPbvC2xRO6D9wS1y/sqVVQHop8O\nXvorZ1hU5elEdJBfBcpF1oysA2UJjVDBd3n5cvSDHfU5THoMWJqtGgsgOiyD\nxIExPsibIrTqs0hDq4SR37XyfAddJCVcLXLw58I+QqhTE7qZE1cD2FUOAb3Q\n/0hr+r9w2z3wS8DbHflU7tkVCLV4lCeGZZ5pfXjLsKVSGUpJr30ig3OD4RHE\neySYMg60gqm54HLGYesRNh8angXov5r04azYEy5IhY6rNUb3rEYY3yKQ8C1A\n0FaA\r\n=WzBL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"923f9cf8e1e7d8e85c341c812c39af60683a9d8c","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2-rc.4_1619748264741_0.5109613276734299","host":"s3://npm-registry-packages"}},"2.1.2":{"name":"@twreporter/dual-channel","version":"2.1.2","license":"MIT","_id":"@twreporter/dual-channel@2.1.2","maintainers":[{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"yucj","email":"yucj@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"nickhsine","email":"nickhsine97753017@gmail.com"}],"dist":{"shasum":"bf6d54584b9626cfc628aaae623c9c9615f95eb1","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.2.tgz","fileCount":41,"integrity":"sha512-N/f9yQKX6E1qe+Mm0uJWmgAD3Az9lbbgtAa+sxOfm+s7vmEan40aBMLmHAc736B/oZpMiO9w2lfYewXgriQpvw==","signatures":[{"sig":"MEUCIQDQi3YZQegb8uNIPA8jC4DFIXTZbdYK2fWIM2Tz+UmVCQIgAdN3pnKkO5sXLy50Wd3eJfpalGgLZ1Q8nol5mQq6K0I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgi3GYCRA9TVsSAnZWagAArQoQAIwS1k81UoeWK82bvQnc\nCW3WGXonYR8tjXdy0x2oLyEN/Kz+PYOsAvx9PVtyp3Hy/E64ZarFxrl/uuPP\nQs6xKr0eTRp1YUxpee/XUYi4pI5bp8ruAuHGpqRQ/J8jhr+LEXMzM7qxodL9\n2VdkEbTdltnD4+P4aqA6Q51nxPIIZcbGt5YE7L6s7qN6YM75fcvGbjqzadU9\ne4sXselHsVDTw7DVl4ZLqyQjwqyk94JxsszE9sNAVwd7FU6Xnf00M8UwwkoT\nk8313xk9ZKD370QEt+ddqMBkyOuG9Sdy4sYiEL17E9Ia43d0QF26Ug5OF0XI\nDhQUaEuoH8EUd4/YtxG6QzuqFnao2LHCb8YaslCRp4Y2GQXa4FRIhF4E1xuY\nhY4QavKVm46z5NC4Utccx539vOscVJKIdAY4OYa8nsliz2ljN6yG8oIjFIpU\nTwsMYdS7dXhC3wWfCSSNYSPFDWKG2wILxtcu7/QdpPye0ibP8K71VOW/gfsj\nssSVpO4BICxj3sHXDGIiO2Culg6Bq83/nbzwceYHv4F1I68x8YD9KFSN7IyB\nfg7LRs1gwZ953VyQyvSSDyIe3kglO17G272u0/cBParFdlUZ+Z3MzQA1OGXp\nbF5N3Gdb1S7S1ViNueBfF6n7DL6XkCdsdaK2+v2gILyHiqfw//FGE2oQgCDc\nrkaW\r\n=ZrTw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"770c9b6826bf8b7e00bf82fe78641bdaf9b2c8cb","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.2_1619751320210_0.3561687972638341","host":"s3://npm-registry-packages"}},"2.1.3-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.3-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.3-rc.0","maintainers":[{"name":"duidae","email":"duidae@gmail.com"},{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"aylieinthecity","email":"aylie_chou@twreporter.org"}],"dist":{"shasum":"9ae3bf6828ed51297e435b587d77de385329f812","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.3-rc.0.tgz","fileCount":41,"integrity":"sha512-lGy4/VzQBK8jjDfhZO6WMWDyOSk4PIdtbsihfNe9+VeSRh3G52rHD40AmDy7ThsJ6uBvT06vAG72uzO90w9FxQ==","signatures":[{"sig":"MEUCIFeOtH9azLG/5iXS3vMzWa1lCG0M1IN67y74XezuKX4qAiEAsYIbEeralHZelYdQU6+OLUkgCirHjiJMfQph1ymZ+PA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":425529,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3n4HACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqkzhAAlCDXPNevMRRC52ym+7ycxaAC/R9TzbRjMuPy2cIFrPS28FTU\r\n8hEEwU50YEzEtcQCX2nfVUwSAEWvfB4Jb6LKB4Py8CZu6rUv086N0ymKaKfA\r\nLBxZiwXJLH85qiz79YijCOozVchTkG2ZjW1kwJK1nrXdWI7XN0lzHcod6dWp\r\nnADWzFNmOGLaXYyhE3Pn9Zu5dCNDtOvSMof7Cl0fhkthFDUmMVlvPn5xfxWr\r\nbqGPUt9w4Oy2byVIiyPFygcDqJAgbpaUXJ8YD86t1jYVmdngrKC0l+DkjBo5\r\nmpw1ATfAzZwpFcQ3ATboJqrzlLgRQlfPovJHZW67DIRjWK664S7opArRksI0\r\n634oofKd7RmrDCguVe4unxMkHDb8sspzlOoC0J1AAOZYTIl36WrffahbcwEd\r\nskjmSkvAr5c9aZzAv0A59f/f2sMIOkSfMT93vBkmOxrdr1s0PBKra9j+Xosj\r\nTxZWiuf4SVJJrEUQUPy1eMFJDD2Jaa6ta8uoql8COs9Sqw9n3NXcZ4Z9f4Vx\r\nS2hZzg8oNrqkTOOCzvfk8toNdbCew6u1lBIFY/uU6BXbZxDcA3TluGfdY/ry\r\nGATMiEXDsokPet6tBfZe59a5eGFCrh9Ajedco2LfPGLV9yXLZ3vukYfFJDL1\r\ne7ND/p2j2uAsOYzFQK4ggTJa98GcRViz4u4=\r\n=0UDT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new dualChannelUtils.Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"714a6b180c58eb475ea84d24eadb1decf926bd17","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.3-rc.0_1658748423686_0.1873845755873711","host":"s3://npm-registry-packages"}},"2.1.3":{"name":"@twreporter/dual-channel","version":"2.1.3","license":"MIT","_id":"@twreporter/dual-channel@2.1.3","maintainers":[{"name":"duidae","email":"duidae@gmail.com"},{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"aylieinthecity","email":"aylie_chou@twreporter.org"}],"dist":{"shasum":"6cf0c48b5ec49e96d1bd0cd2bdf0239c7baebe5a","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.3.tgz","fileCount":41,"integrity":"sha512-PFovHX28Ww8/I9aQacRCjEQO+9NSmhNa7ce/fqCR2pgMRroOpMuG2hgoICL5C4Io3Z0Y4LIfaSv53gKaNuq/Dw==","signatures":[{"sig":"MEYCIQC4AdzZ+5weY56z0k/PIvmXHnxgmYoiO7jfilHhPIfPXQIhAI5x48W5WIOkHlQGmnlYzs2xWJXwoSIPKZyJD+eZEAnZ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":425741,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi3pBuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpC6Q/+O8U4r1mdSpJOPEJKf85PMB7l1FnkBqL+9TO4Qr4udy/Lazmp\r\noU67+8MYyyNS3sqUXDz4AFY++hjNFUkwJEkvxxxhOg2hNj4bbs4uO+IASTmr\r\n5sOrre4M+HE90VV5Ymp7YOT/Tg4iq7D2arop4rPOeuxt4eDySJtXA4kaXkLH\r\nTpfEMrY6Z40ktGvSMQavhRy5qDgJrXfIxXJQVakwuMHJIFePc8Hur+mTiV2g\r\nfiW0BRHEH0W1l/Xu4krIOsw+9aEVaxRDNtJZ+aBryEYC8yfCV31AxxpTPUF4\r\nQLWbYJoKjTDRwdfEsYYABPhXENmsmfRh7x2I6LpU9AKWSsF0tq9Vb08w4dr8\r\nldr6+1nic1495nw3M1vfnbFv+ra4SR5cebuYsaiGixksvgWQb/ogW26AdfE9\r\ndWZsoW+Q60h1ao/E0eYFka8mG/dFPeUEVEbfSJWkJNvaeFB+ar25BhNWLKdQ\r\nXjraf+tjf5SUMu2TBa0hYmkHspBd8qAguTTDMwdYG1DTWz9aaEGiKcGF0pu/\r\nazeCWrHOVE8FfP8lgo+TybR63vCJtqIwGHgIgKJCgXoZsRgAWIg7yETPTS63\r\nxTDiAt/DvQLCm30LtOdQNHXYkgBNuS2h5t9VHL/d4HJYq1gtuSmQy1pG4Myd\r\nzSxQWp/ZVyiOkIY+Er93h7HkVZuRALnh7rk=\r\n=LgWx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"60888182915343393108f92d34f769c87404a352","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.3_1658753134012_0.04775535855045354","host":"s3://npm-registry-packages"}},"2.1.4-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.4-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.4-rc.0","maintainers":[{"name":"duidae","email":"duidae@gmail.com"},{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"aylieinthecity","email":"aylie_chou@twreporter.org"}],"dist":{"shasum":"54a4019f3be671ea5678fb3519c8af29477677f3","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.4-rc.0.tgz","fileCount":41,"integrity":"sha512-OBiEH+lbsopxx8c5PV8EyFLMaT7uWCUrKvfnX7pvsTcz404k0vyNYgSb4os56/9mCuboUUH1Z8TeEGTGd0HjaQ==","signatures":[{"sig":"MEUCIQDaul7Hi6MbX8qUo//NhLD+wq2TLSALlS6XgrbgUnemzQIgOblYplabVTJaydUXq5UuS7csD6qbTrNIXvIH3RCSncY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426532,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi52FWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsMRAAm/pxBfbXj7oEp7t2wzn2b9rfnTuPWmnQs0nVudJ2hlO0t58A\r\nOXya3F64J5EgmVR4hZsmm3uTnZEVp+x1eETh8NpwJf6Fxw7OFPn1QBifpELe\r\nAD0tJck5emZhWlQCoDHzsh491jHEJ+WXpCIjuRLZnfd6pPpfBlyfwZ0DvbbH\r\ntJPT8L5HLs6lAmKU53FzjEXn6/ddCtDNH0HNMaceA1oPKvW1qro0ekBd6Mad\r\nbVIRITguq4M7b7nEsVm7LBAlESKYCsGLLlzHNVokE1b762YmQ/cetKA4ANpI\r\nW6TOpdzW0Qr+i7tGwbRMs9Z5z/WH/cO1UnJHNicylpaUMeQ5bHylI/26Ikl6\r\nUBkEcc1wwL15mcMukd6ttdP+hED9tiOSAO2U/8dbKTQ5O89kKZRrGBGIq9kK\r\nZF3+7uucW9nrA7tAmM1dggsysfPcPiION8SOnC53YumldHWa5HPGAjeRwJ8+\r\nXnAHerTNtHOxg1/nIU+Shr+mG6ld0pV8DCKBs6mfu922VohGPs9g9663T1wd\r\n90GsUsswr6eafFyMybZYZxvLFR8Jv6en8gTeYjPQdio5egsIrq2ghlzcNlxu\r\nqZIxrhGtbk/E0Z19bYKrE0NSXw7gzPKVuCuX89jl3qbgXxENFhhWXywApSBE\r\n76RXrSOA5YqD7D5a9OwsQrVuy+9DWYO5QZM=\r\n=7FqE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"6fcc56ad1644b48d7ddd2794243faba81159e6d4","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.4-rc.0_1659330902687_0.4852223294958917","host":"s3://npm-registry-packages"}},"2.1.4":{"name":"@twreporter/dual-channel","version":"2.1.4","license":"MIT","_id":"@twreporter/dual-channel@2.1.4","maintainers":[{"name":"duidae","email":"duidae@gmail.com"},{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"aylieinthecity","email":"aylie_chou@twreporter.org"}],"dist":{"shasum":"51a27f323133b1025374b485dab55691f4c456be","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.4.tgz","fileCount":41,"integrity":"sha512-7HECWCYeDeUG+ljPG6T7UZoSeyShyS9SzjX7pfoiQbVLtRtF3VqpvZAIDu7OOKZeG9TAr5MSQT2ywUlEHztXsg==","signatures":[{"sig":"MEUCIEBHfuiogI3e8VrOdfb+tzDjYVede/5G9it9wwmAIsFpAiEArbNmV9mYQ1P5X5mOxb0HO7WA8/rS8JsFje7YvNQfs+k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426744,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi6kFuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNXQ//W/qiIAgbOYAYMzx4O5fedQ1tjtT+XZ0hCgcssuvtGGN4P4cG\r\nDdbjFO0TOWf0pnHHm8q1zFzPbMZ3HrBzMQwbAX2xhy7TCkR+Rpr45KwphpnW\r\nndhor2b9dM2gztnWRFmQulyrY9jUvQDpt4bBSxQDpYTm0VR2xglW2qFOnLZP\r\n4ifFgS/u1uFu6SRFnct1iiQhbLheKYMKeq7xtf11OJDHG/8mZ7a6NEY/K8CT\r\n85t+9xnb4BLkwjUy1GkuGIMh/Uimb3RQqtGAPaO7UwITw6OAxSkhH9dpUhlR\r\nwsjtEwCaq1MRg7yng/7ZUo4SU7d4Bf/QjYHvYP4Gj/iqrO6+//230czO96jH\r\nEWvRNTax094hV692KAS+yBVExIFQpicBUMm0snw2R/zRIK0MiuSAEv5vZMPD\r\nsksxp85Iqpm/gaHyxegOnBKllaSF9xHc7tbnA5DyOZWRxC5cVdLUpRz6dtvF\r\nLIdKBqxxrZvhCf22iUKRlbBlsgZql6LSjViiNrcKypAJaEEWL+IWDuDgLCY/\r\ntq0sB/81m3Da9Jb9ppEit4vsg0rftzWQj8/HgamGUPJQ4aUhw26jMfT7eW99\r\nnnuYC+/gU1f6EHskbovrbC+gPrWNqqAOBibRjC8NW89GVfAmjw5cT+KAVV2t\r\nGbhg2UxuXUU7jl6IsP2htl+h2CPZ4nomKUQ=\r\n=S0mQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/index.js","gitHead":"3ff6f298bfb4ab255005abb51132aa50acc58995","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.4_1659519341907_0.9727832018367268","host":"s3://npm-registry-packages"}},"2.1.5-rc.0":{"name":"@twreporter/dual-channel","version":"2.1.5-rc.0","license":"MIT","_id":"@twreporter/dual-channel@2.1.5-rc.0","maintainers":[{"name":"duidae","email":"duidae@gmail.com"},{"name":"twreporter-admin","email":"developer@twreporter.org"},{"name":"taylrj","email":"stu005606@gmail.com"},{"name":"aylieinthecity","email":"aylie_chou@twreporter.org"}],"dist":{"shasum":"a2e2415755708773681530e1d57f84495bc9aac0","tarball":"https://registry.npmjs.org/@twreporter/dual-channel/-/dual-channel-2.1.5-rc.0.tgz","fileCount":42,"integrity":"sha512-NTQd+AFMSkISd+l2XEmSuyKzPWQjczGq2ZZtgbDQxjun9oDyAlifM+OsSnP3dqRzGKepd8cibUIxR/EgrqFg0w==","signatures":[{"sig":"MEUCIQCyTqImoqmzVbiluOKW/OY5OnoR9U/7CqGBvWRcNFBdUgIgKTdYSfcmSj0STtPZswlm5/SWojpaPnn3jxIBoEDJ148=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":430971},"main":"lib/index.js","readme":"# Dual-channel\n\n![npm (latest)](https://img.shields.io/npm/v/@twreporter/dual-channel/latest)\n![npm (rc)](https://img.shields.io/npm/v/@twreporter/dual-channel/rc)\n\nDual Channel is a React Component to simultaneously present paragraphs and images in the browser viewport.\n\n# Developer Document\n\n## Install\n\nInstall dependencies:\n\n```bash\nmake check-dep\n```\n\n## Dev\n\n```bash\nmake dev-server\n```\n\n## Build\n\n```bash\nmake build\n```\n\n### Test Embedded Code with Mock Data\n\n```bash\nmake test-embedded-code\n```\n\n## Import React Component\n\nYou can import either\n\nOption 1:\n\n```\nimport dualChannel from '@twreporter/dual-channel'\n\nconst ReactComponent = dualChannel.ReactComponent\n```\n\nor\n\nOption 2:\n\n```\nimport ReactComponent from '@twreporter/dual-channel/lib/app'\n```\n\n## Import Sheets Class\n\n```\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\n\nconst sheets = new Sheets({\n  spreadsheetId,\n  keyFile,\n  targetSheetsId,\n})\n```\n\nThe reaseon why `Sheets` is not exported in `src/index.js` is because it imports `googleapis`.\n`googleapis` imports nodejs specific modules, which makes webpack build failure.\nThus, we need to import `Sheets` directly from its file.\n\n## Data\n\n### Reproduce Demo Data\n\nThe demo data file is `dev/data.json`,\nand it is generated from this [demo spreadsheet](https://docs.google.com/spreadsheets/d/1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY).\n\nYou can reproduce `dev/data.json` by the following sample codes.\n\n```javascript\nimport Sheets from './src/sheets'\nimport path from 'path'\nimport fs from 'fs'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets.getJSONData().then(data => {\n  fs.writeFileSync(\n    path.resolve(__dirname, './dev/data.json'),\n    JSON.stringify(data),\n    { encoding: 'utf8' }\n  )\n})\n```\n\nIn the above sample codes,\nyou have to download service account and name it as `spreadsheet-api-key-file.json`.\nThe service account is used to be authenticated by Google Sheet API.\n\nIf you don't have service account, you can create one by\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project or create one if you have none\n3. Click `APIs & Services` tab\n4. Click `Credentials` tab\n5. Click `Manage service accounts` tab\n6. Create service account.\n\nBesides createing service account, you also have to enable `Google Sheets API`.\n\n1. Go to the [Developer Console](https://console.cloud.google.com/apis/credentials)\n2. Click your project\n3. Click `APIs & Services` tab\n4. Click `Library` tab\n5. search `Google Sheets API`\n6. enable `Google Sheets API`\n\n## Build Embedded Code\n\n```javascript\nimport Sheets from '@twreporter/dual-channel/lib/sheets'\nimport dualChannelUtils from '@twreporter/dual-channel'\n\nconst sheets = new Sheets({\n  spreadsheetId: '1Ppisv4HTZHYMp95umgCoADNuP1PSkL-t9na-5lRIqSY',\n  keyFile: path.resolve(__dirname, './spreadsheet-api-key-file.json'),\n  targetSheetsId: [2143095237, 492967532, 2049208510, 489341977, 1453335111],\n})\n\nsheets\n  .getJSONData()\n  .then(data => {\n    return dualChannelUtils.buildEmbeddedCode(data)\n  })\n  .then(embeddedCode => {\n    // You could copy embeddedCode and past it in html file\n  })\n```\n\n## Troubleshooting\n\n### I got 'Insufficient Permission' or 'The caller does not have permission' error message\n\n1. You should check if service account is provided, make sure you give the right file path.\n2. Make sure you already enable your `Google Sheets API` in your project.\n3. Find your service account email.\n\n```bash\n$ cat spreadsheet-api-key-file.json | grep client_email\n```\n\nand share your spreadsheet with your service account email.\n","gitHead":"2b05774d6e7cf009d00fd816f130877472494dc5","scripts":{"dev":"make dev","build":"make build","clean":"make clean","dev-server":"make dev-server"},"_npmUser":{"name":"twreporter-admin","email":"developer@twreporter.org"},"_npmVersion":"lerna/3.20.2/node@v10.15.3+x64 (linux)","description":"Build Dual Channel style infographic web page on demand","directories":{},"_nodeVersion":"10.15.3","dependencies":{"uuid":"^7.0.2","react":"^16.8.0","redux":"^4.0.1","lodash":"^4.17.11","react-dom":"^16.8.0","googleapis":"^47.0.0","prop-types":"^15.6.0","react-redux":"^6.0.0","smoothscroll":"^0.4.0","@rematch/core":"^1.0.6","react-waypoint":"^9.0.2","react-onclickout":"^2.0.8","styled-components":"^4.0.0","@twreporter/errors":"^1.1.0","serialize-javascript":"^3.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/dual-channel_2.1.5-rc.0_1685696135702_0.3420127035755991","host":"s3://npm-registry-packages"}}},"time":{"created":"2020-02-17T07:04:28.799Z","modified":"2025-02-10T03:02:21.983Z","1.0.0-rc.1":"2020-02-17T07:04:29.178Z","1.0.0-rc.2":"2020-02-17T07:40:16.034Z","1.0.0-rc.3":"2020-02-18T09:19:22.533Z","1.0.0-rc.4":"2020-02-18T11:56:08.172Z","1.0.0-rc.5":"2020-02-18T13:01:24.335Z","1.0.0-rc.6":"2020-02-18T14:43:55.340Z","1.0.0-rc.7":"2020-02-19T03:12:59.400Z","1.0.0-rc.8":"2020-02-19T03:57:48.180Z","1.0.0-rc.9":"2020-02-19T11:04:19.168Z","1.0.0":"2020-02-19T11:19:14.817Z","1.0.1-beta.1":"2020-02-25T08:03:22.969Z","2.0.0-rc.0":"2020-03-19T04:37:52.125Z","2.0.0-rc.1":"2020-03-19T07:30:37.265Z","2.0.0-rc.2":"2020-03-19T15:11:40.949Z","2.0.1-beta.0":"2020-03-25T08:15:12.139Z","2.0.1":"2020-03-27T14:29:09.344Z","2.1.0-rc.0":"2020-03-30T15:26:26.321Z","2.1.0-rc.1":"2020-03-31T09:58:46.208Z","2.1.0-rc.2":"2020-04-01T07:34:29.546Z","2.1.0-rc.3":"2020-04-01T10:58:31.415Z","2.1.0-rc.4":"2020-04-07T10:53:29.298Z","2.1.0-rc.5":"2020-04-08T06:31:11.879Z","2.1.0-rc.6":"2020-04-10T09:11:40.514Z","2.1.0-rc.7":"2020-04-10T14:24:14.043Z","2.1.0-rc.8":"2020-04-16T07:28:22.644Z","2.1.0-rc.9":"2020-05-22T10:20:11.586Z","2.1.0-rc.10":"2020-05-28T11:31:04.332Z","2.1.0-beta.1":"2020-05-28T11:31:10.445Z","2.1.0-beta.2":"2020-05-28T11:41:21.691Z","2.1.0-rc.11":"2020-06-03T15:44:38.553Z","2.1.0-rc.12":"2020-06-04T04:45:39.292Z","2.1.0":"2020-06-04T11:25:30.161Z","2.1.1-beta.0":"2020-06-06T14:23:07.689Z","2.1.1-beta.1":"2020-06-06T14:32:29.544Z","2.1.1-beta.2":"2020-06-06T15:11:00.091Z","2.1.1-beta.3":"2020-06-06T15:26:00.032Z","2.1.1-rc.0":"2020-06-16T09:33:12.642Z","2.1.1-rc.1":"2020-06-16T10:07:11.494Z","2.1.1-rc.2":"2020-07-02T03:25:15.785Z","2.1.1":"2020-07-16T10:29:50.665Z","2.1.2-rc.0":"2020-07-16T10:54:42.522Z","2.1.2-rc.1":"2020-10-18T15:29:43.667Z","2.1.2-rc.2":"2020-11-11T06:02:45.240Z","2.1.2-rc.3":"2020-12-31T09:27:47.796Z","2.1.2-rc.4":"2021-04-30T02:04:24.929Z","2.1.2":"2021-04-30T02:55:20.387Z","2.1.3-rc.0":"2022-07-25T11:27:03.876Z","2.1.3":"2022-07-25T12:45:34.347Z","2.1.4-rc.0":"2022-08-01T05:15:02.959Z","2.1.4":"2022-08-03T09:35:42.063Z","2.1.5-rc.0":"2023-06-02T08:55:35.902Z"},"license":"MIT","description":"Build Dual Channel style infographic web page on demand","maintainers":[{"email":"developer@twreporter.org","name":"twreporter-admin"},{"email":"aylie_chou@twreporter.org","name":"aylieinthecity"},{"email":"liruchen0302@gmail.com","name":"lucienlu"}],"readme":"","readmeFilename":""}