{"_id":"hula-hoop","_rev":"37-4cc079559e2277ef9edfa85ac0f327c3","name":"hula-hoop","description":"Thorax server-side Hapi components","dist-tags":{"latest":"1.2.0"},"versions":{"0.0.1":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.0.1","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"4.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"_id":"hula-hoop@0.0.1","dist":{"shasum":"f6249d0b768758cf35cadfb7adddcbb43a939ebb","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.0.1.tgz","integrity":"sha512-HScyxUXapynyGqXuI1OCGpI73DomOpYD4uzem1cx8ewm2y8IOpbrTXx70wm2H0sPigZcI6k1oL6kCfcO7MU2rA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4E9W72wJmI2k60Viiiw+J4pIUh79kwQuprG2+pTu+gAiEAz9qHOaKt+8t6XEEeu4xhh7qkhBk0fwo0bIf/NgHRDks="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]},"0.0.2":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.0.2","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"4.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"_id":"hula-hoop@0.0.2","dist":{"shasum":"490e4d1966a6ffa9eb2cc99d0b1291cd73797bbd","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.0.2.tgz","integrity":"sha512-nl9z0TsrGFAIsfTPxdPd50pJd8SzjkatI/cwaCjf8EXHxtrIRXgsonsIEdqZDTdKLQbPnDj+5YGXSLI3F+Yhgg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICVXajUJqBdlOBZOSOkKhCYdyrvEfH1q5sHnVVJBpXdZAiAB2KSd4FX3S+hsChVmJW15HdGYfOVpu+pHIODQiJs/5Q=="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]},"0.1.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.1.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"5.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"_id":"hula-hoop@0.1.0","dist":{"shasum":"34bd4fb3c83de3e21d66849e90230cc339988266","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.1.0.tgz","integrity":"sha512-i7VZPp1Qd//mtej4STt5QoWnsRNQ+Rb//zlpZLZHTYuz9/IRwxvxiv7vUgZHVkZa67Z9BBT96kBeL0IA+2/hDg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIATmkobGwi6Ez7zWpiYm8durYx+PNcSKj540XlzFvCPWAiEA4xwfoKDfc5iOSCLeStHluOc6lAyy+KsgrX5OswNS3vA="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]},"0.2.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.2.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"5.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"_id":"hula-hoop@0.2.0","dist":{"shasum":"7ad3a176fd9a384640358441efa68c1e3acb0138","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.2.0.tgz","integrity":"sha512-9QU77mP0TlFTY033se1Owvw5bGSJ0f7q1RCJVyIDXeQnWX+ZIuN0AtR6qHgeFbVdWR/ScQahIX5arfPSqDpXJQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpAj66PGJrecyawFfEMwH1A7pPQglZlcPEUVsZ8JLOOAIgI5uAnKGzAjjmTjuWbIQdZDFkYFn782Woju664k1sA/0="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]},"0.2.1":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.2.1","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"5.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"_id":"hula-hoop@0.2.1","dist":{"shasum":"c00c80c16f73c08fa12dc927f9919cd4228adfbb","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.2.1.tgz","integrity":"sha512-yiQ8M3qWfJTB7omgwsv+7hXKv5SRM/17RwbMzIIobVdxHGd4boKHB17DXKQJpq6oJUBOtQqu1pgv68gRJkpYzQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCf9SLK8mEWZNTIokTYpwgbPg/4asQN8Ud/q06D3GyrYwIgOdqt64o1r7bN2RZfH7oQj8NUOBTJoGQrT7u3pkt5NbM="}]},"_from":".","_npmVersion":"1.4.3","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}]},"0.3.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.3.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"3bb19ed6f5a3fe1a9c1bddab30867e4860263ac7","_id":"hula-hoop@0.3.0","_shasum":"64a4b4b1201693daa480d57ad159acbc975cd81b","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"64a4b4b1201693daa480d57ad159acbc975cd81b","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.3.0.tgz","integrity":"sha512-5RzL0JEm2T1ZqAyF8NJXBlaThG8Bzpk7B952+tH/YLjBtn1OgYCV6i35VAlwIBo5KgCY5AhoIceIIt1H95WZtQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEvQQZoJ6zewvdbwkbkT6VAEyj+ov/PYyt8zp9F5fYpMAiEAiZEaiXcjW278B4xpHHNirvdQugKgU+4BWYXBrCK51HE="}]}},"0.4.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.4.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"cca8cb019a948292889205ed9c01d97f266b88bd","_id":"hula-hoop@0.4.0","_shasum":"a01d76a991eac4dfeaf3f60945b3fa2065dbd7c4","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"a01d76a991eac4dfeaf3f60945b3fa2065dbd7c4","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.4.0.tgz","integrity":"sha512-gOw2UHbjrdmjtyNTkxZ/PaJg5gd5/+gVCE729K/s+e+bmMsQ+/681JqxSVB9t+4OvASwZzRIiDCT9vjbc//Otg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC80jH/a8ed/T/QE7B773PPval+cGyKI5A0MQaWd+1pPwIgRJG107LxvmgmljrlmZ1wgsT41v9wITBZbcpjZS1vKoE="}]}},"0.5.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.5.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"35ab2c361e786354b2aec563da0a1899c508e8c1","_id":"hula-hoop@0.5.0","_shasum":"626c66886b09d04c25d024e9114712ea1968fe0f","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"626c66886b09d04c25d024e9114712ea1968fe0f","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.5.0.tgz","integrity":"sha512-qHEdiqwufMG2YS35Notew9Wjuf/2/EpBD+23WW8J8nj7G2yTW1tfWt9mC4I6+zP5uONbKH7k8tAUuvM2fauSmg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCY7DpqkvpHCrHicYgs0Qa5EjGPdIW+DhPUW2t0EjpNmwIhANFXlAvFmFGIj64viBs8kdeZ/TcvO+VAMFpYF57PTIm8"}]}},"0.6.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.6.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"b90f87a4ff4b3b4b8c6787d39e1637106ab186bd","_id":"hula-hoop@0.6.0","_shasum":"dbeacd2bc7397858aee9d374542aa5d196477cba","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"dbeacd2bc7397858aee9d374542aa5d196477cba","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.6.0.tgz","integrity":"sha512-Xb8WPpo3KVqPka0mkEOFf19X1lonu9j7D/+/SDfhRRh2kbLVCpJ5FSGFo8x3C3jjSM+3VUiQkU6luSKh7E8kGQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBXZXzjFY/gLUNDoC758AwM41gJeK64JBGtznwxZaBlIAiAPfueF4vJRZ0Ms1drNc6KSGY7OefZKPXsEWNEaK4UXIg=="}]}},"0.7.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.7.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"82a07b51c00d18432054edf621e7b8f4b27988a4","_id":"hula-hoop@0.7.0","_shasum":"068e9103d290a5853cc1affffa5f49c206470f57","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"068e9103d290a5853cc1affffa5f49c206470f57","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.7.0.tgz","integrity":"sha512-HPmcgrSWw+rP1U577MXV6xUU8hk9lYP7ztDhcR9I5XMwS0mwtFltS3RJN6aqob5UHQr7oZMH9Ruu/CGaN9uNFA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCd66rDcuOvBrk41o3UJaxiRRSf/bA3Gg4LPPK3ks/JvwIhAKSO1y6Uql1MJR2I+msqaEnkPy2uf0bb8XBc0OkPvr6a"}]}},"0.7.1":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.7.1","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"f46818ba9ef22cf13ff57b2ceac995634df8e35c","_id":"hula-hoop@0.7.1","_shasum":"8641b191c08a6e6dbee394ae674ccab9a74548cf","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"8641b191c08a6e6dbee394ae674ccab9a74548cf","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.7.1.tgz","integrity":"sha512-8v4MHFMvITsIqdiqVCtzCKQu8CZclJeGSdgk4tH2aGGwh9rOoJpfZMswzQ3LIAuXPmoq7dasjpc1QkjO6spC1w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFdv5NM+msbU4Ui8xGYp6uLPlU5Mzl4g75UMncZHgrf4AiAfHSTqm0DDX7gVI+kXu/tiV9HRR5Abu+lsP2oyZUN6XQ=="}]}},"0.8.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.8.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"7ab367d00230a50bfa435bc44da275d71e4adc71","_id":"hula-hoop@0.8.0","_shasum":"9c4c5590ab046e46704b839150b24aeba10f62f0","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"9c4c5590ab046e46704b839150b24aeba10f62f0","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.8.0.tgz","integrity":"sha512-90SZG2GysMFwDy9q2/bRl4aeB96VZ4qwtU8/sxv0wk+pzaEiRKHtAT3wzCjZaefYFQ1kiapToKd+30ImWHOq7A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWQjNeakoZeKNGo2KhmsS81pX9YV9zJstNYIChbbIcHQIhAJU72gCVT+qKL8Z8dif9cwY+6UzMzOidTBf4S8I1ai8F"}]}},"0.8.1":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.8.1","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"05828b3a66bbb9d6fc25fb6f7d2865d078bc397c","_id":"hula-hoop@0.8.1","_shasum":"4d3f446a494a170d04d011a6fbfae1198bc1f450","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"4d3f446a494a170d04d011a6fbfae1198bc1f450","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.8.1.tgz","integrity":"sha512-LnyIDa5A8n7BvChx0eK65xgQgg50C0oqy3tIoamplxedA+G0VWVWxf7Os5g0rzd1Lx2dRm0EsnJrb/3YqtHMaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8so+vddEWVpjarG8H6XyLDvIgD7jHwzzOCuTMMzWYvgIhAIs2ntxZacjFEIDEbmOfPPgyculjcpdJovUJ7gBgHRv5"}]}},"0.9.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"0.9.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"9a9f658c270da3a0005c10883318baed56bc949c","_id":"hula-hoop@0.9.0","_shasum":"2e8ac9a4e7bef3a54a4787f77ccd7ce2e9efc281","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"2e8ac9a4e7bef3a54a4787f77ccd7ce2e9efc281","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-0.9.0.tgz","integrity":"sha512-NocCOXDAdsF1VjVk/7sHeWBuIw//G/5QYnGl3304HgNYxTvMSpoJNgJBwAkGO1TYigXrkUUk0pa+nSj9CSbRaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCl6sYhMxt/dV+3aM0hR1fkvXfIkGOTjbuYRxh+DiasQwIgZMRqP7OJcOjRwXbrZ9NUaVEa4uYyTcKoRaYJlGYd+sc="}]}},"1.0.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"1.0.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"6.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"b11c97ebd6180aaac5a8357eec9c2fe7d04bab2c","_id":"hula-hoop@1.0.0","_shasum":"5099033851e2f5c4d061a634244a5576eb218bf6","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"5099033851e2f5c4d061a634244a5576eb218bf6","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-1.0.0.tgz","integrity":"sha512-V5WNzkzeTWbAU64SOKlauLuzmdQOYlmaU4uUVHXz946h2IDRqgPJghsvhKHkng2+C2xC2rd9v7BBxK2/Q04VRg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUxDp9PAVK1uLwjiFjCok03bbE5w+AhOlHjdif3ZMZcwIhAIY82sBSv0YrCv0en5ihXApOr5MPQpH7IyChx2mimiqy"}]}},"1.1.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"1.1.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"boom":"^2.6.1","fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"8.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"4ac229459d4e4d5a6f5c7d4075680e4f22749afd","_id":"hula-hoop@1.1.0","_shasum":"c3adc2a5a1ac40825f060d3e3aed4146c7c96aa4","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"c3adc2a5a1ac40825f060d3e3aed4146c7c96aa4","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-1.1.0.tgz","integrity":"sha512-JRq3GxliStYKpug5yltt2JmzVHHq239U+C2vn09geTmC44dM6CYTre4+/HHYem5S2aJGmxEMehSu2zPc6xfBzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGBHKraEBxZinRNyYf7O2O7cJQmV+Tf3rBZlKRBFVrQ3AiEAiBhsQ9Z5zk6khPuj2cdWfYP929wC0wG84h9L6G3JtP4="}]}},"1.1.1":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"1.1.1","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"boom":"^2.6.1","fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"8.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"34d6127040f5c13b3eab3c01ad0e471e7b3897d2","_id":"hula-hoop@1.1.1","_shasum":"bfc0be4adc3daad66d13979e6e9462496bf0acfa","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"bfc0be4adc3daad66d13979e6e9462496bf0acfa","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-1.1.1.tgz","integrity":"sha512-GNfNPgijoZWTturyfWEW9xq/Fxq7ewwP9j7nnYEgsPwdbWQSv+D+kuPQdSpiDKPJfwKy0h9lg0cETOryMvAGlQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS8hthWIISyk7Lcb+4VWM7HaPDKd+Nd62hyQL2upxWzwIhAKfqPTKmjrWhfjxrdIjT2h88s6Bxh4vdRhp8QhAGzw9I"}]}},"1.2.0":{"name":"hula-hoop","description":"Thorax server-side Hapi components","version":"1.2.0","authors":["Kevin Decker <kpdecker@gmail.com> (http://incaseofstairs.com)"],"main":"index","engines":{"node":">=0.10.6"},"dependencies":{"boom":"^2.6.1","fruit-loops":"0.x.x","semver":"2.x.x","underscore":"1.x.x"},"devDependencies":{"chai":"1.x.x","hapi":"8.x.x","istanbul":"0.2.x","mocha":"1.x.x","sinon":"1.x.x","sinon-chai":"^2.5.0"},"scripts":{"test":"make ist"},"gitHead":"baa892001e6c3aada9e37bb3995f2ff4338cd50e","_id":"hula-hoop@1.2.0","_shasum":"43ba31bf9753dcd09868f0f41aa5e37f58172a53","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"kpdecker","email":"kpdecker@gmail.com"},"maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"dist":{"shasum":"43ba31bf9753dcd09868f0f41aa5e37f58172a53","tarball":"https://registry.npmjs.org/hula-hoop/-/hula-hoop-1.2.0.tgz","integrity":"sha512-yui9xsxkB6iJwedYwm2IsTDtLSqnc3Zxn2FJBdJXfT6XyLZAUS9yHn7VqYHMJhqyptjS/ByabLwuTuEJBDYhqg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB03OVFJLZVjBD3E5Gt5QHHpFhKNeWWrgzq627OTdmSvAiEA60/YkAkIhLBgbZUFHewXtyDgYIn1fmb/0oOVbRDJF2Y="}]}}},"readme":"# Hula-Hoop\n\nServer-side rendering components for [Circus][]/[Lumbar][] + [Thorax][] + [Hapi][] stacks.\n\nProvides common endpoints and libraries implementing:\n\n- Route-based [Fruit-loops][] server-side rendering\n- Automatic fail over to client-side rendering\n- Application resource loading and serving\n- Conditional branch loading\n\n## Usage\n\n```javascript\nvar HulaHoop = require('hula-hoop');\n\n// Setup resource handling\nHulaHoop.api.resourceLoader.register(appName, [\n  {name: 'main', version: '1.0.0', path: './build'}\n]);\nserver.route([\n  {\n    path: '/r/{path*}',\n    method: 'GET',\n    handler: HulaHoop.endpoints.resources(),\n    config: {\n      cache: {\n        expiresIn: 365*24*60*60*1000\n      }\n    }\n  }\n]);\n\n// Setup the user endpoint routing\nvar pageHandler = HulaHoop.endpoints.page(appName, {\n  host: 'foo.com',\n  resourceRoot: '/r/'\n});\n\nserver.route(\n  HulaHoop.api.resourceLoader.routes().map(function(route) {\n    return {\n      path: route,\n      method: 'GET',\n      handler: pageHandler,\n      config: {\n        cache: {\n          expiresIn: 5*60*1000,\n          privacy: 'private'\n        }\n      }\n    };\n  })\n);\n```\n\nThis assumes that `./build` has the contents of the built Thorax application and the either the `module-map.json` file has been generated via the `hapi-routes` grunt task or the `circus.json` file has been properly constructed via the route converter plugin.\n\n## Server vs. Client Side Rendering\n\nHula-hoop is able to conditionally return either server rendered HTML content or a simplified page suitable for complete client-side rendering. This optimizes the use of Fruit Loops page instances to the cases that are going to benefit and allows for rendering failover, should errors occur in supported server side cases.\n\nThis behavior is controlled via the project config file and generally should be transparent for most users. It may be AB tested via the `serverRoute` config option, discussed in the `endpoints.page` documentation below.\n\n## Resources and Branches\n\nHula-hoop maintains a list of all resources that are involved with running a given Thorax application via the `api.resourceLoader` API. Resources registered through this API can easily be served to clients and concurrently used for server-side rendering.\n\nAdditionally, it can serve multiple versions of an application on the same endpoint in support of application-level AB testing or staged deploys. This is done by swapping the served index files through the `resourceLoader.index` API.\n\n\n## API\n\n### endpoints.page(app, options)\n\nConditionally renders the requests using client-side or server-side rendering based on:\n- `serverRoute` flag specified in project config file\n- `userConfig` flag `serverRoute` flag\n  - `serverRoute === false` disabled all server-side rendering\n  - `serverRoute[hapiPath] === false` disable server-side rendering for a specific route\n\nShould an error occur while rendering the server-side page, the response will failover to the client-side rendering after logging the response.\n\n`options` is the combined list of options for both the `endpoints.serverSide` and `endpoints.clientSide` handlers discussed below.\n\nOne distinction is that `finalize` is passed an additional parameter specifying whether or not server side rendering was used to generate the final response. `finalize(req, response, wasServerSide)`\n\nOn caching, this endpoint will emit custom cache headers if server-side rendering is utilized, based on the resultant cache calculated from the AJAX requests made during the page's execution cycle. Any cache values defined on the hapi route definition will be utilized for the client-side response only.\n\n### endpoints.serverSide(options)\n\nRenders the given request using the server-side rendering engine. Errors are treated as fatal WRT the response lifecycle.\n\nOptions include:\n\n- `host`: Host value used to generate `window.location` and perform relative AJAX calls. Example: `github.com`.\n- `resourcesRoot`: Root prefix that is stripped to map client resources to server files. Example: `/resources/scripts`\n- `poolSize`: Maximum number of page instances to maintain in the pool. This defaults to `5` and should be tuned for both the memory and traffic load of particular applications while in production.\n- `cacheResources`: Boolean flag. True to cache loaded html and script resources indefinitely.\n- `publicConfig(req, reply)`: Used to generate the configuration for a given request. Used primarily to retrieve the `branch` field to select the rendering branch to utilize.\n- `ajaxCache`: Catbox cache used to cache AJAX responses retrieved via page execution.\n- `beforeExec(page, next)`: Fruit Loops pool `beforeExec` method. Can be used to initialize pages to known states. Example:\n\n```javascript\n    function(page, next) {\n      // Provide a default seed value (and also avoid a NPE in lumbar loader due to missing\n      // screen object\n      page.window.devicePixelRatio = 2;\n      page.window.phoenixConfig = siteConfig;\n      next();\n    }\n```\n\n- `beforeNavigate(page, isExistingPage, next)`: Optional callback called before Backbone's route handlers. Must call `next` once complete to continue page execution.\n- `cleanup(page, next)`: Fruit loops Pool `cleanup` method. Used to perform cleanup after a response has been sent to the user, but before the page object is returned to the pool. Example:\n\n```javascript\n    function(page, next) {\n      page.window.Backbone.history.trigger('cleanup');\n\n      next();\n    }\n```\n\n- `maxServerExpires`: Maximum cache timeout for server side responses, in seconds. Defaults to 24 hours.\n\nMany of theses options map directly to Fruit Loops Pool options, whose [documentation][fruit-loops-pool] contains additional information.\n\nLogging:\n- `['server-side', 'pool']`: Navigation started. Includes page instances in existence and free as well as the number of queued requests in the data section.\n- `['server-side', 'error']`: Error occurred while executing application logic.\n- `['server-side', 'exec']`: Successful server-side rendering execution. Data includes various metadata regarding the response.\n\n\n### endpoints.clientSide(app, options)\n\nRenders the index for a given `app` in a manner suitable for client side rendering. If a config is generated for the user, this will be inlined in the response.\n\n`options`:\n- `configVar`: Required JavaScript identifier that will receive the inlined config. This may be any valid, assignable JavaScript construct. Ex: `var foo`, `Foo.bar`.\n- `userConfig(req)`: Used to generate the configuration for a given request. The return value's `branch` field will be used to select the resource branch to render.\n- `finalize(req, response)`: Allows arbitrary modification of `response` prior to successful return. This can be used to attach state or custom headers to the response, etc.\n- `heartbeat`: Truthy to enable simplified success only response\n\nThis will serve the index file that is associated with the app. Dependent resources for a particular route can be defined in the `js` and `css` fields on the route info object (See `api.resourceLoader.routeInfo`) and will be inserted wherever `<!-- hula-hoop: scripts -->` and `<!-- hula-hoop: links -->` comments are found in the index file.\n\nThese comments can also implement a fail-over through `begin` and `end` pairs:\n\n```html\n<!-- hula-hoop: begin scripts -->\n<script src=\"failover\"></script>\n<!-- hula-hoop: end scripts -->\n```\n\nWhich will be removed when run within hula-hoop, allowing for other environments such as test environments to execute on the same index file.\n\n### api.resourceLoader\n\nMaintains a versioned list of files and routes associated with the webapp.\n\n#### .register(app, resources)\n\nRegisters the set of resources supported by a given application.\n\n- `app`: any unique string that identifies this particular application\n- `resources`: Array of resource objects:\n\n```json\n  [\n    {\n      \"name\": \"a\",\n      \"version\": \"1.0.0\",\n      \"path\": \"./mweb-a\"\n    },\n    {\n      \"name\": \"b\",\n      \"version\": \"1.1.0\",\n      \"path\": \"./mweb-b\"\n    }\n  ]\n```\n\nEach resource object defines:\n\n- `name`: Name of the branch for this resource. This is the value used when using the `index` API below.\n- `version`: Semver value of this version. If omitted name will be used to determine the default index file.\n- `path`: Path to the directory containing this branch's source.\n\nWithin the resource directory, the `index.html`, `circus.json`, and `module-map.json` files are given special treatment. All other files must not have duplicates and should be versioned via a system such as [lumbar-long-expires][] or webpack hashes.\n\nThe project configuration file, `module-map.json` or `circus.json`, contains the route information for the application and will not be exposed as a resource available for consumption on the `asset` or `assetContainer` APIs. If using Lumbar, this can be generated using the [hapi-routes](#hapi-routes) grunt task included in this project and webpack builds using the [router converter plugin](#route-converter).\n\n#### .index(app, branch)\n\nRetrieves the index file path for a given application and branch. Should the `branch` not be found, the index file from the highest versioned branch will be returned. Branches that are not versioned will use the last sorted name.\n\n#### .asset(path)\n\nRetrieves the file system path for a given resource path.\n\n#### .assetContainer(path)\n\nRetrieves the root directory that contains the file with the given resource path.\n\n#### .routeInfo(branch, route)\n\nReturns the module map metadata for a given app branch and route.\n\n#### .routes()\n\nReturns all routes supported by all registered apps and versions.\n\n\n## Grunt Tasks\n\n### hapi-routes\n\nGenerates the module-map file utilized by `resourceLoader` to track the routes supported by a given application.\n\n```javascript\n  grunt.initConfig({\n    'hapi-routes': {\n      map: {\n        options: {\n          package: 'web',\n          dest: buildDir + '/module-map.json'\n        }\n      },\n      release: {\n        options: {\n          package: 'web',\n          dest: 'build/' + releasePrefix + '/module-map.json'\n        }\n      }\n    }\n  });\n\n  grunt.loadNpmTasks('hula-hoop');\n```\n\nNote that using this task requires that [lumbar][] be installed as a sibling of hula-hoops at build time. Any arguments passed in the options field will be forwarded to the lumbar constructor, allowing for plugins and libraries to be specified.\n\n\n## Webpack Plugins\n\n### route-converter\n\nGenerates a `hulahoop` structure for `circus.json`, used to configure hula-hoop at runtime.\n\nThis should be passed in to the webpack plugin configuration object.\n\n```javascript\nvar RouteConverterPlugin = require('hula-hoop/webpack/router-converter');\n\n...\n\n  plugins: [\n    new RouteConverterPlugin()\n  ]\n\n...\n```\n\n[Fruit-Loops]: https://github.com/walmartlabs/fruit-loops\n[fruit-loops-pool]: https://github.com/walmartlabs/fruit-loops#pooloptions\n[hapi]: https://github.com/spumko/hapi\n[circus]: https://github.com/walmartlabs/circus\n[lumbar]: https://github.com/walmartlabs/lumbar\n[lumbar-long-expires]: https://github.com/walmartlabs/lumbar-long-expires\n[thorax]: https://github.com/walmartlabs/thorax\n","maintainers":[{"name":"kpdecker","email":"kpdecker@gmail.com"}],"time":{"modified":"2022-06-18T23:08:34.087Z","created":"2014-05-19T23:06:53.721Z","0.0.1":"2014-05-19T23:06:53.721Z","0.0.2":"2014-05-20T04:35:19.861Z","0.1.0":"2014-06-10T02:58:13.481Z","0.2.0":"2014-07-08T18:18:17.139Z","0.2.1":"2014-07-29T00:31:13.254Z","0.3.0":"2014-09-02T17:39:59.938Z","0.4.0":"2014-09-02T21:07:08.737Z","0.5.0":"2014-09-08T14:16:10.021Z","0.6.0":"2014-09-10T14:45:20.543Z","0.7.0":"2014-09-19T23:48:59.774Z","0.7.1":"2014-09-29T16:48:42.473Z","0.8.0":"2014-10-11T21:56:18.485Z","0.8.1":"2014-10-19T18:21:44.039Z","0.9.0":"2014-11-19T20:28:04.597Z","1.0.0":"2014-12-15T08:20:37.448Z","1.1.0":"2015-03-19T01:40:52.121Z","1.1.1":"2015-03-19T19:52:52.551Z","1.2.0":"2015-04-15T22:22:01.797Z"},"readmeFilename":"README.md"}