{"_id":"gs-tectonic","_rev":"51-1afbb64ca63b56fe51f45f3cb7baef27","name":"gs-tectonic","dist-tags":{"latest":"5.0.1"},"versions":{"3.0.1":{"name":"gs-tectonic","version":"3.0.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.0.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-nG/3167H+8yI39WR6YsFkNLuAN5gkGXbSiK0aMWN/YVb99trhuOIASxJMxq4N6jzgwcAHY+e1oeRVdnJur2fqw==","shasum":"3668e1cc85935531ec15a47eae7f976c4883b7d0","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.0.1.tgz","fileCount":62,"unpackedSize":3935809,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHCCIUFH2C7vgEk8/R7Y0EDOWBmDHnVBaE0mf5TZ3P0hAiBIdlwscr5rSF39hEt/XuWJ/EmrheYL59nJAwCp5sWUrA=="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.0.1_1518661800878_0.24410862052793103"},"_hasShrinkwrap":false},"3.0.3":{"name":"gs-tectonic","version":"3.0.3","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.0.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-cQSUxu/51G+f0lURe5salKQBYPLz9VV3t6i29NoIXVXBGr6c8yzA9CR+E3kxt9uVE01CqimioYVcnNbAP6CuCw==","shasum":"8f2e877b1d23280ceed84cf2135969fa1b2b8bdd","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.0.3.tgz","fileCount":62,"unpackedSize":3935809,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYtyZdgnvZLRV2mOgXpKWXzeg1NoNaKJNz3OH0gTpxlQIgReobsgfQaNTppJGlkl7umbqXl1gPyaX6RZduLX4bqDk="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.0.3_1518665946331_0.044963525671615434"},"_hasShrinkwrap":false},"3.1.0":{"name":"gs-tectonic","version":"3.1.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.1.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-C+G2ZePkPJnnD0J5GDnbPTjN31q7N/XkzICl0eqj3GXPjs5yTkgivCc3NXbf4dwaJXSyM1aLVeUgK/JrTZRqUQ==","shasum":"e2e4eb446a5d45e40dbdf50b807f89ac15ba17a3","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.1.0.tgz","fileCount":62,"unpackedSize":3936700,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGb1KN73Uw6HmiwY7CaxponPW0kkDV29NAIbEH/GlPYbAiEA4uczplD1QoNoNc34W3dZv5o8xdKgxNS3kqZw/lXnmEo="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.1.0_1519444151487_0.9897940175992848"},"_hasShrinkwrap":false},"3.1.1":{"name":"gs-tectonic","version":"3.1.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.1.1","_npmVersion":"5.6.0","_nodeVersion":"9.4.0","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-A7TuZTZ3MvC/z6L1puU7BAwKrNU4NYRLEgLndSuYYRSF9wXgB93HpPlUNI15XAkknbML3abINahetLvdDYah6g==","shasum":"41d623c75ecc7f3276c415d361c3aa9bca445a5d","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.1.1.tgz","fileCount":62,"unpackedSize":3936748,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGZz6aSIj7BMEMNB3uTGf17GLk2cGfA0WeWGFFWLq0PuAiEAmjRfVdoVHQ9WjtKz/J1X3jtEmZ3dPbzOIoSM0pSSPII="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.1.1_1519752346849_0.6445472877874248"},"_hasShrinkwrap":false},"3.2.0":{"name":"gs-tectonic","version":"3.2.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.2.0","_npmVersion":"5.6.0","_nodeVersion":"9.6.1","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-t9Qxh8BXujNW1HI5jucGKQHijoV7r8Vtl1wrdCDHrbfp4ahX4rslRvN72JKLwTr2Hdd1C3kIE8gGCVmKI4WoZQ==","shasum":"7ee285fa6030b3f1efc82222d6e40951b2cb91f8","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.2.0.tgz","fileCount":62,"unpackedSize":3936752,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGNXBkQ3E/3YZHG/cuTa0bJ8z5Qv5DpTm/hem9BSoWdaAiEA7S0DbHXxapYWm/zp24hVu2+VvuWEMd67nGTwE/WHeXs="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.2.0_1520451507079_0.4614532085112"},"_hasShrinkwrap":false},"3.3.0":{"name":"gs-tectonic","version":"3.3.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.3.0","_npmVersion":"5.6.0","_nodeVersion":"9.6.1","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-cu6/6VKGE1+C3MSfkgScj8x/0sTYDbpdClCuBjUTZ/Vhz8Jd1NPa4O8bq2nHipVhBc+oAg2RPrCd5q5GOsxO2Q==","shasum":"58b858d11deba061818b515643bd37bb8b52ffb7","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.3.0.tgz","fileCount":62,"unpackedSize":3937216,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/uFk17TjrrJFQtFOEA3ImESyFBk8qDHF969w5HLyYMAIhAIfDUG84T3mWzsWDTCzIu8TbzaipVmvEfBtoij9BDN3h"}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.3.0_1520540799293_0.11370517463468266"},"_hasShrinkwrap":false},"3.3.1":{"name":"gs-tectonic","version":"3.3.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.3.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-50Vt+iTqsbOGJt8ztIQsjNJtepLAIv3anhxb5yHO0VxHqHeiEV3M0zMwSMu4ePXz6bKFt5RlW23bUkK1P/i0mQ==","shasum":"7e4886547efd53e5fa1cacdcb8d9d364c6d3329a","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.3.1.tgz","fileCount":62,"unpackedSize":3937360,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5ZoAKCzctyTd/3uzCQ0d2BnzIytc8Gb/YJFRdPEH4/gIgII/FcdbvwYmyQGCwSQOKu0xsjz+7FWLLCmJY+9ATyjk="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.3.1_1522204189685_0.5336656608064028"},"_hasShrinkwrap":false},"3.4.0":{"name":"gs-tectonic","version":"3.4.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.5.2","babel-cli":"^6.6.5","babel-core":"^6.5.2","babel-eslint":"^7.0.0","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.13.0","babel-plugin-transform-decorators-legacy":"^1.3.4","babel-plugin-transform-flow-strip-types":"^6.14.0","babel-preset-es2015":"^6.5.0","babel-preset-react":"^6.5.0","babel-preset-stage-0":"^6.5.0","chai":"^3.4.1","eslint":"^3.7.1","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.20.0","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.3.0","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.3.4","react-addons-test-utils":"^0.14.7","redux":"^3.3.1","sinon":"^1.17.3"},"dependencies":{"debug":"^2.2.0","deep-equal":"^1.0.1","immutable":"^3.8.1","react":"^0.14.7","react-redux":"^4.4.0"},"_id":"gs-tectonic@3.4.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-ig2LIHPCxl0dU5SMwjah4MI8gSVcoLmaF0zn7pGDsXRH08e20lvHLkw67GRvoU4JA6iq0xiLjGONkcgelAV4qQ==","shasum":"02dde0da455d63728316a3669e9c80dcf1761be2","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.4.0.tgz","fileCount":62,"unpackedSize":3937530,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb5bDxCRA9TVsSAnZWagAA6+0P/RHya1uSD9cZN5pDoWJx\n7Aw7v+qS0N3NQkfWFoiuiBmLazdFShEgViWqNEaesUxfpshi3OWHa7rS7uJE\nCGOEm0ReUDn4Tw7DDCBIyhEfFD1cNyOD6mfHCya6ECih9E/pRreB0B61xBf/\nQy21fDzt6iLFR7DorWMmG034HK1s2+yI4s5WLvGihvtdnRcORg/n+zOc70ug\nHncQ4yrAZnw1FX/YT+tQiBlv6jH68rjAx/gX4xUv9P5uPt/j3fPmZCovSbCS\nLbwWWYm/8y3SpLMG4u1rGkoxpd4gP6DtvSepwBSOSqoxkPHcm0eNjSdChktO\nmP37ebitTjjln1Aj+iBUUVBpJwj+Qdl2hRvRbI+6e+yZPEb1ogR2n0f+jNgy\nd4Tabir+b4HhWPzvjHryLhzFrWIXEmtamxifUyJo6YrM+owyvm1zHbQTWjU4\neu9GnbcHZe0NT1W+PT1ijX4km2j6ePGVeFx9LtvXB66KzO5QSmq/+tKg+L91\nMUNGlCjNCvV5rKLg8xtGcF77cBWAsmyzTvrk2i1snRRdLcRJMiC7LDjYyAgu\njakm8Uf4tX+q9JqXAkPogfWve+MeMgQgLus/81bVcIvhzXG16BR9jtMnNmel\nFHawYeHsA32Sb7NGvSt8udgoYmcNSOKxCnN+P8ovkimhIlEaUAIq66oMYSfK\nbWJi\r\n=Bb2I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDadrhzaez21EoCd6hfVAmDgaMYXI+5AHY9XL//ZwDh4wIhALsXp7x5MHSCWBTfJOjl4L+MILopi1xQShmDnw+NmQMb"}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.4.0_1541779696674_0.4069754362511888"},"_hasShrinkwrap":false},"3.4.1":{"name":"gs-tectonic","version":"3.4.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"readme":"<h1 align='center'>Tectonic</h1>\n\n-----\n\n<p align='center'>Declarative data loading for REST APIs</p>\n\n-----\n\n<h3 align='center'>What does it do?</h3>\n\nGreat question! It:\n\n- Queries data via your existing REST API with adaptable query drivers\n- Stores state and data within Redux' reducers automatically\n- Respects and manages caching\n- And, best of all, passes fetched data and loading state into your components\n\nWhat does that mean?\n\nNever define an action for loading data again. And also, never write a\nreducer again. Which means no normalization of data! And no writing reselect\nqueries! It happens automatically for you.\n\n<h3 align='center'>Cool. How do I use it?</h3>\n\nFirst you need to define some models to hold and query data:\n\n```js\nimport { Model } from 'tectonic';\n\nclass User extends Model {\n  // modelName is important; it's used to differentiate models\n  static modelName = 'user';\n\n  // fields are used to create an immutable.js record which holds data for an\n  // instance of a model. All fields must be defined here with defaults\n  static fields = {\n    id: 0,\n    email: '',\n    name: '',\n  }\n\n  // idField defines which field is used as the model identifier. This defaults\n  // to 'id' and should only be set if it's different.\n  // Note that a model must always have an ID; this is how we look up data in\n  // reducer.\n  static idField = 'id';\n}\n```\n\nThen you define your REST API as soures. It's quick and easy, but let's skip it\nto get to the juicy part. Which is declaratively asking for data!\n\nCheck it out (I'll tell you what's going on after):\n\n```js\nimport React, { Component, PropTypes } from 'react';\nimport load, { Status } from 'tectonic';\nimport { User, Post } from './models.js'; // your models\nconst { instanceOf, arrayOf, shape, string } = PropTypes;\n\n@load((props) => {\n  user: User.getItem({ id: props.params.userId }),\n  posts: Post.getList({ email: props.user.email })\n})\nclass UserInfo extends Component {\n  static propTypes = {\n    // btw, these are the same keys we passed to '@load'\n    user: instanceOf(User),\n    posts: arrayOf(instanceOf(User)),\n\n    status: shape({\n      user: instanceOf(Status), // Status is a predefined Tectonic class :)\n      posts: instanceOf(Status),\n    }\n  }\n\n  render() {\n    const { status } = this.props;\n    if (status.user.isPending()) {\n      return <Loading />;\n    }\n    // ...\n  }\n}\n```\n\nHella cool right?! Here's what's happening:\n\nYou say what props you want within the `@load` decorator. The `@load` decorator\ngets the component's props, so you can use props in the router or from parents\nto load data.\n\nPlus, it automatically handles what we call \"dependent data loading\". Here,\n`posts` depends on the user's email. We don't get that until the user has\nloaded. Don't worry; this is handled automatically behind the scenes.\n\nTectonic also adds loading statuses for each of the props to your component!\n\nYou can see whether it's pending, successful, or errored using built in\nfunctions (the actual status is at `.status`, so\n`this.props.status.user.status`). Plus, if there's errors, you get the error\nmessage at `.err`, so `this.props.status.user.err`. Same goes for the HTTP\ncode.\n\nAnd as a bonus all of the requests are automatically cached and stored according\nto the server's cache headers. So if your server tells us to store something for\nan hour we're not going to make a request for this data for, like, one hour and\none minute!\n\nSuper, super basic interface, and super, super powerful stuff behind the scenes.\nI know, not as cool as GraphQL and relay. But still, if you gotta REST you gotta\ndeal, baby.\n\n*Bonus*: Guess what? If three components asked for the same data we'll\nautomatically dedupe requests for you. We'll only ask the API once. So don't\nworry. Spam `@load` like you're obsessed!\n\n<h3 align='center'>Mind blown. You mentioned defining API endpoints as sources?</h3>\n\nThat's right. See, behind the scenes we need to figure out how to actually load\nyour data. This is done by a \"resolver\".\n\nIn order for us to figure that out you need to tell us where your endpoints are;\nwhat they return; and what required parameters they have.\n\nHere's an example:\n\n```js\nimport { Manager, BaseResolver } from 'tectonic';\nimport TectonicSuperagent from 'tectonic-superagent';\n\n// Step 1: create your manager (which brings everything together)\nconst manager = new Manager({\n  resolver: new BaseResolver(),\n  drivers: {\n    // Drivers are modular functions that request data for us.\n    // This one uses the awesome superagent ajax library.\n    // See packages/tectonic-superagent for more info :)\n    fromSuperagent: new TectonicSuperagent(),\n  },\n  store, // Oh, the manager needs your redux store\n});\n\n// Step 2: Define some API endpoints as sources.\n// Note that each driver becomes a function on `manager` - this\n// is how we know which driver to use when requesting data.\nmanager.fromSuperagent([\n  // Each driver takes an array of API endpoints\n  {\n    // LMK what the endpoint returns. In this case it's a single\n    // user item.\n    returns: User.item(),\n    // To get a single user the API endpoint needs a user's ID\n    params: ['id'],\n    meta: {\n      // meta is driver-specific. In this case the superagent driver\n      // needs to know the URL of the API endpoint. It's going to\n      // replace `:id` with the ID parameter when loading data.\n      url: '/api/v1/users/:id',\n    }\n  },\n  {\n    // This returns a list of posts\n    returns: Post.list(),\n    // Each param item is the name of the param you pass into @load. EG:\n    // @load({\n    //    posts: Post.getList({ userId: 1 })\n    //  })\n    params: ['userId'],\n    meta: {\n      url: '/api/v1/users/:userId/posts',\n    },\n  },\n]); \n```\n\nA lot of concepts.\n\nThe manager makes everything tick. It passes \"queries\" from `@load` into the\n\"resolver\", which then goes through your sources above to figure out which\nrequests to make.\n\nOnce we've got data, the manager takes that and puts it into the cache, which is\nan abstraction over a Redux reducer in the store to manage caching.\n\n\n<h3 align='center'>What happens if I make a request without a source?</h3>\n\nWe'll throw an error which you can see in your console. Also, we use the `debug` npm package which you can enable via:\n\n```\ntdebug.enable('*');\n```\n\n<h3 align='center'>How do I add the manager to my app?</h3>\n\nWrap your app with a component which passes context. We call it a \"loader\":\n\n```js\nimport { Provider } from 'react-redux';\nimport { Loader } from 'tectonic';\nimport store from './store.js';\nimport manager from './manager.js'; // your manager with sources defined\n\nconst App = () => (\n  <Provider store={ store }>\n    <Loader manager={ manager }>\n      {/* Your app goes here */}\n    </Loader>\n  </Provider>\n);\n\nexport default App;\n```\n\n<h3 align='center'>Sweet potato. But can I CRUD?</h3>\n\nHell yeah baby!\n\nThe `@load` decorator also adds a few functions to your components:\n- `createModel` (to create models)\n- `updateModel` (to update models)\n- `deleteModel` (i won't go on)\n- `getModel`\n\nThey all have very similar APIs:\n\n```\n@load() // just gimme these functions please!\nclass YourForm extends Component {\n  static propTypes = {\n    createModel: PropTypes.func,\n  }\n\n  // imagine onSubmit is called with an object containing model\n  // data...\n  onSubmit(data) {\n    const user = new User(data);\n\n    // Each function takes two arguments: an object of options and a\n    // second callback (if you actually want. I prefer callbacks to\n    // promises.\n    const status = this.props.createModel({\n      model: user,\n    }, ::this.afterSubmit);\n    \n    // But guess what! You get a status for the query too. And you\n    // can use that status like a promise. Fancy, huh?\n    status.then(() => {}, () => {});\n  }\n  \n  afterSubmit(err, result) {\n    if (err !== null) {\n      // poo\n      return;\n    }\n  }\n}\n```\n\n💥💥💥! This is automatically gonna populate the cache, too.\n\nHere's the full options you pass to CRUDdy methods:\n\n```\n{\n  // model is either the model instance you're creating or the model\n  // class you're deleting.\n  model: new User({}) || User,\n\n  // modelId is the ID of the model you're updating or deleting. If this\n  // isn't defined we take it from the model instance in `model`\n  modelId: <...>,\n\n  // params is an object of source parameters for the API request\n  params: {\n  }\n}\n```\n\n<h3 align='center'>Can I see a full example?</h3>\n\n<a href=\"https://github.com/tonyhb/tectonic/tree/master/packages/tectonic/example/basic\">Sure thing, partner. Head here.</a>\n","readmeFilename":"README.md","_id":"gs-tectonic@3.4.1","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"dist":{"integrity":"sha512-wx2sxNgxrCz0r9GrFMmL72SsBdLr00dsVywRbQOwng/60L8GwoGZdZvny+3oyGxWLaVUv8iS3AigZH1exYAMoQ==","shasum":"72c8a21ae41b0b454496573feee555afb6498f2a","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.4.1.tgz","fileCount":62,"unpackedSize":3937810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgowKCRA9TVsSAnZWagAAUyYQAIBEnZBDntfAPd/0dmNo\nVC3TTsAzR0a102rTd+oiiIB+RIT9p8ehYr8tiui55/V+UtT7gN/JJ2iOt+e/\nr6T0zipr0VbBdYGX4x/ZycRVeusSDiDc/NKD2lR15q2LeQR3pJs9l/+S7TRk\nN9fTs6cdCKlHlYoXxRCoRZc1R5/IK9g6MzS8NSi4AGnbNywzRQ3EhuiqmUMN\nklYil3ZTDeCByyGOY2CbviqvYoHv7YSeig7BnlVfLqs/KhaPoTbW9K7iMC/c\neOsh3d788z0hHH18oARMeitleDZ4r59a5eh5iHN2u8nXsBbxd+Eps86CGbPm\nHWKEV+k2fsNwrPJnwGuxeWw0Bn2C0ZFLa4gwtlGrVj/gkkaiG3PR0soP1xHu\nZs86cnYVwbktAnhblU4ZXwDNagdJn50NUtXU5UoNsEdU62HNAjhc+hkkazdH\nXRNxd+8Hn2rulH0ZcuG++uzfLdFTezYl+WvCN50Grk1dZeKZYDb4aythNbav\nbEPyTKByZm5sON/oC5u2D51RfgP9AX8x/rLjmRgQuyzjsEgz5Ron5HoSo3oH\nlrVTPlFQ2n3B/jI/Z2ao/IsDODyVmo8QChSZwQcF94O2GdrA3nleCLR6LfPC\n3E2pEPvjoSYusCJyhc1FtOWx8OEU/5pCQCCebvqGGmVAtEkyrrE4cHyltXw7\n7y3E\r\n=xc79\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAUQ5fyzc4BELC8u0Qs8EZvq7ItJSz9oXTWAerMySDlPAiEAoVL+UQCG6jeG1QPX+v3Oh4Isk8O8k2GfZEFZKsnOmps="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.4.1_1552059402120_0.748168731621208"},"_hasShrinkwrap":false},"3.5.0":{"name":"gs-tectonic","version":"3.5.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.5.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Siqd+llfyn0QSossjxtd6Es1BbQD+uiJKaLV6+EmSZya7s94+n1vuOpunszHn3lYCnLGYb+o+F/6yhG56RUi5A==","shasum":"6b743709e5081dc58368df6132fe0f1436452215","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.5.0.tgz","fileCount":61,"unpackedSize":3830759,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdE7K8CRA9TVsSAnZWagAAb2YP/Rz+HFAz7k+kL9N5yVjH\nOT7LHoL2ayi3wodBpOQLUpiQIqtGSCRIoQwpQcqY49vgaFgJRPijDFuyhje5\nnoY21rIafLH184vP7kI/5tDhnI1bRSPvNkSHBv8iLJH8vucUJR/Pvzt4/HBL\nySLIvz3h60cJ6+K8F2GU/rn45En0dOgTwRjDoz0/eXyYL9X60M+E2f0OQbNg\nEOXNqjIkcFUe2POu3fTWljct36ycFQbGm9KPV/eOcYqqfAco5QleobCIubNz\nIKrnP0JQf4qWkpT0kNwkX/Yx5oIECAkEjxiGYk1qcM2dvqm18+KCSq7cnOzT\nYOiTZCgODYXV1GeFgIoBlLdayw893Q1PaIeVCdBTBGtGtJ4QI0OK9kp1kW9+\n8tTHZSuW4CFiMmDzQ6qZxIvHkj7JQplfRHWLtjERkaUW/Cau9vy2VjCJV0sT\nOeWDoLLs2B3h6e/dSuzaTvw9vfsHWzvDKIKVmV5bwsk99pExlyE/ESztTB0h\ncZ3VOgEavXzkS9e9UiHqELgFPbP8gjdS8tpO7LW6+Tp15W+d3+OsxIkkhleW\nNkgCP3Z0tPvM0zkID+l7H0EQOp8AQN5PcegUS4LZMuF4MQbBI6ssnVIYNlY/\nZ5LJy/MRH2xNPQjhIt8VunsMLbmK2z9mdT9+ZYoLREmeTHF+r8knOzn3N2Ff\n/SNe\r\n=EJYf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXqdvGoLRt0P9bvaROARYUk9zWCVo50VPgAOnxK14UuwIgD2UjMo8Zdq6yxEIwbpcZ+ijdrtvQOHPoXEmUL4nfuig="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.5.0_1561572027876_0.21771246339523231"},"_hasShrinkwrap":false},"3.5.1":{"name":"gs-tectonic","version":"3.5.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.5.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Q1JLvytOCycy49hAm0mtxzGLRSZzv9DdfGu68ZPYP1iR5NpThXR2j/VfNRBxOMHZOmqrRZECWwZvOu065dgUAA==","shasum":"b71167ea49175a262b3989375901bf86976fdb1e","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.5.1.tgz","fileCount":61,"unpackedSize":3830764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFQjiCRA9TVsSAnZWagAA8YMP+QGc5A21kDSsFFkY/Gwl\nHO7HWJqd5CLOxMphI5t3NL72ioMSnZFINuRBbMjCc7pAvipr09o7u7pWNtuC\nENzvIlzOCDNfHHNIUYWn7eAz3OLhxIPhyxdzjRcway2CrkwJDOJi/7wG5ZEx\n3/QR+Hmq2jWyQeoYQD8zY2bRfvjGMtnB018UXEVqO+vKik+sepX441udvn/j\nzU2U07RqgGlW/xeDZs6eoOqkTB5sI55gqckea97nAk1LQADW7zm+u7lZSjtp\nrva//yVA+HKmNqJaBvS0zFku3xovuMD8sKK1hhTcvhhuqOoP20XpR0EKeihi\nZWPKyR9xSMJJTJ0NMdV3DZH/cPGdJt+XHmY3whLV0BgW8vjST0T/rphS3X6M\nOMsDaO+DWapkFNmf8Iy7LcGCg96oU9VGfGifCvzxeu7ADWZS12HTBNh+GsPx\nLYuSMp+vJfbvXQcrsfTuJhGAT1kfZqS6zI5A+x1Ljnq5ldWdw5HWgo5DoSQA\n6pHzIb6hTa02oLYjLZeQnkJzltyKrQXEmWuFFWY+raENCeEWU0Ik5qJpzoSF\noIRYyIa8b1Ag4siooqfEFwQnaZm6VHG/w61bRzHwzxB6aHgPhmlBn/UEKFeu\ncb34ySaSgDkO7uVHHBY90HAYk8t7hR1Wi4Py5tRpgn0p4+sw1ItRgPD8q7/v\n9Tzg\r\n=CQPB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDV1t3wAE8r9uEYHTBo/66dzJc6Nzl5T/IjMvFPN93YPAIhALhGIdfITfAn1Vj0HwQ0wo8DwmB5xvD3dqcNpZaH4UvM"}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.5.1_1561659617777_0.9656500846524081"},"_hasShrinkwrap":false},"3.6.0":{"name":"gs-tectonic","version":"3.6.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.6.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xeTjVijmCI2/W4F3Dd17AXqPs9wH2sthwwF9B1Og97JAd4/8suiYoA+M2144L+XDDV7Yhg/FOYIGVAt/wC2+0A==","shasum":"acad3dc53308ce865bf1295e0339c88fa65e08bf","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.6.0.tgz","fileCount":61,"unpackedSize":3831698,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG+S0CRA9TVsSAnZWagAADHMQAIFb1RPVlBo8ZP6QSso7\nBqvhUynDzugM9vqrE8xscfPLlKxeWfAqxdQ3HFy5z77Ps5kFcSOf0c5nhaS+\nv8RMIKWnc/k5hk15hiVteASJhL/4S9bZnsbOaE07mC/3d+Zp3elM7gG19hBT\npl7FoWPjj0nNpQsscTxKlfNekRUFjkMyy9hDev+s3qvs30shdbYBPuLJUEUi\nHyVz6vQjTYFf0YqKT7QXqi5/Jm7lojoILoRhLmfXZtzF9fp2qXILN8g/tcZT\nRGldaBsJJfSztfZ8UZptTRGuASfarncGYQbkNNz9f1OkC3xGCP6dpZ64nz6B\npcqpLaB3iQVxyZ+G9+iuAYXg23MDEg5TybTeigSrjuxMP20ouXRC4QD+2p2P\nZCCHQFXMQ8+Hky0P0pxSEl4dDSwXNKi9qtf3OqYQsPMGH4jM3FooHb1+9lIj\n+dZxslB25wcCkkWdQMJ1c9RJJ75QzL50yGWtzjwNi/Wut6ZxerCu8AMrsJ43\ndjQprT786hB7WSgX/WOuthsZn5ibIGzzAzko3f2KeVHcVuG9563W2O2/FgDm\nXL4p1damVHGR4f9gzWCwxYPWhzDZgY4oIje9TdUysJ6FI+sRvXr46oOM7e42\nv8+SvgU9gxCCdEEiONELZToy2HshsT+PiKNjewE2+BkMEc9sbu8LHBKJfzIu\nG018\r\n=S5eC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICvNhQ+LHMDIStvIq/aIR2BEhXGBySRAvZ5izwH/O+e6AiEA8FsypiEjcaUt90R7ZoIZRdIXOQOIcO3FBjX03Rr0lDc="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.6.0_1562109107800_0.6972178284097539"},"_hasShrinkwrap":false},"3.7.0":{"name":"gs-tectonic","version":"3.7.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.7.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-QKbxys98IrjyrzgVR5xLi0OVr6jJs7UpJuMsHxqvMHJA3DPI65IG/4E8ZjlmGiAQwDuCWGX5IQzBHlV2x9Ck+Q==","shasum":"50132311b789e4d383ecd1f482ed973a80182e13","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.7.0.tgz","fileCount":61,"unpackedSize":3831787,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI92WCRA9TVsSAnZWagAAs8wP/Ax9J1L5iZwN5Qzz4gTM\nVIbbYS3bauwR1ls8EInbubhBHu7HQVNALKyUVnaqrk4drbLNXB6twORq11Mw\nTPT3/P4QFmpg+g1JjPU/k5bWUUIGO15ODG1EWFCf2SNgHOsxOHn56RnHKxaw\nE/SjqrDdG5r9RGDfcTKbaLnFo/PMoSQq1XRGhzTjjg6uzX5qoXOCJgdKKoRx\nC1cK3H/RInwzKnhYlEa5uAPG8fT83v9NiE1w1FCWIKW2/nplsOwOCIO6gOEK\nJJnEJq1pBGAknqPMj+c+tdxc8VVLvp3BweLvVS8MKEy1cnpEbg4Uj1PmMyQ5\nmJLc4wgvI8jYBjZh0InDrP9c7a+VlyNqh7/N82MqmfG3wVGh/RPq/UOhVzvE\niU/Ffiqi/A/xNwnwbqmRUZCmmzYC+E2lhq5fTDVbPDOcC6Gdpo5AxzaGAOgs\nV043Rlh20B6JwWgAX4/XnG3kpPMwIejG0bL+/4hV5AAJZoaxsyDxNSdx2H0j\nBorsPUFr8KIBLptAqfMRNVCiOz7u3Zs36heBq9EqaLkyp1vnVYr0N7VSHpNR\nQ3GBTlZRzQTcZ8BkwGN+uXmTxfGqntkwvUHNQPCeXbvIONyENJmtBah8Ponn\nVL1qhojRPz8Im7jjClc/eL10/eCsMmCyLYUe2csSnTrIpPunP+UoUa/+Q5jn\noWcS\r\n=/mBg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChCy95ckmqOFTRV0nERv3BRwLfaG4rc0jUqdfEtSAXngIgEkw96Wpc1WovFy8LnYro93BPIsMxFAOIIKSs805KaHw="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.7.0_1562631573136_0.9936715551539022"},"_hasShrinkwrap":false},"3.6.1":{"name":"gs-tectonic","version":"3.6.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.6.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7rntIf2wwugLCUDNss0BSGTcWek3M3Ssfjbp8/K2b9njpuPdO1v2SSojx6HoXNaQ5apgefFezH/EqSos+hAptQ==","shasum":"6307e99ff35bf0b68f9451305271036400113366","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.6.1.tgz","fileCount":61,"unpackedSize":3831875,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZa/PCRA9TVsSAnZWagAABeIP/0kywbv9FVxp04xgc53u\nIJTz0Gcx+RifiC+vLu0O2I5a5si3KYkn75Jrenc0wkk+ArWhhT25u7MCTxdX\nLss8gHY64rPbsWEB4o41LTyUPsOzB5QfwU8eIhysEKUKxMogiP5UBgvJs9as\n1MHGshYiN57y+a6uM9D9kHV7QV/Z7XNeu+gnYnEu7jcZCv5GSgtwmOLg+75M\nOcVTUxusbxgNBMtIfn/TSE8vl34ub2ecRbUGzukOunQOJ5+WaSzjp/cE9XZc\n6GMniLE2nn18RbubQfVdjH/otCsuP/EOMdiE+BPkgVopXdisNIqju37L7OkU\neqfkkBs8sM7XfHc2BW6+JAcoXzRRJLVrGFOKlCniZPksGuHQ1wzPdLXULfT5\ndsW7BRWZLRXV6b9OkgoITmA70A4IEC9HEPxO0jNKjkyY5ssQ48Sa3Wyq+X0X\nQ8xdhpLSCSTMJ/miZrf79c1J2BGQ837iR+vHBIhTj6sGwavu+VlyOCdpZ2oz\nBqvNpRGZrEopSyMAx0XR/e4KFg9FN8blYYW5gUyhRseD5C3iPkSPuzeZ2sga\nAQwGNm8C7QyFgIIz3HePSklQHtO4WQXg60BNQ5rUkNabsIQ+4HOWZ0WlK7Vq\nU+MJCerxz1qayNaU+NRD+3n+uAoVAb+gSoNlTxu19Zbmr8LCW99ScI6IiHUk\nqdif\r\n=Ykn9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4SJc9JTLSn8msgay9BlNdz9WtlM1PjYxNzB6SjDkctQIgOr6FXxwLBSr1YgS0k3rfCKc0jN5k3MQRKHJkax8tht4="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.6.1_1566945230875_0.9846762910610884"},"_hasShrinkwrap":false},"3.7.1":{"name":"gs-tectonic","version":"3.7.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.7.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-D9V+nSWzN7vdhR1i6zvRoM0EhSTwiUj6nbO5LCzE+6I6fCGPgkK4D9t9awEMud+w4Nh9RqoGkp+we7I3N4YJuw==","shasum":"151913258710dba018b1a66f032dfdef6de541ba","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.7.1.tgz","fileCount":61,"unpackedSize":3831964,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZbmWCRA9TVsSAnZWagAA96oP/2g7XnPq2cl+r0xQuSof\ng1wB35d7RG8kCqZSDP612eRNFS1wx1uJVd9PEBxJXg0swxMcu6/OnzI8ibJT\nV97MytEN/j2TvAIJ9hwqyCY7LY95Do08yTpGkF69196rgyFx3mcEUII0fgPI\nQAcXjQKIDJ+POQ3cZppNMq9KXHejvnxKeXtsD4ePw1oSfXhAkK0ZcqpsHAzc\n/uRGftASJ3HOTI9r+X++Z3F4bTx6/DdaXeLNjcpqFiMltUT3tQ4c4ivtUcVD\n9fWuffHWPo0XrGm2Dgb1iyB6w0lKP45J1aSGP74BZ5FBrg37j4z+7HBKVW8P\niKRt7saaHI3eYQxZ4U9xKWKNTqpFQzRpXxaPAlp1zjxzQfe9OYBq4A2vzonf\nxvjqTD/xXGheSeLRc1F9e0K/NZQhPeE1njK5b/hG1NietmjzewksdROJG4xJ\nMOhp7M4/sGuExn3ZxRAeo4TW8F6DxG2MTVGIycYMaSJmGPC0g/YiIAJ84Qae\nJ9L317oTlzewWohnKCj4Ygi+3azKF7ldzY/hHNR6u2kud/08H/6VlDcjrjxg\nAcchZqtSSr6pcxO0Na4VWlxcRo0SaqXckpB0LA0jlyixC5rrxDvHEDadlb/x\noAnqKtvpRVrg2Y6HiTu3zdSiJpKgv2n0w/boa4nebGGYc9MkhyNtRpXu+7aJ\n4jDQ\r\n=Vivd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHgCHaHzmpkKP/qch7fRVuSRuLKX20E2qALbHU1ylYapAiEAhZei1MEBBDqJM1jRYHlKBBBHifo5R4GKbKdBEu7ZPKQ="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.7.1_1566947734197_0.13746320146302082"},"_hasShrinkwrap":false},"3.7.2":{"name":"gs-tectonic","version":"3.7.2","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","react":"^0.14.9","react-redux":"^4.4.9"},"_id":"gs-tectonic@3.7.2","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Ga0D9XHSLdoY3FNPoH0FYbn5Uf0sax/uJQ3H+uXT2BQWkpq3WZUGtAX72fCvUblaM/00Oxu3Oev/cCyw9EPVSw==","shasum":"6cdf1666b01eda3dc5056c4925a3fa9c95c196e3","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.7.2.tgz","fileCount":61,"unpackedSize":3832568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdiOzICRA9TVsSAnZWagAAbqwQAJREA78r4be4y3xsfQkC\nOslgokHoyVD9snfU4N+E3ywpbkcrK2bZJ5U8/q0Gp1HUzK1BDawfkVEjkMuE\nP8b7l8jiX85ClANlHyDnjkTji9xWQU3SNv83PAiLkgjIw9xqUZVsMlW03n82\noIk86RBoTzcWFb74B6Uh/GO+4CUmlClGKdJD18e/r6dPV/SSbbdr7EYOrJqE\nRBBCY4ZyUNmx6iq8sSGNSMVEGp78I9SWxFcrQKo3vBeFKZQEtrIrdVm7C/NT\np74Csf+BTUXDP35OpqJlqQwDZVaBNKaLr6YKhIMI+02Ynlh0n555XRVxYim7\n4sFlJMPZUb4FoNzCM3eI8jZd0TlTJ/P0KmIQqZTBuvIVwyXCOXJ73kBnqgT4\nPjNVNJhGP8BwJOh69fwR0Yk+ZS/38egYUpN2Lo3eUjR07BOoKkbN62fFAkP2\nq+haseK/zUZhxzVGJWe06Wejtth+N+ubUd7DHxQkNDllvDD62dTVMi4D9j3Q\nQ/MyEIt7/vCOX3m/FzaehnfRgo+tWzEAyEIcii//2UPgKVxq5pXLL0hDNnz/\nPPe/sf07FhHokmB7Ma9MuXfoKj07B4RPc55CAWaiGt6PiGQ7plDpsSNguHEB\nAIRelE7xaS5tqkAr4MHkPXKzSWihOeRG/1HfthZqzizK3iG9U3dXF6C1gmJt\n2H5o\r\n=BylV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3iM/8+Jk5jReKzMnXzkyh41WSojDTAKvdvvq25kevNAIhANEw3hoVeW3jzp3tJ2aTWRslG+fDf1TT8t++wS6lirm3"}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.7.2_1569254599667_0.3711170971802966"},"_hasShrinkwrap":false},"3.8.0":{"name":"gs-tectonic","version":"3.8.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"_id":"gs-tectonic@3.8.0","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-rO2HGcuRLhn57Jk01yW5FkwmqPz9/S9ci28YgxGH3UOQGh0uvtr0V7+6WUxeN4VqGTk2b9iq+cVJ4PdA9LYsHw==","shasum":"b444b5770d16b8e5c4e81f40426eae01c65cd60d","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-3.8.0.tgz","fileCount":61,"unpackedSize":3832863,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJduLQXCRA9TVsSAnZWagAAwswQAKIWGugkT6xO27YomK7p\niBvfeegpsjDVYmqZRMupaGhON+f9a0X6TYC1ktvfeM2+d7wihG9VhYgDWp+H\nvB0DO91SArq/enOnFpA1RmG1DqxgibWQXpkNW4ppzKx5DdyCpHD9DQ5hsVcJ\nABaXD6+dkB6i+c6eXGcFkV+BHxRC4Q9zosps2jZyrziNzzhDjTK1nnrUHHzD\ngYvcGiSYGneRZ7EHjPuJxCQS6aU7As/0DGIZyS1bfTu7dcRvW8TgrF/YAOE9\nVQ0TwTbtigGbr1MfRQFcvCWywwczU6ZrGLh6EmQD0KqhpfjL5chrxvB4gnyn\nbqJU47qJJrZUrlJ5zbHIWwJQcGTTLvHXGR3ZgiznE2Babq6GwUx9TTuIB8O3\n4Lo+MQgNbfxbizKiglpVXr8MS+8A66RbrjH1p43UKDEezRb3qm2JVEByrJ9c\nCZk5sZwL5nPMuzloU9f2CxRXcmQ2/JW6UGgpioKtYqZ3E/l5ERCoCBCgDRgN\nYYFaJN4S2wUnvf3AoRjtb/cCQBKprkW4bpvfmIeqmdfcriwTNVCJOUm0/E4R\nHBUekcC5UxUIO6HsA+I8r0zu6TCOQtviJONLA8ipwrf406pRrod0GNf5cUCm\nJ1sAnDP2OvVk843h+B3ZO4JtWpJ+mDpSjfnFuoCHL0ZqiTm4OQGCGzN7UJaK\nXKXt\r\n=8Vqw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSCsWMaHE/rN2SIuJBR4y2vt5W49nlajn8dEM6FVMraAiEAwBqPwXXNRjyq5MKES3zqO7BhJ6bbrDmJejv66FgfpVw="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_3.8.0_1572385814982_0.5249233215961133"},"_hasShrinkwrap":false},"4.0.0":{"name":"gs-tectonic","version":"4.0.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"_id":"gs-tectonic@4.0.0","_nodeVersion":"12.14.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-C9zmnkda3PDeLo+HI4HfXNWZ4FrwRryLWWSYjr6R3LkxyBSQ2OwTKpG+nAT9UBEOW3W5zEL5Lj9bz8l8Zucllg==","shasum":"fa27b5ee280465265c731379ff5c17026682d541","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-4.0.0.tgz","fileCount":61,"unpackedSize":3832852,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHSdhCRA9TVsSAnZWagAA6CkQAIffwG/1iaHCyFa9kIW+\nYl0cwh5ocNo0wC5BjGdahFf8277eQLqB7624wCRB0HE+dj9HS4gSFPP9fP6L\n3Rj/OqrRH0f55vQO2n2MW8BMenxo0V6Gcip1EUZwX1BAWrMGERK3AXWH3UkV\nXowo0nMm7+x6IpisZhwvZvbfUs6+hVZRwJS3XkzN51w3w/zrLo/fwIj2Ux+L\nN2zaJM2o3fDoxejXp4m3P+Nx7yC61A1A4dy9ymRLmCcBj2X19iPrDMFAfgQP\nWFcuxrma9KH8vZnSXAcSV0uUoofN8zRod1mr63RzI3v1oc+iX+LXxQjK6juP\nCO1qiUehTwIgiqfHylk/iguXruogMg50mMsCwj2FbB8pw6UX48DqTESkSKQE\nWyRBIwIwnTJlAUKONM80jYvP8SN02g4dIyNJfKvv/ET1BIabCLhl/0x6GYQo\nO/cVIEgKqfMIOY8Q2YNItWB/VQnNnDsdys0+RvWC/pC7CXR8fhFuYhvhRnis\njLdoBzfAT2pTtkqH2kPj5hVEy2BW6JYYOqAAlgKyQwcqVK5W16cpb9elXpQM\nbIlF1fON5fAtkGhkGzzXZKoveG7kk6r0gbllCkPTe5L8mbXbf8PWspjRnboA\ndxhIgFhL6kuhz4Gvyqaz72SDrCrXJmidgcQrpVIB2fH6jQkYH7g55cK8WqMf\npAxq\r\n=uVB+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCL58qpLv4QsvjjHRmw+6wtdxju5RVlvKFTjfP9YaXYlgIhAPT6y/DEOB0EplJxDCvUEZJy9SlcqfWXd61qorhsl796"}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_4.0.0_1578968928667_0.8393369958958039"},"_hasShrinkwrap":false},"4.0.1":{"name":"gs-tectonic","version":"4.0.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1","immutable":"^3.8.2","prop-types":"^15.7.2","react":"^16.13.0","react-redux":"^7.2.0"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"readme":"<h1 align='center'>Tectonic</h1>\n\n-----\n\n<p align='center'>Declarative data loading for REST APIs</p>\n\n-----\n\n<h3 align='center'>What does it do?</h3>\n\nGreat question! It:\n\n- Queries data via your existing REST API with adaptable query drivers\n- Stores state and data within Redux' reducers automatically\n- Respects and manages caching\n- And, best of all, passes fetched data and loading state into your components\n\nWhat does that mean?\n\nNever define an action for loading data again. And also, never write a\nreducer again. Which means no normalization of data! And no writing reselect\nqueries! It happens automatically for you.\n\n<h3 align='center'>Cool. How do I use it?</h3>\n\nFirst you need to define some models to hold and query data:\n\n```js\nimport { Model } from 'tectonic';\n\nclass User extends Model {\n  // modelName is important; it's used to differentiate models\n  static modelName = 'user';\n\n  // fields are used to create an immutable.js record which holds data for an\n  // instance of a model. All fields must be defined here with defaults\n  static fields = {\n    id: 0,\n    email: '',\n    name: '',\n  }\n\n  // idField defines which field is used as the model identifier. This defaults\n  // to 'id' and should only be set if it's different.\n  // Note that a model must always have an ID; this is how we look up data in\n  // reducer.\n  static idField = 'id';\n}\n```\n\nThen you define your REST API as soures. It's quick and easy, but let's skip it\nto get to the juicy part. Which is declaratively asking for data!\n\nCheck it out (I'll tell you what's going on after):\n\n```js\nimport React, { Component, PropTypes } from 'react';\nimport load, { Status } from 'tectonic';\nimport { User, Post } from './models.js'; // your models\nconst { instanceOf, arrayOf, shape, string } = PropTypes;\n\n@load((props) => {\n  user: User.getItem({ id: props.params.userId }),\n  posts: Post.getList({ email: props.user.email })\n})\nclass UserInfo extends Component {\n  static propTypes = {\n    // btw, these are the same keys we passed to '@load'\n    user: instanceOf(User),\n    posts: arrayOf(instanceOf(User)),\n\n    status: shape({\n      user: instanceOf(Status), // Status is a predefined Tectonic class :)\n      posts: instanceOf(Status),\n    }\n  }\n\n  render() {\n    const { status } = this.props;\n    if (status.user.isPending()) {\n      return <Loading />;\n    }\n    // ...\n  }\n}\n```\n\nHella cool right?! Here's what's happening:\n\nYou say what props you want within the `@load` decorator. The `@load` decorator\ngets the component's props, so you can use props in the router or from parents\nto load data.\n\nPlus, it automatically handles what we call \"dependent data loading\". Here,\n`posts` depends on the user's email. We don't get that until the user has\nloaded. Don't worry; this is handled automatically behind the scenes.\n\nTectonic also adds loading statuses for each of the props to your component!\n\nYou can see whether it's pending, successful, or errored using built in\nfunctions (the actual status is at `.status`, so\n`this.props.status.user.status`). Plus, if there's errors, you get the error\nmessage at `.err`, so `this.props.status.user.err`. Same goes for the HTTP\ncode.\n\nAnd as a bonus all of the requests are automatically cached and stored according\nto the server's cache headers. So if your server tells us to store something for\nan hour we're not going to make a request for this data for, like, one hour and\none minute!\n\nSuper, super basic interface, and super, super powerful stuff behind the scenes.\nI know, not as cool as GraphQL and relay. But still, if you gotta REST you gotta\ndeal, baby.\n\n*Bonus*: Guess what? If three components asked for the same data we'll\nautomatically dedupe requests for you. We'll only ask the API once. So don't\nworry. Spam `@load` like you're obsessed!\n\n<h3 align='center'>Mind blown. You mentioned defining API endpoints as sources?</h3>\n\nThat's right. See, behind the scenes we need to figure out how to actually load\nyour data. This is done by a \"resolver\".\n\nIn order for us to figure that out you need to tell us where your endpoints are;\nwhat they return; and what required parameters they have.\n\nHere's an example:\n\n```js\nimport { Manager, BaseResolver } from 'tectonic';\nimport TectonicSuperagent from 'tectonic-superagent';\n\n// Step 1: create your manager (which brings everything together)\nconst manager = new Manager({\n  resolver: new BaseResolver(),\n  drivers: {\n    // Drivers are modular functions that request data for us.\n    // This one uses the awesome superagent ajax library.\n    // See packages/tectonic-superagent for more info :)\n    fromSuperagent: new TectonicSuperagent(),\n  },\n  store, // Oh, the manager needs your redux store\n});\n\n// Step 2: Define some API endpoints as sources.\n// Note that each driver becomes a function on `manager` - this\n// is how we know which driver to use when requesting data.\nmanager.fromSuperagent([\n  // Each driver takes an array of API endpoints\n  {\n    // LMK what the endpoint returns. In this case it's a single\n    // user item.\n    returns: User.item(),\n    // To get a single user the API endpoint needs a user's ID\n    params: ['id'],\n    meta: {\n      // meta is driver-specific. In this case the superagent driver\n      // needs to know the URL of the API endpoint. It's going to\n      // replace `:id` with the ID parameter when loading data.\n      url: '/api/v1/users/:id',\n    }\n  },\n  {\n    // This returns a list of posts\n    returns: Post.list(),\n    // Each param item is the name of the param you pass into @load. EG:\n    // @load({\n    //    posts: Post.getList({ userId: 1 })\n    //  })\n    params: ['userId'],\n    meta: {\n      url: '/api/v1/users/:userId/posts',\n    },\n  },\n]); \n```\n\nA lot of concepts.\n\nThe manager makes everything tick. It passes \"queries\" from `@load` into the\n\"resolver\", which then goes through your sources above to figure out which\nrequests to make.\n\nOnce we've got data, the manager takes that and puts it into the cache, which is\nan abstraction over a Redux reducer in the store to manage caching.\n\n\n<h3 align='center'>What happens if I make a request without a source?</h3>\n\nWe'll throw an error which you can see in your console. Also, we use the `debug` npm package which you can enable via:\n\n```\ntdebug.enable('*');\n```\n\n<h3 align='center'>How do I add the manager to my app?</h3>\n\nWrap your app with a component which passes context. We call it a \"loader\":\n\n```js\nimport { Provider } from 'react-redux';\nimport { Loader } from 'tectonic';\nimport store from './store.js';\nimport manager from './manager.js'; // your manager with sources defined\n\nconst App = () => (\n  <Provider store={ store }>\n    <Loader manager={ manager }>\n      {/* Your app goes here */}\n    </Loader>\n  </Provider>\n);\n\nexport default App;\n```\n\n<h3 align='center'>Sweet potato. But can I CRUD?</h3>\n\nHell yeah baby!\n\nThe `@load` decorator also adds a few functions to your components:\n- `createModel` (to create models)\n- `updateModel` (to update models)\n- `deleteModel` (i won't go on)\n- `getModel`\n\nThey all have very similar APIs:\n\n```\n@load() // just gimme these functions please!\nclass YourForm extends Component {\n  static propTypes = {\n    createModel: PropTypes.func,\n  }\n\n  // imagine onSubmit is called with an object containing model\n  // data...\n  onSubmit(data) {\n    const user = new User(data);\n\n    // Each function takes two arguments: an object of options and a\n    // second callback (if you actually want. I prefer callbacks to\n    // promises.\n    const status = this.props.createModel({\n      model: user,\n    }, ::this.afterSubmit);\n    \n    // But guess what! You get a status for the query too. And you\n    // can use that status like a promise. Fancy, huh?\n    status.then(() => {}, () => {});\n  }\n  \n  afterSubmit(err, result) {\n    if (err !== null) {\n      // poo\n      return;\n    }\n  }\n}\n```\n\n💥💥💥! This is automatically gonna populate the cache, too.\n\nHere's the full options you pass to CRUDdy methods:\n\n```\n{\n  // model is either the model instance you're creating or the model\n  // class you're deleting.\n  model: new User({}) || User,\n\n  // modelId is the ID of the model you're updating or deleting. If this\n  // isn't defined we take it from the model instance in `model`\n  modelId: <...>,\n\n  // params is an object of source parameters for the API request\n  params: {\n  }\n}\n```\n\n<h3 align='center'>Can I see a full example?</h3>\n\n<a href=\"https://github.com/tonyhb/tectonic/tree/master/packages/tectonic/example/basic\">Sure thing, partner. Head here.</a>\n","readmeFilename":"README.md","_id":"gs-tectonic@4.0.1","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-gjVqhEfSiC69Tn+sQU95ETSiRLAW0HpQgh+swYa8ijeOyZmt2Nwbxm5rLcI8EijPIYDjkDTJhvNhYtG26Ck64Q==","shasum":"ea55414f219bcdf32d7e0a884b7f71a1e75bf785","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-4.0.1.tgz","fileCount":61,"unpackedSize":3833028,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeYY/7CRA9TVsSAnZWagAAuMAP/AsISC9cacLga6ysJ8Dc\nMdKmxay2uOSzNiNu9e/zycQr267J8FYY+TnPHvbuD4Nb9dDxvwoR/XChpx08\nX4Xa9XIdGnhp0q9PtVvKij9/T/e5769HLf3F7cUW1ctvSDr/xeG+WrqBrP42\nFyYxpfch24x4FRq2P7mV6PmdbbZ2BN1fjJNVcPf8BbhFUiMFcOkomG/TzsTl\n4oOI5BSW8sbq437bNOpKS89uSXq5hZxc7p2WUlcu5NiFfoH9QG2R8ZOd71dx\nLDCD2IhhsIXFtH/kYs9vzGABsiFPGePIcwJRpEZVkf/dN40KSQD/ouJ1yyMJ\nUQL71Vg5bC1ejZ07xiDAB7zUhJkU76wah2PoGZsL1MDSS1QXBn+fsHnuwDSp\nHlEI2FnJO8v+MmdpR6xwLFmSsV4CzgB79w1QUS6wFGDrdLquiySD8WQhMklD\nKlELxOnOoS254xyoubJcgWWaEj9xj90InCRpXtGYuU41m0TWHEisveaaMX10\nfYpXUbxbD8V110vb3qPvC1+q1BYEWpsD2CirxW0domDrpHEHkir1fTb8FxpE\ncgkjWl+P9bZyqvXmKXfXsl7xeiWlbm2i2jB67pVia69Vp82XsGPjvRwvVHAi\nJvC2xsfmZ/WXFst66K3RqkQy1M2y/v0tf2UMHS0AQQgnrqItXMPeQqZlzdLJ\nP3KM\r\n=iTmg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAldenwUhRuF0bNn91op7rkvWn5KrzsprmyRUdAL02QkAiA+ACzN7Ddw7825px/9iHUj2D1l3DIlZHISu0AmJCHqMQ=="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_4.0.1_1583452155360_0.3437344685681196"},"_hasShrinkwrap":false},"4.0.2":{"name":"gs-tectonic","version":"4.0.2","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"_id":"gs-tectonic@4.0.2","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-0TieR7/WYvfV9CEcs4LmUFuBSsgJvAzuu29K+vbTtIWlmzx9cgETt3dIu4Jet30h53/+tjFf/kqMdu1SjolzHw==","shasum":"f924cbb251cabe860f791c35af8d0651a4f9877c","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-4.0.2.tgz","fileCount":61,"unpackedSize":3832918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeYZbtCRA9TVsSAnZWagAAvm8P/imDlZ5di/sqaZWgJBpM\nXqhlNErUenZJ0/peRbkYkmG2cKX2PmnJLL39T26DiwReKHSvRD+LvhjdLfgv\nXkjd8ZwHL3zo8gGkRnuZrU82i5oI/uDJqn/Ocd8jVUlwpI7YTU4n0IjZG1n1\n568Sm7NpCKcycsxF2Yo+qPYhtggsKqLRlvQuEtlgBLXHmR5eNKiXLXZKfVJO\nVA+V4paqAhaugUCWPiq7ohjZl3ysZ+Xj5xDjtZMJFm8Q51UJth7p7AvMHs7Z\nKzJRLhwWuxFo5h3Lkhs3Uj0/b1uXjd5A2BsfFTJb1ni8Ii9Vs97yS0jUMtHq\notbzWGQFlDA9LWzgjVrrrV0L7nlciqdWI1ujdR2ji1dmj0ng8Yo9pYUC90EC\nvLLhtELHuL+GiBEwo3Muxlgmdg3pCQYmpjCpE+L3LDLtiJMMunNK9SKlxb/e\nMhHo+djOFLYy6uGfyLySYKRhOZ2F2c4gp8eM/Bd/1SdNmGjd8vDev6mPevgH\n+esCZmfvmdPm+bJ3EHklVYtgp3Sdk9RNXM7/azVJGCevauvrp/Cg8nCibJ7j\nwhvTXISeKXmVmHlDyQQKmM3E3ElRYjDQyjRUCxQN94AKGR2647sABj6IPPgb\ncLwmgLxfZYRjl96k1jtM0yxa4YlYh9rzOW33/Frro1WFTufq2FcNnEYtdEbr\ngXNr\r\n=HcGm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3SeA8FGd1GnxJZD21lbkT/BRspPmMCAdoFsWQer8dPgIgdBvmaYw41TS9kOvWAPTLWtETectVZXh9dDmSDF2/rKE="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_4.0.2_1583453932858_0.8008534218337864"},"_hasShrinkwrap":false},"4.1.0":{"name":"gs-tectonic","version":"4.1.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"_id":"gs-tectonic@4.1.0","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-bCYKrT53nKV9ZwzbLULeDfrGcIb5JC9jw8GImGwVDKCcrEzPdj1mbkUheLQoDBD46SaIjn8mL8gFgmcmcNEelA==","shasum":"976a7d3144ef8e4f110d01cdaf58cf3599f965bf","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-4.1.0.tgz","fileCount":61,"unpackedSize":3832358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZtMiCRA9TVsSAnZWagAAFjsP/0cFrhc5UPfnezEqyBXc\n4zoeC+5s8h9Q3nHOdV+f4FDSFKQFQNORIJlolAb+4Mqom1AbXqjdqO82/U5S\n1FYx66B1vJli35Kuk2BIOWpdrXHQ0fAGMkTK5lmELKVEKo/U+OtePfF0NyCn\nCxtfwBCUmcBcSRWW++yKyLrSRMiXDDXi5FrSi9ibHypvbACxeGomKRtJQvKm\npZIeGjh2ITVJqQnqDOF3P9PFky57yJ79LGH5NgYSBOCrUE6GiZ+3BHLXVgUL\ni0zzW9P6nWBuRSXB9Od3G0Wx9qEhCgiT15jGrt6XMj3T/fOb2IkrVSEO71Qj\nPXNjH+ce9yirCVR9itFFXutmk+uH8erxxOYPhUtWiwt6tL4cVy1oEoP3iyXh\n/fb5z6InKyBC9jdwDMMYynvVYvBy6cAD/A3jmltseAo7SgUpKIs4XQ4WKo4W\nCrOUnDacGEmip5my0xHXgtnu7/F5orbn35AquNeVnk2H8ZJ+LUNvmKKkfh9P\nZlDrFdUMMIfqOHlhzCtV0UcDR/M8qaIoHEztljLrv+3LmOObUBzDHni/35/8\nV2rZ/mFo4Axi2VfvpG9KwoGZ8BJexk0cfZ7ZLXTHzErNA6rq63w3tvrsNoH9\nM7JH0dgFD/jNpXbnQoNklDdPXvSBBxkQiu7TDxaFu2yhqlDD4+DIJbfBtwQk\nukme\r\n=jdzH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDuoY/odqqUeQ+vPIOcrrUKSTY/39KK05q6uKK6T/ZjWAiEAqXQvJcgbLSD/NJDQcsx7zl7hW54yCR7j4C6huj50OpE="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_4.1.0_1583797025167_0.5324234698629218"},"_hasShrinkwrap":false},"4.1.1":{"name":"gs-tectonic","version":"4.1.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","lint":"eslint ./src","prepublish":"babel -d transpiled src","test":"mocha --compilers js:babel-register --recursive --require ./test/_setup.js ./test/specs"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel":"^6.23.0","babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-eslint":"^7.2.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","chai":"^3.5.0","eslint":"^3.19.0","eslint-config-airbnb":"^12.0.0","eslint-plugin-flowtype":"^2.50.3","eslint-plugin-import":"^1.16.0","eslint-plugin-jsx-a11y":"^2.2.3","eslint-plugin-react":"^6.10.3","flow-bin":"^0.33.0","jsdom":"^7.2.2","mocha":"^2.5.3","react-addons-test-utils":"^0.14.8","redux":"^3.7.2","sinon":"^1.17.7"},"dependencies":{"debug":"^2.6.9","deep-equal":"^1.0.1"},"peerDependencies":{"react":"^16.0","react-redux":"^7.0","prop-types":"^15.0","immutable":"^3.0"},"readme":"<h1 align='center'>Tectonic</h1>\n\n-----\n\n<p align='center'>Declarative data loading for REST APIs</p>\n\n-----\n\n<h3 align='center'>What does it do?</h3>\n\nGreat question! It:\n\n- Queries data via your existing REST API with adaptable query drivers\n- Stores state and data within Redux' reducers automatically\n- Respects and manages caching\n- And, best of all, passes fetched data and loading state into your components\n\nWhat does that mean?\n\nNever define an action for loading data again. And also, never write a\nreducer again. Which means no normalization of data! And no writing reselect\nqueries! It happens automatically for you.\n\n<h3 align='center'>Cool. How do I use it?</h3>\n\nFirst you need to define some models to hold and query data:\n\n```js\nimport { Model } from 'tectonic';\n\nclass User extends Model {\n  // modelName is important; it's used to differentiate models\n  static modelName = 'user';\n\n  // fields are used to create an immutable.js record which holds data for an\n  // instance of a model. All fields must be defined here with defaults\n  static fields = {\n    id: 0,\n    email: '',\n    name: '',\n  }\n\n  // idField defines which field is used as the model identifier. This defaults\n  // to 'id' and should only be set if it's different.\n  // Note that a model must always have an ID; this is how we look up data in\n  // reducer.\n  static idField = 'id';\n}\n```\n\nThen you define your REST API as soures. It's quick and easy, but let's skip it\nto get to the juicy part. Which is declaratively asking for data!\n\nCheck it out (I'll tell you what's going on after):\n\n```js\nimport React, { Component, PropTypes } from 'react';\nimport load, { Status } from 'tectonic';\nimport { User, Post } from './models.js'; // your models\nconst { instanceOf, arrayOf, shape, string } = PropTypes;\n\n@load((props) => {\n  user: User.getItem({ id: props.params.userId }),\n  posts: Post.getList({ email: props.user.email })\n})\nclass UserInfo extends Component {\n  static propTypes = {\n    // btw, these are the same keys we passed to '@load'\n    user: instanceOf(User),\n    posts: arrayOf(instanceOf(User)),\n\n    status: shape({\n      user: instanceOf(Status), // Status is a predefined Tectonic class :)\n      posts: instanceOf(Status),\n    }\n  }\n\n  render() {\n    const { status } = this.props;\n    if (status.user.isPending()) {\n      return <Loading />;\n    }\n    // ...\n  }\n}\n```\n\nHella cool right?! Here's what's happening:\n\nYou say what props you want within the `@load` decorator. The `@load` decorator\ngets the component's props, so you can use props in the router or from parents\nto load data.\n\nPlus, it automatically handles what we call \"dependent data loading\". Here,\n`posts` depends on the user's email. We don't get that until the user has\nloaded. Don't worry; this is handled automatically behind the scenes.\n\nTectonic also adds loading statuses for each of the props to your component!\n\nYou can see whether it's pending, successful, or errored using built in\nfunctions (the actual status is at `.status`, so\n`this.props.status.user.status`). Plus, if there's errors, you get the error\nmessage at `.err`, so `this.props.status.user.err`. Same goes for the HTTP\ncode.\n\nAnd as a bonus all of the requests are automatically cached and stored according\nto the server's cache headers. So if your server tells us to store something for\nan hour we're not going to make a request for this data for, like, one hour and\none minute!\n\nSuper, super basic interface, and super, super powerful stuff behind the scenes.\nI know, not as cool as GraphQL and relay. But still, if you gotta REST you gotta\ndeal, baby.\n\n*Bonus*: Guess what? If three components asked for the same data we'll\nautomatically dedupe requests for you. We'll only ask the API once. So don't\nworry. Spam `@load` like you're obsessed!\n\n<h3 align='center'>Mind blown. You mentioned defining API endpoints as sources?</h3>\n\nThat's right. See, behind the scenes we need to figure out how to actually load\nyour data. This is done by a \"resolver\".\n\nIn order for us to figure that out you need to tell us where your endpoints are;\nwhat they return; and what required parameters they have.\n\nHere's an example:\n\n```js\nimport { Manager, BaseResolver } from 'tectonic';\nimport TectonicSuperagent from 'tectonic-superagent';\n\n// Step 1: create your manager (which brings everything together)\nconst manager = new Manager({\n  resolver: new BaseResolver(),\n  drivers: {\n    // Drivers are modular functions that request data for us.\n    // This one uses the awesome superagent ajax library.\n    // See packages/tectonic-superagent for more info :)\n    fromSuperagent: new TectonicSuperagent(),\n  },\n  store, // Oh, the manager needs your redux store\n});\n\n// Step 2: Define some API endpoints as sources.\n// Note that each driver becomes a function on `manager` - this\n// is how we know which driver to use when requesting data.\nmanager.fromSuperagent([\n  // Each driver takes an array of API endpoints\n  {\n    // LMK what the endpoint returns. In this case it's a single\n    // user item.\n    returns: User.item(),\n    // To get a single user the API endpoint needs a user's ID\n    params: ['id'],\n    meta: {\n      // meta is driver-specific. In this case the superagent driver\n      // needs to know the URL of the API endpoint. It's going to\n      // replace `:id` with the ID parameter when loading data.\n      url: '/api/v1/users/:id',\n    }\n  },\n  {\n    // This returns a list of posts\n    returns: Post.list(),\n    // Each param item is the name of the param you pass into @load. EG:\n    // @load({\n    //    posts: Post.getList({ userId: 1 })\n    //  })\n    params: ['userId'],\n    meta: {\n      url: '/api/v1/users/:userId/posts',\n    },\n  },\n]); \n```\n\nA lot of concepts.\n\nThe manager makes everything tick. It passes \"queries\" from `@load` into the\n\"resolver\", which then goes through your sources above to figure out which\nrequests to make.\n\nOnce we've got data, the manager takes that and puts it into the cache, which is\nan abstraction over a Redux reducer in the store to manage caching.\n\n\n<h3 align='center'>What happens if I make a request without a source?</h3>\n\nWe'll throw an error which you can see in your console. Also, we use the `debug` npm package which you can enable via:\n\n```\ntdebug.enable('*');\n```\n\n<h3 align='center'>How do I add the manager to my app?</h3>\n\nWrap your app with a component which passes context. We call it a \"loader\":\n\n```js\nimport { Provider } from 'react-redux';\nimport { Loader } from 'tectonic';\nimport store from './store.js';\nimport manager from './manager.js'; // your manager with sources defined\n\nconst App = () => (\n  <Provider store={ store }>\n    <Loader manager={ manager }>\n      {/* Your app goes here */}\n    </Loader>\n  </Provider>\n);\n\nexport default App;\n```\n\n<h3 align='center'>Sweet potato. But can I CRUD?</h3>\n\nHell yeah baby!\n\nThe `@load` decorator also adds a few functions to your components:\n- `createModel` (to create models)\n- `updateModel` (to update models)\n- `deleteModel` (i won't go on)\n- `getModel`\n\nThey all have very similar APIs:\n\n```\n@load() // just gimme these functions please!\nclass YourForm extends Component {\n  static propTypes = {\n    createModel: PropTypes.func,\n  }\n\n  // imagine onSubmit is called with an object containing model\n  // data...\n  onSubmit(data) {\n    const user = new User(data);\n\n    // Each function takes two arguments: an object of options and a\n    // second callback (if you actually want. I prefer callbacks to\n    // promises.\n    const status = this.props.createModel({\n      model: user,\n    }, ::this.afterSubmit);\n    \n    // But guess what! You get a status for the query too. And you\n    // can use that status like a promise. Fancy, huh?\n    status.then(() => {}, () => {});\n  }\n  \n  afterSubmit(err, result) {\n    if (err !== null) {\n      // poo\n      return;\n    }\n  }\n}\n```\n\n💥💥💥! This is automatically gonna populate the cache, too.\n\nHere's the full options you pass to CRUDdy methods:\n\n```\n{\n  // model is either the model instance you're creating or the model\n  // class you're deleting.\n  model: new User({}) || User,\n\n  // modelId is the ID of the model you're updating or deleting. If this\n  // isn't defined we take it from the model instance in `model`\n  modelId: <...>,\n\n  // params is an object of source parameters for the API request\n  params: {\n  }\n}\n```\n\n<h3 align='center'>Can I see a full example?</h3>\n\n<a href=\"https://github.com/tonyhb/tectonic/tree/master/packages/tectonic/example/basic\">Sure thing, partner. Head here.</a>\n","readmeFilename":"README.md","_id":"gs-tectonic@4.1.1","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-gc+FScLcFSjOyL5oMB7ME7+teXvoaR7jwZSpB1hV2uVT1q95qx5kvp4Wfke91edq3mk4Y0UuLt2ZoHfDGWb9Bw==","shasum":"dc6447fed91e95ef05d2e28c4e0cc9bd65f736ef","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-4.1.1.tgz","fileCount":61,"unpackedSize":3832358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfA6VoCRA9TVsSAnZWagAAX8oP/3FIo82uqhdZ3IYGDDHy\nUAxMIKw4lB7rDOng/7nDEYd2kEuqPG7I8NUFROspZKPY0EwSoziVpr5Ke+wQ\nRs1+KUHBDgU6FUI0CoTpu9JBWGnG09JklCb/pZZUTavkGnyTo5W3ISyey9vm\nEFshsbY1HkQ+xsfdL8e8JQaeTrk2hRbUavtQ6M5TmhFyy4znjVprBN2Fgfjl\nYk3oqvw3bw4qHl9qR1vaeJNiY8uQHIz6o0NAqzU0tNKUtxQ/IhqcfF53CrFV\nMFHsIXDEveCGHjo/qVk3E8V+bBVVQjpD9WBLixCUAS6YU6N2DerWVpFmuOkO\naIRCtw3iutRsdTRZ4mXgNGvnrwSoQkJI/S1bAhQgvNYvnH5dt3pcqr+1/fR6\nSzfTy/jW6TSxVPP1Pnvha6/B+IznBzZXU7Xf8aPUpVM39x86cnRjKqfxT8hO\nBO7/YrW9JICpJpj+DWmnABqy3b0wu8O+Q5M92Be0h4gpeiONBaLLOlpI9NOv\nwBgC5ktlJAWPSBedyOZJERrCCkOdG/VIgM/MQ1famBXIC6SX/LqtqFipam+C\nttj5AbhqLXHXJfPemkq5JQJhvnPJeZcxuvCQfGpzYyt+KKqYKmB8ccWJ9/dP\nLkVO2xWAiKjV1ZBj5G5kC2/kSJezpjfuiC1TjcBceUyuK8fJCeFTyY5O3O77\nvIB7\r\n=S8Sv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLY+SDmpljj1PqyGvrt60sQ5oh/26tTFGEjonc4lytQQIgH/4um3nRoPenxg1jfELEhZg3BDBozKAaofXfk7pREWg="}]},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_4.1.1_1594074471927_0.782406402222215"},"_hasShrinkwrap":false},"5.0.0":{"name":"gs-tectonic","version":"5.0.0","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","prepublish":"babel -d transpiled src"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","flow-bin":"^0.33.0"},"dependencies":{"debug":"^4.3.3","react-fast-compare":"^3.2.0"},"peerDependencies":{"immutable":"^4.0","prop-types":"^15.8","react":"^16 || ^17","react-redux":"^7"},"gitHead":"a45119703f71800a52cb8a8e14049790029e5657","_id":"gs-tectonic@5.0.0","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-peSeo6xjKqz9sysDMSpO6OlxnXAegxHb1Re+/ElITOvqYKlpojx/OQRXikpMqXKkgnwPnoCbOG8hB5oGnfblAg==","shasum":"7d536c3786e24ad10be668e5d55610bc3c863344","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-5.0.0.tgz","fileCount":29,"unpackedSize":3739223,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF8IG/fj/xY/qjkpt3cT0uOZnsPV7yH3zy3Ae0SVYEpcAiEA0uZQIX4iBJNPh4nSyZ6BLuyo8ruVcnznqNhOIsxPqZo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWypLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIbw//dECVLEmbUSXwRg0zf8USqVED8M9Gq0nRi40h1x7m8H4K1TLX\r\nkY/bzPZ/8vMuBhxc9lyC3ubIEEwle2qiDaZraYKhwznr7EU3c9DslIUEGKWd\r\nb4bxv+nJJSJzqPE2/VNzwrO+oS3VrFBN3ntEqs/aDF2Nb/XDpF4QajbiZM/R\r\no5BYAywSEOIF1TsE7/k1ACB7mc0sEEm7NDkbrL0cJu6vtz2KcN4O3TCEt9la\r\nZVc5r4zOrkxjZuMkS6u0Kvsds4Pj0VQ5+qqKhTzW30J1XxtjWby2jYslA2LA\r\n9weL78Ev3XQU5XPFCaoLpuApnCIJ9JJ46SVi1vMSr0bo410gXb+aZ2poXbtY\r\nXL2pvVLpuy5yjFBczFHlwCGB9WbUyVowrkYr5CPQbrNk0XLOIhvZjtgqsbEv\r\nlBEMoM5+j1U+5MV5bjJ8J2ds9fWMSoCFLPAsWrb05TctuKptDiAVIOHVMXlR\r\nARFduicFWlgkmio1U6uxWH0x/vgXbfWSTTVbTn0S9HdTH2hqaPF8NVPnSrOI\r\n7nQ+yeVCcvdgwLLM5f/RduX7k9BqEsNjiq1m7nxAqWfRvQaEiEFsNv38m3Iu\r\nSwfpeVH5P1S6K6hs7KGjgOnnq8HxBp6sPb9akcV4yAn4yGAYJ25DZJipzozo\r\n7iXLou8BMFE/qlYY3Z5R9THIYJXKdgjcXxc=\r\n=6i6N\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_5.0.0_1650141771307_0.20864892752218167"},"_hasShrinkwrap":false},"5.0.1":{"name":"gs-tectonic","version":"5.0.1","description":"Declarative data loading for React","main":"transpiled/index.js","scripts":{"flow":"flow; test $? -eq 0 -o $? -eq 2","prepublish":"babel -d transpiled src"},"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"keywords":["react","data","loading","redux","declarative","data"],"author":{"name":"Tony Holdstock-Brown"},"license":"MIT","bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"homepage":"https://github.com/gsbhalsted/tectonic#readme","devDependencies":{"babel-cli":"^6.26.0","babel-core":"^6.26.3","babel-plugin-syntax-decorators":"^6.13.0","babel-plugin-syntax-flow":"^6.18.0","babel-plugin-transform-decorators-legacy":"^1.3.5","babel-plugin-transform-flow-strip-types":"^6.22.0","babel-preset-es2015":"^6.24.1","babel-preset-react":"^6.24.1","babel-preset-stage-0":"^6.24.1","flow-bin":"^0.182.0","redux":"^4.2.0"},"dependencies":{"debug":"^4.3.3","react-fast-compare":"^3.2.0"},"peerDependencies":{"immutable":"^4.1","prop-types":"^15.8","react":"^16 || ^17","react-redux":"^8.0.2"},"gitHead":"a45119703f71800a52cb8a8e14049790029e5657","_id":"gs-tectonic@5.0.1","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-iwqMY+Jwa/FLj0vNvpRl/j/iIgk0iRuzYJg3DVZ5RVpWzh3zqP+GIDBRAIG51W5owuNDRCFb8GlQcHSZtJa2Tg==","shasum":"945bdc3036871f0e4523cf9be6d41a483e65b90a","tarball":"https://registry.npmjs.org/gs-tectonic/-/gs-tectonic-5.0.1.tgz","fileCount":32,"unpackedSize":3782332,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDedigkIcDK63izOkaPwoeum63hyeeKz9tDMHSxamA13wIgVxKTiMQkIc3R8Gew9RusIHYECer0FxaND5yv3qO53YQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi4E4uACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpKoxAAmXdHSAVH6s/Lts5gnBdCrvBZQfj9xTVCwrGDk/vbhcHUXVTK\r\ntcMkQ17rb7ajSZrpqIJ0ONatrBb083Ct8cScEnVekbehaM49A6hwLH2f/Yek\r\nyMjS217aiOWmaK7ItDaXM3dUZL+dSDqUC2nP98OQypPccFQFnLuFcVebMjs7\r\nFENW9RYSKhaf+ARKu0fBWEGsMsBEVIJaPzqSOFniPUwEKbpUR7ywI4NbAsZb\r\naHGWT24BDHba3vUlfCVUxdyhCoLHIkf0AnIJfbbW0D9ZqgbJ9gw3HppZ1JmK\r\nyxPjHfq0CU3h9Jpf4MyPx+Zjxukvo6+D098P2IkB1sUuglJYzRUiJWC8DWOR\r\n6oH9oUFr45KugHxKuCbo8bOwEBYHvNcoSUuNIdhw99AvL9id8BXwd5HfdXgX\r\nFUquZBoFbO+C/d0rLmkUbabW0atsTEdk/A9lmRC4w1y5P3oHwp5BZZvRjk5t\r\n9Cs4HDcyAcM30e8d0+SI9lqL/Iul9U/ZRHeVjDB95iNbu+83+umQ5KyEQyZD\r\nb/32UMwj0MA31kZ1Q4fChtHLmchid6iTK+DVeiGEslvKVDAt8wLQSHLyi1kO\r\nrV2hcOoYBrAyt/CpCemnTIG/lX81SDW7CUiT3EdjOD/QpobxOET8IDyfx8SO\r\nB6iAWQTh0uW+OY7MroFLknir5mkXl/kNIKE=\r\n=/O7Q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gsbhalsted","email":"bhalsted@guidespark.com"},"directories":{},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/gs-tectonic_5.0.1_1658867245794_0.5694260152495703"},"_hasShrinkwrap":false}},"time":{"created":"2018-02-15T02:30:00.877Z","3.0.1":"2018-02-15T02:30:01.041Z","modified":"2022-07-26T20:27:26.097Z","3.0.3":"2018-02-15T03:39:06.579Z","3.1.0":"2018-02-24T03:49:11.853Z","3.1.1":"2018-02-27T17:25:46.983Z","3.2.0":"2018-03-07T19:38:27.270Z","3.3.0":"2018-03-08T20:26:39.496Z","3.3.1":"2018-03-28T02:29:50.229Z","3.4.0":"2018-11-09T16:08:16.877Z","3.4.1":"2019-03-08T15:36:42.302Z","3.5.0":"2019-06-26T18:00:27.990Z","3.5.1":"2019-06-27T18:20:18.128Z","3.6.0":"2019-07-02T23:11:47.933Z","3.7.0":"2019-07-09T00:19:33.531Z","3.6.1":"2019-08-27T22:33:51.091Z","3.7.1":"2019-08-27T23:15:34.376Z","3.7.2":"2019-09-23T16:03:20.041Z","3.8.0":"2019-10-29T21:50:15.212Z","4.0.0":"2020-01-14T02:28:48.829Z","4.0.1":"2020-03-05T23:49:15.582Z","4.0.2":"2020-03-06T00:18:53.109Z","4.1.0":"2020-03-09T23:37:05.589Z","4.1.1":"2020-07-06T22:27:52.095Z","5.0.0":"2022-04-16T20:42:51.570Z","5.0.1":"2022-07-26T20:27:26.010Z"},"maintainers":[{"name":"gsbhalsted","email":"bhalsted@guidespark.com"}],"description":"Declarative data loading for React","homepage":"https://github.com/gsbhalsted/tectonic#readme","keywords":["react","data","loading","redux","declarative","data"],"repository":{"type":"git","url":"git+ssh://git@github.com/gsbhalsted/tectonic.git"},"author":{"name":"Tony Holdstock-Brown"},"bugs":{"url":"https://github.com/gsbhalsted/tectonic/issues"},"license":"MIT","readme":"<h1 align='center'>Tectonic</h1>\n\n-----\n\n<p align='center'>Declarative data loading for REST APIs</p>\n\n-----\n\n<h3 align='center'>What does it do?</h3>\n\nGreat question! It:\n\n- Queries data via your existing REST API with adaptable query drivers\n- Stores state and data within Redux' reducers automatically\n- Respects and manages caching\n- And, best of all, passes fetched data and loading state into your components\n\nWhat does that mean?\n\nNever define an action for loading data again. And also, never write a\nreducer again. Which means no normalization of data! And no writing reselect\nqueries! It happens automatically for you.\n\n<h3 align='center'>Cool. How do I use it?</h3>\n\nFirst you need to define some models to hold and query data:\n\n```js\nimport { Model } from 'tectonic';\n\nclass User extends Model {\n  // modelName is important; it's used to differentiate models\n  static modelName = 'user';\n\n  // fields are used to create an immutable.js record which holds data for an\n  // instance of a model. All fields must be defined here with defaults\n  static fields = {\n    id: 0,\n    email: '',\n    name: '',\n  }\n\n  // idField defines which field is used as the model identifier. This defaults\n  // to 'id' and should only be set if it's different.\n  // Note that a model must always have an ID; this is how we look up data in\n  // reducer.\n  static idField = 'id';\n}\n```\n\nThen you define your REST API as soures. It's quick and easy, but let's skip it\nto get to the juicy part. Which is declaratively asking for data!\n\nCheck it out (I'll tell you what's going on after):\n\n```js\nimport React, { Component, PropTypes } from 'react';\nimport load, { Status } from 'tectonic';\nimport { User, Post } from './models.js'; // your models\nconst { instanceOf, arrayOf, shape, string } = PropTypes;\n\n@load((props) => {\n  user: User.getItem({ id: props.params.userId }),\n  posts: Post.getList({ email: props.user.email })\n})\nclass UserInfo extends Component {\n  static propTypes = {\n    // btw, these are the same keys we passed to '@load'\n    user: instanceOf(User),\n    posts: arrayOf(instanceOf(User)),\n\n    status: shape({\n      user: instanceOf(Status), // Status is a predefined Tectonic class :)\n      posts: instanceOf(Status),\n    }\n  }\n\n  render() {\n    const { status } = this.props;\n    if (status.user.isPending()) {\n      return <Loading />;\n    }\n    // ...\n  }\n}\n```\n\nHella cool right?! Here's what's happening:\n\nYou say what props you want within the `@load` decorator. The `@load` decorator\ngets the component's props, so you can use props in the router or from parents\nto load data.\n\nPlus, it automatically handles what we call \"dependent data loading\". Here,\n`posts` depends on the user's email. We don't get that until the user has\nloaded. Don't worry; this is handled automatically behind the scenes.\n\nTectonic also adds loading statuses for each of the props to your component!\n\nYou can see whether it's pending, successful, or errored using built in\nfunctions (the actual status is at `.status`, so\n`this.props.status.user.status`). Plus, if there's errors, you get the error\nmessage at `.err`, so `this.props.status.user.err`. Same goes for the HTTP\ncode.\n\nAnd as a bonus all of the requests are automatically cached and stored according\nto the server's cache headers. So if your server tells us to store something for\nan hour we're not going to make a request for this data for, like, one hour and\none minute!\n\nSuper, super basic interface, and super, super powerful stuff behind the scenes.\nI know, not as cool as GraphQL and relay. But still, if you gotta REST you gotta\ndeal, baby.\n\n*Bonus*: Guess what? If three components asked for the same data we'll\nautomatically dedupe requests for you. We'll only ask the API once. So don't\nworry. Spam `@load` like you're obsessed!\n\n<h3 align='center'>Mind blown. You mentioned defining API endpoints as sources?</h3>\n\nThat's right. See, behind the scenes we need to figure out how to actually load\nyour data. This is done by a \"resolver\".\n\nIn order for us to figure that out you need to tell us where your endpoints are;\nwhat they return; and what required parameters they have.\n\nHere's an example:\n\n```js\nimport { Manager, BaseResolver } from 'tectonic';\nimport TectonicSuperagent from 'tectonic-superagent';\n\n// Step 1: create your manager (which brings everything together)\nconst manager = new Manager({\n  resolver: new BaseResolver(),\n  drivers: {\n    // Drivers are modular functions that request data for us.\n    // This one uses the awesome superagent ajax library.\n    // See packages/tectonic-superagent for more info :)\n    fromSuperagent: new TectonicSuperagent(),\n  },\n  store, // Oh, the manager needs your redux store\n});\n\n// Step 2: Define some API endpoints as sources.\n// Note that each driver becomes a function on `manager` - this\n// is how we know which driver to use when requesting data.\nmanager.fromSuperagent([\n  // Each driver takes an array of API endpoints\n  {\n    // LMK what the endpoint returns. In this case it's a single\n    // user item.\n    returns: User.item(),\n    // To get a single user the API endpoint needs a user's ID\n    params: ['id'],\n    meta: {\n      // meta is driver-specific. In this case the superagent driver\n      // needs to know the URL of the API endpoint. It's going to\n      // replace `:id` with the ID parameter when loading data.\n      url: '/api/v1/users/:id',\n    }\n  },\n  {\n    // This returns a list of posts\n    returns: Post.list(),\n    // Each param item is the name of the param you pass into @load. EG:\n    // @load({\n    //    posts: Post.getList({ userId: 1 })\n    //  })\n    params: ['userId'],\n    meta: {\n      url: '/api/v1/users/:userId/posts',\n    },\n  },\n]); \n```\n\nA lot of concepts.\n\nThe manager makes everything tick. It passes \"queries\" from `@load` into the\n\"resolver\", which then goes through your sources above to figure out which\nrequests to make.\n\nOnce we've got data, the manager takes that and puts it into the cache, which is\nan abstraction over a Redux reducer in the store to manage caching.\n\n\n<h3 align='center'>What happens if I make a request without a source?</h3>\n\nWe'll throw an error which you can see in your console. Also, we use the `debug` npm package which you can enable via:\n\n```\ntdebug.enable('*');\n```\n\n<h3 align='center'>How do I add the manager to my app?</h3>\n\nWrap your app with a component which passes context. We call it a \"loader\":\n\n```js\nimport { Provider } from 'react-redux';\nimport { Loader } from 'tectonic';\nimport store from './store.js';\nimport manager from './manager.js'; // your manager with sources defined\n\nconst App = () => (\n  <Provider store={ store }>\n    <Loader manager={ manager }>\n      {/* Your app goes here */}\n    </Loader>\n  </Provider>\n);\n\nexport default App;\n```\n\n<h3 align='center'>Sweet potato. But can I CRUD?</h3>\n\nHell yeah baby!\n\nThe `@load` decorator also adds a few functions to your components:\n- `createModel` (to create models)\n- `updateModel` (to update models)\n- `deleteModel` (i won't go on)\n- `getModel`\n\nThey all have very similar APIs:\n\n```\n@load() // just gimme these functions please!\nclass YourForm extends Component {\n  static propTypes = {\n    createModel: PropTypes.func,\n  }\n\n  // imagine onSubmit is called with an object containing model\n  // data...\n  onSubmit(data) {\n    const user = new User(data);\n\n    // Each function takes two arguments: an object of options and a\n    // second callback (if you actually want. I prefer callbacks to\n    // promises.\n    const status = this.props.createModel({\n      model: user,\n    }, ::this.afterSubmit);\n    \n    // But guess what! You get a status for the query too. And you\n    // can use that status like a promise. Fancy, huh?\n    status.then(() => {}, () => {});\n  }\n  \n  afterSubmit(err, result) {\n    if (err !== null) {\n      // poo\n      return;\n    }\n  }\n}\n```\n\n💥💥💥! This is automatically gonna populate the cache, too.\n\nHere's the full options you pass to CRUDdy methods:\n\n```\n{\n  // model is either the model instance you're creating or the model\n  // class you're deleting.\n  model: new User({}) || User,\n\n  // modelId is the ID of the model you're updating or deleting. If this\n  // isn't defined we take it from the model instance in `model`\n  modelId: <...>,\n\n  // params is an object of source parameters for the API request\n  params: {\n  }\n}\n```\n\n<h3 align='center'>Can I see a full example?</h3>\n\n<a href=\"https://github.com/tonyhb/tectonic/tree/master/packages/tectonic/example/basic\">Sure thing, partner. Head here.</a>\n","readmeFilename":"README.md"}