{"_id":"eslint-config-mitodl","_rev":"18-5614844c20db3aa60a75f8f6c155baf4","name":"eslint-config-mitodl","dist-tags":{"beta":"0.0.1","latest":"2.1.0"},"versions":{"0.0.1":{"name":"eslint-config-mitodl","version":"0.0.1","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.1","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"168b72130693824c8e6204624edb2a2e287c7591","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.1.tgz","integrity":"sha512-VsqHps2I58+oAf4E9Zhr5MCr2SulMi5WLl+2I0BCVXJhHpRpt8a8EVA/9Lpi6JGizTAJephG7SgUlYQ3boiNFg==","signatures":[{"sig":"MEUCIFBT1O6FSiLVBk7s+qXrCnYAcr/AWVxkc/drPs0KB7m4AiEAgVvF1KAHiESz1tQ3Ec5bntbTk9LrEoRwcxFlgk2+m7M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"ad9ce3c79e78e9984b874bf571a30379d7fc0b4d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"5.3.0","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"8.4.0","peerDependencies":{"eslint":"^4.2.0","babel-eslint":"^7.2.3","eslint-plugin-babel":"^4.1.1","eslint-plugin-mocha":"^4.11.0","eslint-plugin-react":"^7.1.0","eslint-config-google":"^0.9.1","eslint-plugin-flowtype":"^2.35.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl-0.0.1.tgz_1506523265341_0.8889369932003319","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"eslint-config-mitodl","version":"0.0.2","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.2","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"78c2d67f373b3143633fca4f5b5a57991f64e749","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.2.tgz","integrity":"sha512-3x+DEMVqt0tloYK+WQ6dEFZmVPwXFfohwMDrErtDtE5pevVeAY3NlYKdiwWC4iy9Ya4yi7+uQ5z9wkSDK1YhRQ==","signatures":[{"sig":"MEUCIAac2961/d8ewDotozMz98Jhzo+Zgr8zxmTs2oWkIOcAAiEAorAxV0ktqyMw5SSemKIfkZ0EKtrdKvo03ZlAFMdQR94=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"ad9ce3c79e78e9984b874bf571a30379d7fc0b4d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"5.3.0","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"8.4.0","peerDependencies":{"eslint":"^4.2.0","babel-eslint":"^7.2.3","eslint-plugin-babel":"^4.1.1","eslint-plugin-mocha":"^4.11.0","eslint-plugin-react":"^7.1.0","eslint-config-google":"^0.9.1","eslint-plugin-flowtype":"^2.35.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl-0.0.2.tgz_1506525997629_0.24021028773859143","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"eslint-config-mitodl","version":"0.0.3","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.3","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"045d81e3816c4c21d5ae31cedc358e7a3375a283","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.3.tgz","integrity":"sha512-qi8RiCgRmU09u+2DBLYn6QMBAIauQauFjqAPYDj/r0P1mGmQSKtvY2jJ4wIdMVnXGBGnlzezLk0P9fVRnuKk+g==","signatures":[{"sig":"MEUCIQCeL89H2ztLc/6Xesbu8/w0AmWVNn0Yqp3ymfhcOLis+QIgbOW4G1mDQaBh6MtOWrMda3Mz6XHa0IbggnhWW9Gi57E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"77f3eda90264bbd9e78678cdeba3376263aa1ad9","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"5.3.0","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"8.4.0","peerDependencies":{"eslint":"^4.2.0","babel-eslint":"^7.2.3","eslint-plugin-babel":"^4.1.1","eslint-plugin-mocha":"^4.11.0","eslint-plugin-react":"^7.1.0","prettier-eslint-cli":"^4.1.1","eslint-config-google":"^0.9.1","eslint-plugin-flowtype":"^2.35.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl-0.0.3.tgz_1506526150386_0.02878352254629135","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"eslint-config-mitodl","version":"0.0.4","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.4","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"34b0bb5a3e77a2b26e83898497fbb02b2c77a35a","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.4.tgz","integrity":"sha512-ElQ5vaqMMFKMaZQDD3eJR014+z2lHA44G0IftCyiPdR2deM1A0q1PwXrwHfM1Pwu8vxbNqdaVl1nEJIWns2Jlg==","signatures":[{"sig":"MEUCIQDglCA6fGDRux/zkUduhfN/yMbT/JdWbSP4ELJ68XOKxgIgIU8+TnmiCr4Pn6CO/iZ6yygPDmIhcbI/2z95eD5eFxI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"65030fac84386795e211b25ecdb8b7c9d0f179b2","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"5.4.2","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"8.6.0","peerDependencies":{"eslint":"^4.2.0","babel-eslint":"^7.2.3","eslint-plugin-babel":"^4.1.1","eslint-plugin-mocha":"^4.11.0","eslint-plugin-react":"^7.1.0","prettier-eslint-cli":"^4.1.1","eslint-config-google":"^0.9.1","eslint-plugin-flowtype":"^2.35.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl-0.0.4.tgz_1507226935751_0.9923801270779222","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"eslint-config-mitodl","version":"0.0.5","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.5","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"b44e7a89af732b210573f1841106ae29440f0f73","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.5.tgz","fileCount":3,"integrity":"sha512-bw282o7gfNB04yyVL8ZH9W0Q3H5FKdHRANh8OJdinxfB8Z3tz6RV94ApGiPq8dj31J0aiWXDNnJDWuek/BNeTA==","signatures":[{"sig":"MEUCIQCpqKeiw+zyZ7RcnKHcW1s5j8CGITHZ7oXtjU2KFRvoJgIgXdvqqLzyzMmYvVNcI6sMHfglVpd1+oec7YGQWZu/20w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb5fk8CRA9TVsSAnZWagAAlOIP/0sr6DJoj+FgP+5KKqbr\nKBA25+MtDm90sKW8A0msDktqD9fTZP1rVLF4vvARvJZSc1TZPeeJfCql7JOD\nTOwTf4INy+J6KqrhtXYku5QqHvI63Ji4Ci1zsVCZhVbBgPfSM9GuBOoPsAxD\n74vNH5fhnRZBNmC+hWDSc3gDSE6H8iFilx8AKzY8p//UJc+U6A7xigHneSMw\nTgrMBTPG60QMeQDQXhUIXoC1mQVnZ14nzJctfQrhqJ4diVfQ+KyWVfKiGRHY\n1GR3mmlRcS30TsJpvxJZkgx3tuGIdKMMN3mpQo1VFJS0GA4E+SSRqDLHT8cN\nl5RMObNBhLQWcjepLBORCfwWTyxnsrGx1P+0L02fvlue+6hGGOW5dbdj7rwi\nXpnQCXIBt+kBZcz060HFIddAP+xP+7q4Shaz1pSwTwx2csJpcJCIC9gzZ/40\nGAn9kk+U47FRFCgLs9mxbojbO4eXrVv45/kblUV2R5HXUXTYU2VSela8BL+9\nAZLwD6PFV9OrSmy5vLO0bHbyN4Qk+ED9CjWOJ87OzmLyLnIOWCJLW4VyUWgc\nrCVuflQUTvvwbDt7bsSuRpDfDHugiI6lrf4RPc4AERq3VghhDKxdyWCDh3Kr\n3RHaX+MHSW14Ne0jKCjsvZUEfsKY1L9WdjTu1OrRYM/btRR0BlLE6n7J1zHT\nZyHX\r\n=OHRX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"ce7da67bfdd9b1d0e5619022272cb04416e9ac5f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"6.4.1","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"10.11.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"5.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"5.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"4.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"3.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.0.5_1541798203637_0.6545591427436017","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"eslint-config-mitodl","version":"0.0.6","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.6","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"c074f281b171dfcdf2d7d3718e09e3aebb3c532e","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.6.tgz","fileCount":3,"integrity":"sha512-8TirT3275oR+MlfWQHOR0JW4uk0siUHLjsNFC0V9tDJ+iMEQZxbLRMm1uMtNHFoe9cxgOSsGNeI6fcmjhlqZmg==","signatures":[{"sig":"MEYCIQCgMuK5VXzm51N6ISbk+a2x7vpfDEpM2F5hVqTKpgd9AwIhAIckiXEaxYfnLSIfTPVyZCccgAbE/gW5krtrLnNUQRUW","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13637,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXVPECRA9TVsSAnZWagAAEpwP/0UPM3anBNtNQTxt5z0Q\ns2eOVH/pscUkW5gZwZgROQLrLVCTFvRWYE9zWO7cO+B6w1HVWYosJSpg1l3R\nWPPfIzSOzL7mEie2iptOKLMZmKvPXBkD4X8Zdhc12rWG0po2ac31PmFOfa7M\nwTEs1nBSZv5o7nMGiG35TOMI9Z6N8SMPupCgeRxZj3J6NM1ZAsfYBw2pxe7P\nU2NRSsvpf5W20mzoKc1R+JjC7fjW2yvT+l5Zcn3Dwe76SBg+vPvrh2gQYGvP\nINEbV0RpppLTU/C68KpOdwktGe46axSWxrSlv5ZiG55iKatxCRfBVo3gDgv3\nMKyvGIAqNdYsAAxL++Ge+ueP5cHonYRCPRw+9sN/ipp+lwTlR6t2XlnV0yvM\nTOdewEAJGk/YpIZqkygJK0Z+luWagoztFxDgFbY5VpB1vVHnyurpuOO+mi7g\nQQbamBzxaCy+cd6FfrHzsPUmVjvHxq1FbBy5V2mtMbNfpn1hxDe+rdwRoxvZ\nbIAMArixJm5PppwhGI7WEbDcqlGPdTqCWJG9l/IHHODBp1eiRBE42nMG5gz7\nR6TQwd5N6mvQ2rXO3u+ePGfzOJh14CrptwuvAnPvX1E/A3WwSIitSae8praH\nv3WZyNDNfSsb7OIFqhTkXIQ1l24B9JhbZzqA/3c8wHLPgBPxsGQOTvtUOp5E\nLDzh\r\n=XIHf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"6f24fa2890b6fe441ed8d75c671cf176034429b1","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"6.10.3","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"11.15.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"6.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.0.6_1566397379243_0.3022447193276929","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"eslint-config-mitodl","version":"0.0.7","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.7","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"b40dc2f8adc1d2812439914d5da130d35fa19593","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.7.tgz","fileCount":3,"integrity":"sha512-eiB48kpZdGU+cZ0QTYINlZjOuvnrdlk2lX9Wx6i12i5rHo3hcOFPmF09LqOPc5Q+szesz98WF+y/WulLnQKEQg==","signatures":[{"sig":"MEUCIE3MK76Hf4BAX9rMUfD4h+kZO0o8yfqvLg+KrfQf+zLMAiEA5OKlLoSqQtw9yvsPYeYunJruXiYGkmYORVguUak7EPk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXV4nCRA9TVsSAnZWagAA9acQAKA1U8NY75+f4xPWNJel\nbgEtXAgtE9F0evtvQPjVYPrqrWqdYuvaEo/PwPX2Mm5itjRgG6+bUUd+MJRG\nW/L0YfnfMlQ6SKW2IkSqk6kl/yuQx8pYYfIPkA1Nblq7kojzaGECCtbBkkfR\niDQzjVtf/J5kPhYBhDNWLBqjlWCMz909MZ2qMYBJYQ/FhZKtMGgUIciXCAD4\nd4wBMvxbMto2OQgqCXKQcXfYpeH4MDJ2LlKy0WtZT/i2Fm0Y+jwB/RV1wsib\netRv8G95Xqt/juHpam5hNo/cwrYL15Ndm1HD04Qm0zGFBlINvcs2yRJSOHu0\nZrOlO6xvOCeHURJ1NM5E/8BbfUR43Syss7GV9vr6v4skcqFL8KYqsV3XvG/l\nMOLmNELVCgSslxXQxSbKj8RiNMfjDI5Mh0SNgSUINnIG/H2guKCi/+2cAPKo\nzdw+koH9WbLpYrYYNsp0rA+iBwN9/TLYVuzQ++wwfzaTF2VDN4DTetcwLVEh\nAMEG2UTiEWQ9IdurblIDRWNzdnxTdrkczljwQv7wOPQmFdE7oTG4kMZTXu1G\nkugN/uLZZQrUVrrkH4rHQv+nmkolEki+lhJfLjhfQxsbkuDezI4RQpYTAk+h\ngO1MO25Ri83hqMwsTkknz3fKfrv12nj7LIOOsRA7KmIhSFMziiFxYgq2Wh0I\n2mBZ\r\n=9IUf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"b0a4d9b983c12d06f17695ab7df2f287dd9f67a3","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"6.10.3","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"11.15.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"6.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.0.7_1566400038947_0.2380470836798072","host":"s3://npm-registry-packages"}},"0.0.8":{"name":"eslint-config-mitodl","version":"0.0.8","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.0.8","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"7c134e69682a565d644a809fed97312b6141cff9","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.0.8.tgz","fileCount":3,"integrity":"sha512-HGUfYa3Qa/4EkXohKtoimoXTkbNZn20ieS/j1554bgspjNPnRLKDIbw2Ec7flmR7NZUQlR/WERtrqo59A0wC3A==","signatures":[{"sig":"MEQCIBH6E5lWt5E8N8Q88y1ZQmomAQRy+xcpFbJ6M2cPMB0AAiB54CUr1Y/7YA6ZRE7fOBOrkFSGphZeIMmNgSTN8bIMhg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13787,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRSvaCRA9TVsSAnZWagAA5vAP/An7gcp7OGJ4XMogV8EB\noFY1pVFbLt1Y/wrrnZ9IJOqPCWk99DIEm5l52y+NOnA0tKVDp9sb7b4PpHbP\nUYeAGpwPUd7u5r3HnvOg6NpXCaEj8biUybr1yeUCGi+fNVyam55gvJLlFn4v\nk7U3ofqoBETclXTLSIwjYe/9l/Li13piytMAi6jH5s9X/vunhN7VfbYDwr9g\ngotOiGflL5aJtp1yr+qLA4B60I1QJliusN7TnwXcratOVLxQtY+lqpT3xwt8\nXHiPE5SaZihW7klk/wS9PGjDmjR3/zRkeSxHlvbMjtalHnR8cKzTQZx8jLWk\nO0egzwjqYcVDT6giYUg6prJt4FaRVexIbrtomn8+ksjH/6tgpAME/Faf52xJ\nUs7z7QWmh6FyaCVpaZQgpgATH+t7mbrEuliSrIiiyDbJM3jZwbbUnejg6A/4\ndWV5v1Zk8zeFFnUvCm5yMDvaQMj2UxwDfQUNfrUFIeH4MOTrVMUlwD9Syrki\npgrAUY41eGmpspZnDnl4nZvAFFHKOyUNXNekFMrNuaiFX+bNU2iPVi9bleoH\nN9RGS1pMV16cfPQjeQ+tuOTbHs+6GRsot+Gyer0RwMSHM2SXzF/aFcGQWs7x\nFKtOgAz2y6nY7TpLmPrjqs8GFQsAi4HPYkgjwfTLHdws0obuHaCBxjtic+Y/\n7pe2\r\n=TFme\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"c5b97583ca38b1234c91e75e2bd2a39c5d6aea5f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"6.14.7","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"14.8.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"6.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"4.x","eslint-plugin-react-hooks":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.0.8_1598368730304_0.5327029678603723","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"eslint-config-mitodl","version":"0.1.0","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.1.0","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"0315a4aed4eff895b130787cab25378f4f918b60","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.1.0.tgz","fileCount":3,"integrity":"sha512-vk0lR4j4aC34C1FrFobQbaospmiaBPr44ZQY4X4uStJSXD1eeD7Wv7YNcSSpTm4PodC3EkCEFpPAPPUeXM5tDw==","signatures":[{"sig":"MEUCIQCdngDGKJX3uV8LeNA75gg3ULpgYFJuXLlRXK6SzBirwQIgci6goeL2+mHiVahRFMm/DHBIRkLCb+ubUHH6zL7jCoM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13892,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnDTXCRA9TVsSAnZWagAA+H0P/R16v++nAi2ANdZCOh3g\nVkqNqenh78MvFUWgmDuLZnjqopqsV2KCvDD8/hlJSs/CQPszaH2t7n4dIBiD\nRgbFDwxJOWSb+9V4tkp7cWu9bi39jXSsBIjYAimhdhGBg6hExLKhnCyYHTM2\njD4aC/1qtOY9GZYarv6SBs2VL8esRBc8lVjI2pR2tToEjONe4KOrQe8MslsL\nBBihKisU1rRRyJwcybSDmsB/oB/nIUdhwn1Yy5EFTd6LyvArMNXd+wA98lBu\nd9QUh6lV1fhCgAdCT3UoVKerpf+/P4vtTH3wpZUhu/uHhp2zeo5yG3+9MprE\nHfofLZJ2RbmnRDtKMxKYGYpG0JZTWrJ8F8bQvy9FohtN3i840EZ9YeSBa8fm\nnR5aomgP/0yw4puDd9MVl4lQ1b+9mf77VRMetAYHnD+mMygSTGFwnw3UA9kg\nukkJ6oqCYHCDGoRPNjyYtODnhaeTKjWxFQkM9iimjbr+9mEzus+KMazdDgbg\nJrpyab94p2ZwK7obPvN4rgAia0HwRIMXZ/9Dl4/otB16nItMOPL8e/jQzNMB\nCguXekv13ZEebWNgGRhvK7oUEAXve16HNSmWIBeNO+OCNiyz5ZQK8pJgwz9b\ndZHpvKIBbYRQtK8YX0hx9nIThqiL5lRjF64fDfioytSouQutaR3NwiMO5hm4\nA+MQ\r\n=tDtV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"a36e3eb0475f7357fe3910fdabdea24b40a95427","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"7.10.0","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"16.0.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"6.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"4.x","eslint-plugin-react-hooks":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.1.0_1620849879018_0.2747742369600168","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"eslint-config-mitodl","version":"0.2.0","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.2.0","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"ad8502f12b9d498000c22e5a2cede2aa597fbb00","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.2.0.tgz","fileCount":3,"integrity":"sha512-orOwV3Dir7vmD65wfai1AYvz/dfGma1C51LlURFeRbTX/n/+o7Ztf62sfUUwgEOLLGtA1SdwcMSQYZIBEpqBlQ==","signatures":[{"sig":"MEUCIE/Lfzt5apyDKWiv7Dby/4oSU8+gacQFDHiL5k9Ui7ZeAiEAkjpp+PjmPYgajxeS50Pn7snsVMK83k3cqqhz5e64vb4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13502,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhCuqECRA9TVsSAnZWagAAzkQP/RDAALuribVxyJhky84d\n4tcn8giIdRkjuDDNRjKpxvjgVKJFHvOEFc8Bk3u3MA7ZdYYMOTiJJfHG9IAW\n9RHGsJGUEKDMyVnm6uNLjCLFHgl8fkgrAVxxajWO7r2AKGBXRw2qj2MRq/Tt\nA+/0wR+6C30PPO0CNCR7VbavndM3AoVIQlMwnqP/GJTdy4FiETMR7wHKSOF8\njBosbxDGhHa+S55coeO+kkDm5rOzlviC1WDgSPWv0fQCSrfooE74tBeng9TT\nmYAyIoYvxz/zt/jHn3e+KBEUxf8pq9LkBpyjCuaRIZyCt9AgJ7UeoQ1HRRs1\n6QYmksCBfICo6FesWoFh8UCdajAxERnsE5GlnT93pOXefeFxKFa5mcT6WVu3\nsErJykAohLeZjmaqkfrjComwF5mx5aSgyb1Xlt54zbtJUXpjYnOAnxCbKIKH\nKJdx9Y1k5NZFXaBura+HjvCegLhqet2kwRIqe+gioVExESqK+S2UCsj1B6NP\n5BPvAZyo8psmrMKfYDat56GHOn4OYwgbyxcV0xhp3PGHG4LKRuNxq9x6NbVH\nkk+SyOWIFvaVaB/0J+9BOcRr3vUWQbzfo/jRAsDdwG/u9rpM3NbBVS7hJ5k1\nwI2yEJhtVKHHpPQY8EybLFKBxu4Nse+A8xEemfSRxfLg8K1SuITOVcmE/hSq\n3Cor\r\n=LBBr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"5c9ef1ab6b834bf22b26550eecee8decd00b5747","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"7.19.1","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"16.6.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"6.x","babel-eslint":"10.x","eslint-plugin-babel":"5.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-flowtype":"4.x","eslint-plugin-react-hooks":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.2.0_1628105348029_0.7037701293414629","host":"s3://npm-registry-packages"}},"0.2.1":{"name":"eslint-config-mitodl","version":"0.2.1","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@0.2.1","maintainers":[{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"eafa15dc1b2ed62dbdb71b11d1cc1b7565c32942","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-0.2.1.tgz","fileCount":3,"integrity":"sha512-iZTk80Cqgt83aRsVoXVXQIXlyjhMMeBTJWG7K2xeVfSNWiyooMBDUTEKwkHDUoBvAp/HbO8yIYQe2/FwnK/lZA==","signatures":[{"sig":"MEYCIQC+L8ONg7FmOGv97J0KLcr3JYJWVgA3/lBo9olAhZgw8QIhALIwjslMUpMoXXwWI6RhcuICsWaa6uK2d6x3l71kGjGr","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEU04CRA9TVsSAnZWagAAO1cP/jI/k1sKhw4nLGtg/mqY\ntv41xyJN/0/96pegC8Gpk/kYRAIGOxJ8gczrtRkHg7kLingflMPfW9SAhfoQ\nBjSRJjhIIHNf9dPvw1VHP7ywqRa6vlXC3UWlKJWUn2Jgf1cd+WSFTXAmZ58S\nqOrERmtAik43aJJTqbS428Mqt68cA+FwyFa8zQvt83RI/uzvhdkCzL/FdQln\nB+wQdRoPwF7A9+AZbyowjFUNcK9nOHR8pH0AeZj2wNyyUA/1tNCnayF9uGAf\nTIZmUrR92QlV/rX1VMSvoQU/kqjb4tYhMJWfbhuctrGjkIhrp5tiiB4cX+r2\nt3xaoc3Woap0mNJ2jD9XQvkWU5jzZmQqRUaI1S57FH45Td+WKsOJEsWufcRI\n4vvT4irnD5Rf7MvKSFkSRg3gPgV9wTFXTbCnjrBPdRFR58lBdaqIky52QQXw\n0z8PorLdjmrtSBd3kuRTEDs9tajWFg8cUOELXxSYAk/nMfSN898N0q/0OASr\nQfPvAKQ9gNQXomWWhBmRgQbIiG0cZECgXWXZsjw5QItjNf9SG2PaaA141vGI\nJ2tPBSf3habj88ZceNR2mKepVPZVy/tlStN2F/Zl1EXwwI/ftwn3Vqtw4GQ5\nHZ94UBMjGofH1GPMYKDuZUeLwNy8EXYn2N6VCfmdlt+LEgj0tMoiqKwj5Wsz\nXf1f\r\n=TlK7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"d9353bf6939434fae86a73e2a47ddd148db8fcde","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"},"_npmVersion":"7.19.1","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"16.6.0","_hasShrinkwrap":false,"peerDependencies":{"eslint":"7.x","eslint-plugin-mocha":"6.x","eslint-plugin-react":"7.x","prettier-eslint-cli":"5.x","eslint-config-google":"0.x","eslint-plugin-react-hooks":"4.x"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_0.2.1_1628523832593_0.6962856345204504","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"eslint-config-mitodl","version":"1.0.0","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@1.0.0","maintainers":[{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},{"name":"mitx-devops","email":"mitx-devops@mit.edu"},{"name":"rhysyngsun","email":"rhysyngsun+npm@gmail.com"},{"name":"gumaerc","email":"gumaerc@mit.edu"},{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"20e6d49a7d6f6ab0be6e981214f4924ca3dbc814","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-1.0.0.tgz","fileCount":6,"integrity":"sha512-GjbRg/6UR5IbW4SakvSGx8Lzp6n4wqX0SqYMs1CWKhGdgtfFCtSs5FhFP+xUJrbLE6UWYISQ62a8c3MyXNQ+Iw==","signatures":[{"sig":"MEYCIQC0J1ksg8rQvmLLZyt9vu5bfSp8N1H+/72l8NZGQ7trNQIhALDAfcF5WU2jVNr2LyRrBbNCYVjq6JvxOTiZuQpXcopp","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17157,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVy6aACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrgKA/+NIt6dTCgaPJ00d7u0dG5PT7r2u0SyMiP500vtRka7pS0CdWj\r\nv0SJL7cQQlxB7qrV2otHCB83nXznhXgxFnxP/GebfW7LxN4lYcPLQtQ78ejN\r\nUVhdNaTCl35gmWXwLwgDiAZ/xoB336Sdaw9m0mHGU5riS9x/x0mEA2Lr0h8L\r\nNkxs03aU5B6MC5+ULYnPDuij/ydDHBjQVHfb20ggLnf2FwcddaVNKZ1hX2g/\r\nbWv5maGgXsWKZ/kzfam2V2Z98yrCXZaGrBsVvj5A0/dDScxJ+G6FJtx/+yxR\r\nvJWCsGcI0h8urxpDGeR7QBggivQwT09do5Gm29HrNj+ajWTyiM0Dcl0K+Mzp\r\n7woU+S2isEi50ApiqG/wc6PHj3DxkTrP4mFPs0yCK8ZScU015yDq7jxbtxll\r\nU/IFC++29k5HonrpdAM2KzFZ7sFZA1SjZvgU9eqr0czaZBLGI/DcOSmzHAg+\r\nc8xlW7cu/1krIWlu6rT/O7gcSyxGfVnW85JHxVfK8EbjoF8D5xXi4d3Sh+rs\r\nuWRR8wBtcIjk0XKcWLdIuzPyV/TFCk67CPBiCUsLjorvGllLuQb+EWxIodvw\r\nYCzp3+7hsP1ekxGhLPGRMK8tSJ0UxOvV/WEG/BtXiBZU99dSCcFWwaiS8QfE\r\nPprQApfGd0IPeEsAFf72a0QtiAfdWz3DC8M=\r\n=Okb0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"74fe485b9dbc913fc625be228ca7a375966f7ee0","scripts":{"test":"eslint --report-unused-disable-directives ./tests"},"_npmUser":{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},"_npmVersion":"8.11.0","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"16.16.0","dependencies":{"babel-eslint":"^10.1.0","eslint-config-google":"^0.14.0","@typescript-eslint/parser":"^5.39.0"},"_hasShrinkwrap":false,"packageManager":"yarn@3.2.3","devDependencies":{"jest":"^29.2.1","eslint":"^7.32.0","typescript":"^4.8.4","eslint-plugin-jest":"^27.1.1","eslint-plugin-mocha":"6.x","eslint-plugin-react":"^7.31.8","eslint-plugin-flowtype":"4.x","eslint-plugin-react-hooks":"^4.6","@typescript-eslint/eslint-plugin":"^5.39.0"},"peerDependencies":{"eslint":"^7.32.0","eslint-plugin-jest":"^27.1.1","eslint-plugin-mocha":"6.x","eslint-plugin-react":"^7.31.8","eslint-plugin-react-hooks":"^4.6","@typescript-eslint/eslint-plugin":"^5.39.0"},"peerDependenciesMeta":{"eslint-plugin-jest":{"optional":true},"eslint-plugin-mocha":{"optional":true},"eslint-plugin-flowtype":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_1.0.0_1666657946630_0.18162156892501957","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"eslint-config-mitodl","version":"2.0.0","keywords":["eslint","mitodl","mit"],"author":{"name":"Alice Pote"},"license":"ISC","_id":"eslint-config-mitodl@2.0.0","maintainers":[{"name":"abeglova","email":"abeglova@mit.edu"},{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},{"name":"mitx-devops","email":"mitx-devops@mit.edu"},{"name":"rhysyngsun","email":"rhysyngsun+npm@gmail.com"},{"name":"gumaerc","email":"gumaerc@mit.edu"},{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"dist":{"shasum":"d9644366f6aec197d39de14f92b67d3d9846b802","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-2.0.0.tgz","fileCount":6,"integrity":"sha512-C3wfeIPby43ZURs9SBtOSjeMN9fg78jin0KGqMq9e/Uxt5XrGIlz5rY+mWRUX7so+5YZtCsx5q7PRj45z+6B2w==","signatures":[{"sig":"MEYCIQC1e1/EgRGmF1TLxo3/do05eqRtHKP/gEq+mj8TtirMOQIhALqAgWBQS3b6YYqaeU99GIxyqRhv4CvhCzNNQYxKM8Gf","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16984},"main":"index.js","gitHead":"f1ff529d9cadcc3460bb0cc35b984971186c39b5","scripts":{"test":"eslint --report-unused-disable-directives ./tests"},"_npmUser":{"name":"gumaerc","email":"gumaerc@mit.edu"},"_npmVersion":"10.2.4","description":"JavaScript style rules for MITODL","directories":{},"_nodeVersion":"21.6.1","dependencies":{"babel-eslint":"^10.1.0","eslint-config-google":"^0.14.0","@typescript-eslint/parser":"^7.0.1"},"_hasShrinkwrap":false,"packageManager":"yarn@3.2.3","devDependencies":{"jest":"^29.2.1","eslint":"^8.56.0","typescript":"^5.3.3","eslint-plugin-jest":"^27.9.0","eslint-plugin-mocha":"6.x","eslint-plugin-react":"^7.31.8","eslint-plugin-flowtype":"4.x","eslint-plugin-react-hooks":"^4.6","@typescript-eslint/eslint-plugin":"^7.0.1"},"peerDependencies":{"eslint-plugin-mocha":"6.x","eslint-plugin-react":"^7.31.8","eslint-plugin-react-hooks":"^4.6"},"peerDependenciesMeta":{"eslint-plugin-mocha":{"optional":true},"eslint-plugin-flowtype":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-config-mitodl_2.0.0_1709827910225_0.8713589457510136","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"eslint-config-mitodl","version":"2.1.0","description":"JavaScript style rules for MITODL","main":"index.js","keywords":["eslint","mitodl","mit"],"scripts":{"test":"eslint --report-unused-disable-directives ./tests"},"author":{"name":"Alice Pote"},"license":"ISC","dependencies":{"@babel/eslint-parser":"^7.11.0","@typescript-eslint/parser":"^7.0.1","eslint-config-google":"^0.14.0"},"devDependencies":{"@typescript-eslint/eslint-plugin":"^7.0.1","eslint":"^8.56.0","eslint-plugin-flowtype":"^8.0.3","eslint-plugin-jest":"^28.6.0","eslint-plugin-mocha":"^10.4.3","eslint-plugin-react":"^7.31.8","eslint-plugin-react-hooks":"^4.6","jest":"^29.2.1","typescript":"^5.3.3"},"peerDependencies":{"eslint-plugin-flowtype":"^8.0.3","eslint-plugin-mocha":"10.x","eslint-plugin-react":"^7.31.8","eslint-plugin-react-hooks":"^4.6"},"peerDependenciesMeta":{"eslint-plugin-flowtype":{"optional":true},"eslint-plugin-mocha":{"optional":true}},"packageManager":"yarn@3.8.3","_id":"eslint-config-mitodl@2.1.0","gitHead":"a0181845090246f3eefe6191a5b73e8312653ba2","_nodeVersion":"20.11.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-HoRevkrwkMSZ6GRzWImDqj4g9c0pG/vQFXX84cmthxSW77axDPmsAISQiva1XWt0UtTdNDajONN34r4vb6Lj5w==","shasum":"44b51e8b934434082a215ab258057e97eb9eb3d3","tarball":"https://registry.npmjs.org/eslint-config-mitodl/-/eslint-config-mitodl-2.1.0.tgz","fileCount":7,"unpackedSize":17179,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5UiavM7q/sEjWsdl7vbChd9JlfywnguXY3mcjRG80bAIgNBrkQHMhv+VYos2Fg7cAB6K1VU1/lYNpwYBs1lbOMSI="}]},"_npmUser":{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},"directories":{},"maintainers":[{"name":"abeglova","email":"abeglova@mit.edu"},{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},{"name":"mitx-devops","email":"mitx-devops@mit.edu"},{"name":"rhysyngsun","email":"rhysyngsun+npm@gmail.com"},{"name":"gumaerc","email":"gumaerc@mit.edu"},{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eslint-config-mitodl_2.1.0_1720730354154_0.12227992273549249"},"_hasShrinkwrap":false}},"time":{"created":"2017-09-27T14:41:06.218Z","modified":"2024-07-11T20:39:14.533Z","0.0.1":"2017-09-27T14:41:06.218Z","0.0.2":"2017-09-27T15:26:38.533Z","0.0.3":"2017-09-27T15:29:11.313Z","0.0.4":"2017-10-05T18:08:56.817Z","0.0.5":"2018-11-09T21:16:44.001Z","0.0.6":"2019-08-21T14:22:59.397Z","0.0.7":"2019-08-21T15:07:19.119Z","0.0.8":"2020-08-25T15:18:50.469Z","0.1.0":"2021-05-12T20:04:39.181Z","0.2.0":"2021-08-04T19:29:08.195Z","0.2.1":"2021-08-09T15:43:52.730Z","1.0.0":"2022-10-25T00:32:26.943Z","2.0.0":"2024-03-07T16:11:50.369Z","2.1.0":"2024-07-11T20:39:14.294Z"},"author":{"name":"Alice Pote"},"license":"ISC","keywords":["eslint","mitodl","mit"],"description":"JavaScript style rules for MITODL","maintainers":[{"name":"abeglova","email":"abeglova@mit.edu"},{"name":"cchudzicki","email":"cchudzickinpm@gmail.com"},{"name":"mitx-devops","email":"mitx-devops@mit.edu"},{"name":"rhysyngsun","email":"rhysyngsun+npm@gmail.com"},{"name":"gumaerc","email":"gumaerc@mit.edu"},{"name":"aliceriot","email":"alice.writes.wrongs@gmail.com"}],"readme":"# MITODL eslint configuration\n\nThis is our preferred configuration for `eslint`. To use it:\n\n```sh\nyarn add eslint-config-mitodl\n```\nThere are four configs included. They are:\n```\neslint-config-mitodl      // base config with support for Typescript and JS\neslint-config-mitodl/jest\neslint-config-mitodl/mocha\neslint-config-mitodl/flow\n``` \nand then change your `.eslintrc` to have:\n\n```json\n{\n  \"extends\": [\n    \"eslint-config-mitodl\",\n    \"eslint-config-mitodl/jest\"\n  ]\n}\n```\nOr, to support FlowType and Mocha in older projects:\n\n```json\n{\n  \"extends\": [\n    \"eslint-config-mitodl\",\n    \"eslint-config-mitodl/flow\",\n    \"eslint-config-mitodl/mocha\"\n  ]\n}\n```\n\nThis package has several peer dependencies (eslint plugins for react and\nflow, prettier, etc) so make sure you satisfy those! Once you do you\nshould be in linting heaven.\n\n## Local development\nRun tests with `yarn run test`. The tests are very basic, just checking that some simple eslint errors are raised where expected.\n\n## JavaScript style\n\nThis is an opinionated setup. It enforces a number of things which\n`prettier` and `eslint --fix` can automatically fix, like:\n\n- no semicolons\n- no `let` where `const` will do\n- always align values in object literal declarations\n- spaces in parentheses and around operators (like `+`, `=`, etc)\n\nas well as a lot of specific things related to our standard tooling (e.g.\ndisallowing the `.only` method on mocha tests).\n\nHowever, there are a number of style guidelines we try to adhere to which\nthere aren't, as yet, any rules in `eslint` for. This README seems as good\na place as any to write them down, so here we go:\n\n### import order\n\nWe prefer to import things at the very top of a file in a few sections.\nThese should be separated by a blank line, and in the following order:\n\n- external dependencies\n- our own react components\n- our own library functions (i.e. things other than react components)\n- flow types\n\nhere's an example:\n\n```js\n// @flow\nimport React from \"react\"\nimport DocumentTitle from \"react-document-title\"\nimport R from \"ramda\"\n\nimport Card from \"../components/Card\"\nimport { myGreatComponent } from \"../components/SoGreat\"\n\nimport { libraryFunctions } from \"../lib/someLib\"\nimport { actions } from \"../actions\"\n\nimport type { LibType } from \"../flow/libTypes\"\n```\n\nnot\n\n```js\n// @flow\nimport React from \"react\"\nimport DocumentTitle from \"react-document-title\"\nimport R from \"ramda\"\n\nimport Card from \"../components/Card\"\nimport { actions } from \"../actions\"\nimport { myGreatComponent } from \"../components/SoGreat\"\nimport type { LibType } from \"../flow/libTypes\"\nimport { libraryFunctions } from \"../lib/someLib\"\n```\n\nordering them this way just makes it easier to find and change imports\nwhen you need to, and makes it visually easier to scan.\n\n### prefer functional components where possible\n\nIf you are writing a simple component which just takes props and renders\nUI, and you don't need to use lifecycle methods or `this.state`, you can\noften put a little bit less code on the page by writing your component as\na pure function instead of an ES6 class.\n\nSo prefer this:\n\n```js\nexport const SimpleComponent = ({ name }) => (\n  <div className=\"simple-component\">\n    { name }\n  </div>\n)\n```\n\nto this:\n\n```js\nexport class SimpleComponent extends React.Component {\n  render () {\n    const { name } = this.props\n    return (\n      <div className=\"simple-component\">\n        { name }\n      </div>\n    )\n  }\n}\n```\n\nHowever, if you need to use lifecycle methods or `this.state` you will\nneed to use a class-based component.\n\n### prefer async / await syntax\n\nThe [async function\nexpression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/async_function)\nis a nice bit of syntactic sugar that we have in JS now. It basically lets\nyou write async code (using Promises) in a way that looks synchronous. It\nends up being a lot more readable usually.\n\nSo we prefer this:\n\n```js\nexport const fetchUserInfo = async (userID: string) => {\n  const response = await fetch(`/users/${userID}`)\n  const json = await response.json()\n  return json\n}\n```\n\nto something like this:\n\n\n```js\nexport const fetchUserInfo = (userID: string) => {\n  return fetch(`/users/${userID}`).then(response => {\n    return response.json()\n  })\n}\n```\n\nIf you need to `.catch` an async action which can fail you can use a `try\n/ catch` to achieve the same thing in an async function:\n\n```js\nexport const fetchUserInfo = async (userID: string) => {\n  try {\n    const response = await fetch(`/users/${userID}`)\n    const json = await response.json()\n    return json\n  } catch (e) {\n    alert('OH NO!')\n  }\n}\n```\n\n### keep render small, put it at the bottom\n\nThe render function should ideally just pull props out of `this.props` and\nthen return JSX. However, often we need to do a little bit of data\nprocessing, even in a purely presentational component, such as pulling\na few props out of an object, setting up callbacks, etc. It's best to\nwrite a few small helper functions which do this work and keep excess code\nout of the render function. So we prefer something like:\n\n(warning: pseudocode ahead!)\n\n```js\nconst DEFAULT_IMAGE = '/img/puppies.jpg'\n\nclass ProfileImage extends React.Component {\n  updateProfileImage = async (image: Image) => {\n    const { dispatch } = this.props\n    dispatch(actions.updateProfileImage(image))\n  }\n\n  getUsersProfileImage = () => {\n    const { username, profileImages } = this.props\n    return R.propOr(DEFAULT_IMAGE, username, profileImages)\n  }\n\n  render () {\n    return (\n      <div className=\"profile-image\">\n        <img src={this.getUsersProfileImage()} />\n        <button onClick={this.updateProfileImage}>\n          UPDATE!!!!\n        </button>\n      </div>\n    )\n  }\n}\n```\n\nto something like:\n\n```js\nconst DEFAULT_IMAGE = '/img/puppies.jpg'\n\nclass ProfileImage extends React.Component {\n  render () {\n    const {\n      dispatch,\n      username,\n      profileImages\n    } = this.props\n\n    const profileImage = R.propOr(DEFAULT_IMAGE, username, profileImages)\n\n    const updateProfileImage = (image: Image) => {\n      const { dispatch } = this.props\n      dispatch(actions.updateProfileImage(image))\n    }\n\n    return (\n      <div className=\"profile-image\">\n        <img src={profileImage} />\n        <button onClick={updateProfileImage}\n          UPDATE!!!!\n        </button>\n      </div>\n    )\n  }\n}\n```\n\nThis is obviously a bit of a trivial example, but in cases where we have\ndozens of hundreds of lines of helper code that needs to be run before we\ncan return any JSX, pulling things out into simple, well-named helper\nmethods can be a huge clarity win.\n\nAlso, the `render` method should always be the last method defined in\na class.\n\n### prefer functional code\n\nIf something can be written as a series of small, composable functions, do\nso!\n\n### Use container components for pages when it makes sense\n\nWe generally follow the [standard react / redux\npattern](http://redux.js.org/docs/basics/UsageWithReact.html#presentational-and-container-components)\nof separating presentational and container components.\n\nHow that plays out is we generally use a container component for each\nlogical 'page' in our SPAs. This container handles fetching any data from\nthe backend that the page needs to display its UI, binds any callbacks for\nmaking calls to the backend, etc. The container renders its UI by passing\nprops down to presentational components, which don't have explicit\nknowledge about where the data is coming from or what the callbacks they\nare handed do. This simplifies testing the presentational parts of the UI,\nsince they can be tested using enzyme, sinon, and our factories in\na straightforward way. When we have pages that hit several APIs, bind\na few dozen callbacks, and need to render many different components, this\nis a big help.\n\nHowever, there are cases when the 'one container per page' pattern can\nbreak down a little. Consider the case of the 'profile image' component\n[in\nmicromasters](https://github.com/mitodl/micromasters/blob/master/static/js/containers/ProfileImage.js).\nWe wanted to have a small component, in several places in the app, which\nshowed the user's profile image and, on the user's own profile and\ndashboard, provided a means to upload a new profile image. This component\nneeded to appear on several different pages, and we wanted the same\nfunctionality everywhere.\n\nThis presents a challenge to the container component pattern. To get the\nfunctionality we wanted in the 'strict' container pattern we would need to\nbind the same 'updateProfileImage' type callback on every page where we\nwanted to show the profile image and allow the user to update it. This\nwould lead to potentially subtle bugs, if the implementation in one\ncontainer component drifted slightly from another, if a developer were\nunaware of the implementation details when adding the component to a new\npage, etc. So in this case what makes sense is to have the `ProfileImage`\ncomponent be a container itself, which is self-contained and gets mounted\nin several places.\n\nIt's a judgment call where to draw the line on this sort of thing, but in\ngeneral we should stick to the 'one container per page' guideline where it\nmakes sense, and directly connect small components to the store where it\nmakes sense. There's no real penalty to having many container components\nconnected to the store, so this is mainly a guideline for enforcing some\nboundaries on how we write this kind of code and how it gets laid out.\n\n### stick to a standard directory layout\n\nWe generally use something like the following:\n\n```\nstatic/js\n├── actions    # redux actions\n├── components # presentational components\n├── containers # container components\n├── data       # any static data\n├── entry      # all webpack entry scripts\n├── factories  # factories and fixtures for tests\n├── flow       # flow declaration files\n├── lib        # library files\n├── reducers   # redux reducers\n├── store      # redux store config\n└── util       # utility functions\n```\n\n\nEach of these might have subdirectories for e.g. all of the components\nrelating to a particular feature, or libraries that logically group\ntogether (in `/lib`). \n\n### library code vs helper methods\n\nIn general if you're writing a series of helper functions for a React\ncomponent, and you begin to even suspect that they might be useful\nelsewhere they probably belong in a library in `/lib`. A few examples of\nthings that are good candidates for pulling out into a library:\n\n- validation code\n- functions for parsing or generating URLs\n- API functions\n- functions for displaying prices, dates, or other specialized values\n\nReally anything which is going to be implemented as a small collection of\npure functions is a good candidate! Pulling things out into `/lib`\nencourages writing pure functions, encourages good testing procedures, and\nencourages separating data processing logic from the actual UI code.\n","readmeFilename":"README.md"}