{"_id":"@aofl/rotations","_rev":"148-506045c1b51169f0ff8fc9086eec0fcb","name":"@aofl/rotations","dist-tags":{"next":"2.0.0-alpha.20","next-alpha":"3.0.0-alpha.12","beta":"3.5.0-beta.22","alpha":"4.0.0-alpha.45","latest":"3.14.1"},"versions":{"1.0.0-beta.21":{"name":"@aofl/rotations","version":"1.0.0-beta.21","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.21","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"dist":{"shasum":"296f99d0374b5e0f1c2f8984b3483fdc0c028136","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.21.tgz","fileCount":3,"integrity":"sha512-0Q+5FEbslBRNcH/w0ice6owKWkG5e5HLDa3M0a10zPV1fBNJ43SfY6jGFETqHNvY0uxDZFiDSV3ucyU3r9RFYQ==","signatures":[{"sig":"MEUCIH1alt9zIDu6TWSM1S8k1lstOOmfJDaD0N7UFjTVzWAkAiEAx+OpjmYfJb1uUFitHBzipwfFIogkPY6o8o0zVHDQ47o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6888,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZ05PCRA9TVsSAnZWagAAOr8P+gP/Xx/i7JjCgca89WQr\nqYVRYX3HP3emHARM4NNWg4MOwlPx2l6bdsihy9KnVOAayhUsjy13OWhDnlVL\n1kCrjdTiA+rZ8rnvBikr361kelLJgWesChYXLVRHxo+DlqQDVvxwpTUuI4zY\nAPaoFQ/NTKQ+lpFu1o7Krtm2+XbOyQc6fiDT8vHvpgNFLppeJxx9umBH6MFD\n4fZ27rIXY7A9XWWg/nV5hFcZLGvkBMy8CoHwFEOqG/bV63nCcxhNQVvglWQ3\nOi6HDxmlzQtN8usE45z+RY+OfgNqEyTFXhYZD7cJcrgwyRQw4O/CIgpotvBa\nB5pyQRa29qGSnGQb6+cwrxpsz4mY0n8P8dwSMwQgto8QMzyDixzoF32x8xwZ\nzLfDXSqF2wt+Ztx3vEvjNI4yS5kNq2Y/S3fjqBFvNFz5NJyBrrlscEq5V+MX\nvkmt5sp3gI1XDVEAWsPdwd0iPLtGg1hIZxXrD3z1Q3h8wqNZ5dJ1a2iHPAWc\nCSjrsi7SYnCBFcD9Gro3iRWtEtgryClOWc0ney1Xj19u0PUALRnlFKrTNnLg\n9TfS+oy5+8qlP2VVmh1b3BnBl5tATkqe6owptNcUYcVFnb2qVHKm7vxqaaEE\nNNO04spZ0JX8YrauGlKno8SYz2sPCojFAxcDFz5foEZHHhTWDoPVFvXGw2pj\nwcdw\r\n=KDXr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@gitlab.aofl.com:CoreJS/aofl-os.git","type":"git"},"_npmVersion":"6.2.0","description":"","directories":{},"_nodeVersion":"8.9.0","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.21"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.21_1533496910868_0.7680659359913924","host":"s3://npm-registry-packages"}},"1.0.0-beta.22":{"name":"@aofl/rotations","version":"1.0.0-beta.22","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.22","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"dist":{"shasum":"33630273e1dedc9fe6f2bdfc7ef6aa07ce673c95","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.22.tgz","fileCount":3,"integrity":"sha512-07J437Lh73ETLDqOuMVeeS3fptv2/8qpX19IZKATOUdWXfkzPBzqkPc2ymJ1cO4Yw0CdfhJoi8vgsk/VsE2iQg==","signatures":[{"sig":"MEQCIG/qgSjqic5cF0u9rA/NtfnlTPR5mdIASV0VEvumDk9FAiAQss/NAsWJPQ2FcNhb6lhcZ5Mxn1RTFznO5CudWh0D6A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6888,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbedYCRA9TVsSAnZWagAA+I4P/3cVmXhVH7WEwiwqCAA0\nbCnZ4aIoPbZghABlxdyhC1l+HzFFsQKXm3naJfrLqMs1DLNClcsH2lZE4Rjn\ncz735aeN72KYajNXig3wQ+rWIMucpIzp6mrOb4WgSUlcMpNNkmZwUNdKBKK4\neUOAK+uGzyW81cyzF3ynZ14c0pf4EZQVhy4N5B4VPJ/oraJgGOCe/DgisITZ\nyp6VbfghrWYR/6X6nVhVhC+u3aTQhJsdty9vnuASyZfjB07TVtj9D3FW/Dz/\nYK7xkQI4Nfmj+OMLgCefZt8keDJcpgn6Payqh0eVaDjSH1zmrsVsu2eHg70Q\nf5t3WcGvwWeIC7VRL8Z5jmjq81e/hSppc5k0XjSCT0KBV1/QBShBS/zYG3uq\nZDrVIEXYzRa9FhdiKhzpcT2zzdryN7Qkf6tieS/I99/duAyxWMfv4xVs8UgB\nk2U+io3WYMsQBDOgYEd2VCYsFDCrEZmN6vFg+ee+t66e4qJZ/08p6kpWNCU5\nD30BDCQ/6a48rDu4wOHK5AmiK+w3hWBhXXaG36IZ6LEiHcPEIqt9Y1dofwq5\nhUFn5Gn9ll2aX9GH7IwlzwB3CQS/tE5dY3OM1XG5xeFNkDYAVi4KZqw6YE72\nrViWvnE9exdu6DS3uLseN3wrlebpMXNMk+WmJr8mOtPHgy89hf2zOT9ceuxk\nDwTq\r\n=L+n4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"ERROR: No README data found!","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@gitlab.aofl.com:CoreJS/aofl-os.git","type":"git"},"_npmVersion":"6.2.0","description":"","directories":{},"_nodeVersion":"8.9.0","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.22"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.22_1533929303698_0.055568478945337674","host":"s3://npm-registry-packages"}},"1.0.0-beta.23":{"name":"@aofl/rotations","version":"1.0.0-beta.23","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.23","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"dist":{"shasum":"3b4047570f0cda2541f46a65e2307b8141fc2e07","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.23.tgz","fileCount":3,"integrity":"sha512-13JYRfOnkog16h6b9Uq/S1cuCWCRQBwzOK9iI172F8yH7LDUYGS35OLvJjloWRwaHbBeKrKFa64Vb4Ly/kv+0Q==","signatures":[{"sig":"MEYCIQDYz1Y0VPd6auiieNSZGNe+W98C2HOeL8+cBPvdRQ2J+AIhAIiEFkxaCS1OzB4rp/5TU+7+PxbQDhLV1OPfJFVmZGq6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6888,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdfAJCRA9TVsSAnZWagAAks4QAIiWRUg6A2FXjOo5eAUh\nw4s90jLevIMb4ykl4X6Ao1zZkku1lmjg9HMHbpZa9Y169+QvvUzf2BReVlNj\nAE8AwWP7xbufhysHkyS3w+Dm/6sfIk0X169OS4CJAs1m57pIkZK0GZ+VaZ6m\n+tTWmS7I6DDp7Vh+YYQ65jRclD4bPU4sO/0e6haLiAEhx7avM0L2DlRbZ2e2\nCjjoPve7ugQUs15Lolfcj/cYhrxvWkO6TGqsibHyueGjAV+UHOWkbUUA5NLe\nIHCOvXZFiK8uU7o0nqKI+3s4YD+8Ca+ZGBz2lnlr8kBaMMQcGwS0qfIz51SU\nnY/jtSbR78eJFm/74faVxFGOGM44twg7d2HP4j9smULOqK/Jl0FhuFB3tNgS\nC+3IMAwnwdHF4a+GWTTSjA5nFO7egHLQyx7hW+0zR0cjpcbg8BaxzzGTwcsC\nPiVwgoXfPUtJmxw1txcUpg6GoeSdP6T6PSg87H6d9LO4JCyipEPTe9H/xIuQ\nN3odFSIJPjOZUW4hQsTDRH6P2dssJj1fGZrpO1Qg9gBKxh+pd1wH2v2WVFZm\n63gtaovSiiTlSA2JsBcvRquINx2NbKLODow+1G7dlzwPPc7GdpDkJTXyaXIq\ngRkeGptMymCZnbG3SxKUVZYnEXBLC/LP8I4pCGJxIef2Kg6c+Ixmj6eT3fHI\nTFuW\r\n=mT4L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"ERROR: No README data found!","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@gitlab.aofl.com:CoreJS/aofl-os.git","type":"git"},"_npmVersion":"6.2.0","description":"","directories":{},"_nodeVersion":"8.11.3","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.23"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.23_1534455817156_0.23035625055494235","host":"s3://npm-registry-packages"}},"1.0.0-beta.24":{"name":"@aofl/rotations","version":"1.0.0-beta.24","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.24","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"dist":{"shasum":"0ee9e40c67c6c5431301ed70e31fcfeff304ba51","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.24.tgz","fileCount":3,"integrity":"sha512-912DMpSdME9Rll9fodu/pYuUM2yIQBgzZgURE2IgmCT6ta4+A9VtggwBBvzLSniPPNlDfj8NPulxpKhODWgvnw==","signatures":[{"sig":"MEYCIQDvH78OSHeZMdXAxv2O2IZ2pKS4X6aETofcfoEpuMtghQIhAIlE2a91u9owqDtyChDFKieJC+zB44Jj32cQJwlNve8M","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfeUCCRA9TVsSAnZWagAAws4QAIZVxMKqP6bKhF7EUKs5\nM4Qu+jEld9KujIedNpmEcZa3Egk1Op5ISqLyNjOZa1AuCPerEEWhQ51JqdEd\niv0tGSM3zkYKKqlP3zHbipuMQAjoEApymtFSbR/bEE2HN4KQp+crtWV4lfXM\nLz+t6oye+4HMeeOTuvP3Gh7Cjdr+fW3VZ24WkF9kNKXQmMS4jqch5n83p6Uh\nB7QgJ1nCAdKUGGerCTYTpyxonU6DfjBDmP/bU3thZCCKwsELzM1a9SnbGOwZ\nxgmax+h0lliUvmagnocqiOdQJ+oV7nL6+gyBA+0s7+W5rWLLcw9t+h0zB0dB\n6uE2P5Wjep3WB/0J69miqG5qUI2kbxHhqSQDw5SSPecGHfXjOOQdLKpo5Pby\nq7YXfqzlicNc8kortuTHVQkQCdN4YVwQuHZyrDrqNnuxiGbN7xJDssZghhPa\nLrj19WAVLdufKR/rEojM61+ddV8z2VcQ17lBHyozZuQMTaG1sd88l16usj7o\nF4QxqHcJibu3foPrhlWbZMaUPrim9RPaO77hFpi/FYJFCFdJfNeaxnOZC7Pn\n0muPfDlUlqZCDSVNWFtS7zAurh+aEw42eHPQVqg0lpCj6FdGZKAwCRQuoa0F\nxrXwmCSBlXseq4gYAmBdHEjQFGX3m/BfgFf7AOwk43NiNmqMl3LVofA3qX0Z\nJY/K\r\n=MXfp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"ERROR: No README data found!","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@gitlab.aofl.com:CoreJS/aofl-os.git","type":"git"},"_npmVersion":"6.4.0","description":"","directories":{},"_nodeVersion":"8.11.3","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.24"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.24_1534977282219_0.5426716027346861","host":"s3://npm-registry-packages"}},"1.0.0-beta.25":{"name":"@aofl/rotations","version":"1.0.0-beta.25","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.25","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"dist":{"shasum":"7e334af57d564678a039bc55dc89d41387510a99","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.25.tgz","fileCount":3,"integrity":"sha512-cMiQnLX1TX1cYeAxMq5JHI8qiVYX+DSNIkjk02OXjcaxwi2yJnNpMG1z1J01DQwEyIX7BaWUB4umn8wipIdVdw==","signatures":[{"sig":"MEYCIQCbmSQgyVvZGmjgfMjNUXqQznNR/9Q0Q73jPnPT7P7JxwIhAOgDFFq+fAWMufmlpHoB4Ql+zidmdvsu3spI2RpUB6UG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfwsECRA9TVsSAnZWagAAalUP+QHutsyEGd7WxGvQo68u\n9nmOm2WXKIxJP/sq9gj+VjcwnUEMs9EQeRBamwzzYUfCZ9tr6/m4BY0mgrsN\n2X8ZNkSYptFrfk6kKadL8kgh6yeSxQFlMjP2HxUIhcgvaAF7P7U6zgYFVEZ0\naZY9lIV1pV2l7FUVH6gTpiqnrcbHuzNNkwpAKrkzJKDy6rE5mzSFrslNSWPF\niyOZfCneF5JlzkcF6wrmiKJ309Eq16vucibtBafiUKFOr8xGhKQmIT733rO6\nxPMfUnNvFgxjf/196AvTtUIHEgcWZL69m0X9wCmCxtyDQ340b2vVAvu/Nj8j\nbDlTCMF4jgaleB2gFRMy7UWzktoy57OElpWVgDhsKSdR5X+g7BiSXhzMkS0T\nJusqBhGNuGdR54yfO9DgTlgxcuumZIvKRiSRSrTssb9w7niS6BtO2jBNReEE\nc8KGHzD2pBoS2ykdZETlLRLu1v1jamV9U1SfwayXCyinCu2BxQ5CtAyVVMYV\nC1XTrS2pjXHyZ/ySKKXxgfzEciLKVBKDdetcUo8O/HMeWg1fingtzBsJxGdT\n+6F0+wgkSlMeQcmZuEcu9slAUEo5G2wMFVTDu4UQgWh5SSfQa8wVlGp+r41n\nBYvBOhxmRXl+xIR2YPwG3Y4+tH4U9REffgE2pdHlTQaJO0B+o2JLfaQ8lg+S\nsw8b\r\n=gP1E\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"ERROR: No README data found!","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@gitlab.aofl.com:CoreJS/aofl-os.git","type":"git"},"_npmVersion":"6.4.0","description":"","directories":{},"_nodeVersion":"8.11.3","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.25"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.25_1535052548097_0.14826739586839333","host":"s3://npm-registry-packages"}},"1.0.0-beta.26":{"name":"@aofl/rotations","version":"1.0.0-beta.26","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.26","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"0e7cf303b4a345e6718c48cae3b75daf94f2063f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.26.tgz","fileCount":3,"integrity":"sha512-k/mQq9FbS/49qqjvQx6dFXnhUvY19e2JUw4/BC8RhGpCcPT0b2ohipw/bWrCNriqCLSxogfV0PLyVHBFJ9celg==","signatures":[{"sig":"MEUCIQC7lkXbLi0UjaIGXL1Swu+5UNmtSdG20CoDHv6E9aR9tAIga+ETqGeAdSXkMWf41haUbNcrzop1qLkt9Vz0YhWaBJc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":6917,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhEE2CRA9TVsSAnZWagAAmpsP/R/s7X474LI8qkyeCRbf\niKTNexkDqkwn83yW+1/Di5i3F/guy2bfImv9jK9wKeViksPx2rNSjUYXMeL0\nmTJkIkXCKrxFD97Ec8S8p9KoF4b/JI8XjCxnmx8tCtBla14tyeATAkBjt2OF\nV4SSMyvtJ2z7y7Jz4uDM8LWewamfMqbDeYKxyEPQ0ie/YUrdCmvJe6q7flyS\nuCPUEiJtjSwcR4wfTZKNYq4JPD9cPLUNGnFegBJZvVkVARqQJiasrfmTpZQa\naPNuEtDoyv1D0nz6YKTH4THr2ZY9SOpnbpmRZKWpITEB77ZTkBachF17zyGi\ngApiRkS+zN5mCdsu4HXYwe6VuQOFVXgbmHHteG+LMniWGo0NvMfr6z8gE6WI\nkdMtFLae8mBIMnDV0uNmTi3B7/QS1oFx0dPA8Jqcm4vLaX0GAKxd0mOxgP+F\nRAaX2LjX9glO04OFsVVG56+6flo+sPvyAAxFqUqIW+mP/xPxqGFSuUDWiEqK\naMeg19llZRrWJpcdKyg/tPVtUleA5jOSPsTDu6xCvn5SSe5piceQwOAp5sOz\nhVDlGg/m2niPaiehf12lyvTp6dx06YxEkRnARHU3oTA7rozZg9ynV4j1Tfwx\n3zBo7/6awz6H9lSUBNaF3prL3zRCWEsLP+QOT1v6654q9BuK/Xp6a8AAtcDP\neni/\r\n=kdl0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"ERROR: No README data found!","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.0","description":"","directories":{},"_nodeVersion":"8.11.3","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.26"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.26_1535394101622_0.439906484822576","host":"s3://npm-registry-packages"}},"1.0.0-beta.27":{"name":"@aofl/rotations","version":"1.0.0-beta.27","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.27","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"0fc4bee7e55993735b55ce70643fa247607a550f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.27.tgz","fileCount":92,"integrity":"sha512-Z74b7Tc8/7kiB2NzXj7r0BD/xPJJzoB0EbCECcQ+pp7KngAbmHrOWL43gUSPQycJxxLZwC71dttIqSCVC/ra9g==","signatures":[{"sig":"MEUCIQDQRusCeNdFQm8dDtAkgLLjVGQjxXnJne20VN+E8Fa9BQIgQTBjk/tZtlXkoAdZQKajWg5/26O8e7JNfDRR1SMugYU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":435109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJblw4cCRA9TVsSAnZWagAAQ+cP/iEbbsXBvCllNpwfRvIG\n1OLkiaC2xQIWGuuloBifqlxkD11g5DtBpBg77BJ0bkFDxYppGhIf7u56ME/L\nZIi91kCYvaT+qZOPOnnhkUJXkQQWMlHjNjlO+Hvlizar0pkXxoPFakEz9/hb\nWCnYqqPskeP2HRupnVre1LYipwpg1zSEM7J0aPFf2qeKZv5cFuD3NX9XfdPZ\nh1N9MCG/V/6T2AI4qEJsymjW8uVgawkza9thp824YRG9X4aUdsOtpEsWihgy\nkB7lyLkKRdWGauI6ySCKhNWoEASit0QoUBCIXSbJCBS8hxgwJfgKzzLMsatX\njwDmzfx56YojsodauM2p5cxPaztpDTnAmTT7L/G/PHU2oKbWEN5L/6G2vl/I\nnm6F+wB5Rz3Zhco5OfDK8vxRpv9azun99RK/WP38xC411EnkoNRWlII0UhKM\nx/nTxSFImSIQKmLnIZygn9RuqUJFbAyLXyg5UeFgJyMIZY/gQMhPdyZ6/NQU\nQ0vIebLnKVmZLTS/OxVYzW5/dUYy82GQSAK5RYJuuJiKm8XNPCtqtGVpakmD\nwIeCeY44bgfNsSGXyiylWAhzhNbV2miZF6Kyy8HjulpqLZolxMbG5Xt4ORzu\n9fHo7dOMnHvEiDktxtA2BnCDzhIlb2VareiGaM/sUzfSB6FieaBp+LCYgd2i\nQLCb\r\n=VjMw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.0","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.11.3","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.27"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.27_1536626203778_0.6289032005220772","host":"s3://npm-registry-packages"}},"1.0.0-beta.28":{"name":"@aofl/rotations","version":"1.0.0-beta.28","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0-beta.28","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"6ed76bebcb602d9460a9e25a703780b2cf80b974","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0-beta.28.tgz","fileCount":92,"integrity":"sha512-JqGH2YaDHnRNNNhgQ8kXLG5plqGbzzlD18hakp3wBbdrv5ag4Git8ga1ysjEvo40/MkKlTWMEhJklO3lX6BGWA==","signatures":[{"sig":"MEQCID8eJCItL7CYxSZ1td1ziiLRy3WYYfixkN4tjJVxcAkVAiBy9YnPxOOSqJtc9lBXIv71IvmWsvh4z20/CqMfdWycxQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":434988,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbrXaKCRA9TVsSAnZWagAAt/QP/2Z8YMMjAqAOaeMLs1bb\nZOMH9yk9n7HWU7hMpx8eXMHrN1eEi/7IrVDxmNyKYE33MprWwpBj/LawWAJ3\nczCZ4WJWtnkNK7+NGfqTb0Oy/NtSjiNIY58IB6Leh0z6e0hJQLZujYJ5ybhz\no5V0mbKpfdewvYAQu95fatMRMy4XoB7CRV5aC50314wM3sdSkV2UWOQod1pq\nvnyifaK0NM9ezm/bxwofS2yMPGte2Su2YlWQhwbwMp7g4hxUObOq73akq3pc\nvuMNAL77WyfTVKlD9GW5BFIN2NwAlYLxGs+an8WyzGqBKwZJ1BpbFSefDqG+\nbkLZY89w7mKtua9BTPOhzuSZmVnpBHpUbjNmYrxWAPHBt+iPAVxZaOVF2bd7\nWks04EBEXW/86o/Q+4bT8TduX9kzvvCWz9/cg6VC7icTwZi6m598bX6tE4g7\n+t/EXahQLeN5c1/J/TTAPxB86fqulXA4Se6bdAT+909Ec+iZINgUvbqRicL+\nKDzfHGmBRk45+LLb/FFih6+tBSqDVQpr5m5h/jTzoKLZWU9/grEDF00hnN07\n7weVZxC24CUVrThbxCwCuL194AJv6e3Q/KAXTqli9H4UfQM6p45e9nijWylq\nA1vylScRCfzYaOSsq9Rf6flsYBUzAeK+Pek3A/zKUUkEmt8N3HNgNoD8YMQo\npG9L\r\n=1Ckr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.0.0-beta.28"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0-beta.28_1538094729141_0.7809130492851009","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@aofl/rotations","version":"1.0.0","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.0.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c3744adf565c16f0776d13eab5db024822174711","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.0.0.tgz","fileCount":92,"integrity":"sha512-fvy+8RRAGhZbYJDuMp/ckCzpABq2pKQC7jO9l6jRGIC1g5vArc4Kwq9mQ/1Gu2ATEN5ScqUSvecrtCUi9rwnZg==","signatures":[{"sig":"MEQCIDu9pJcfIDS7IW2/gJSz4HnQ0oyMpvNoh/TfysfC5QmlAiASzh5YYG9uac0Txx52o7H1WQnZWKSjVmPwzXBMKkwlSA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":434966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbsAT3CRA9TVsSAnZWagAAddYP/2EqLJxXoDnEMOOlR9ow\nODx8kglPhqJ2NZgYNdLvCgMS3YcerNjQzfD372ieVQqdmHcJ2+6hKAF1H9AO\nVSCs+KW8WCWxSaqTuL/sx29Rj3c2bqygzgGnCNvBalG1RosjKp0CJAHNS1M/\nGF545YcUTznOKAcHLu6C5jUTTy9CzT0JkasYvh+kZqg93PXHJRbw4IXRSUdE\nVhKQiQOz2x1BWUBKZ+f4kgV42VTVdwqSTqDekZ/DpbG65FrktnIs/d2nXeQ9\n3ThKn+8+eU3sIUaDYfwBHQlXDnW8bd06Tp/cD2yAQqt5AieMO9J98llcjifl\nsOxIbyc/FvlyHYnAy3Sivsu02MaZZ87AuNQ5a/AvL2sqvayXjWUYKxFdo8cP\nbvOaPyAymLBZvXe72ja7AJUop9RK/ZoATzFSWIzXqlNKGKNp5a8tLPrVjoBB\nshlOB67e1o8B6K5JO3Lv/Pyn7rcgkef2w2AnamizdpCOhfV3uhlmhQGj9MtH\n60msZxi19HSkXIJtUTqCJZoAYg3iwZFKWUpOMf+PWnK2NLZU2uNsBHsZXaAp\n+sc9RuVh+yLXr1ciqaQbjPhrqigdKURU4gz5qB7x9JrB9sGZTA2ujCMTr8TP\nfqQYUnxVV0vSze3aoox2rKj5YjLNuFp7F+y0eEc9vifRfioNu22tU2s7NObl\ng7SB\r\n=Olxp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.0.0_1538262262103_0.4332694510989945","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@aofl/rotations","version":"1.1.0","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.1.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"50e83e3f0422964dca1de9cc8f31a90dafefa042","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.1.0.tgz","fileCount":5,"integrity":"sha512-+egnkRwtlcTziweE7WUaoV58Hb18WSPJEqfMOiHUMIHxF/5VtJXksKZ9///wUqx5M2Cx5Vjd3Ox0Y5L405uJCQ==","signatures":[{"sig":"MEUCIQCPO2W2hROOE8E8Zo2AxARtYcIGNzAdmDqqqWm0Q9T/7QIgeodmJidZvDwncQtKJqWuDYZdBLWU7bgp0cg6VhgsN3Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24858,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbx7fJCRA9TVsSAnZWagAAvM8P/jrWdLffbNsSgqNHsUew\nuOmo/y3wy3Df+EuIzmwQGzEJ96mL5/4KkwP5Is/QeY85uhCcWfSKO0DMPT4Q\nsW7xqFYsTYmw6j5nAJi1uVanry+u3LpdWGoxtHl4bMJkH2qMUxVafYriY2K2\n67Fb0fnng+YQe/hNgWHB5G7jQ03DLpHi6/RTu2B/WYZPaL55koH0tPx47gpL\nQVVl2FJoTodD35lBmscn8cv3dDHdo1FehldvK3L19X9IcFU8RXgKl6EkgpTw\n4zRv0QudIYbz+yOQRPaf+NuIgrLCXqRSOQ31fTqPSQPxhRVS/qbcGiXybqdU\n9BlJImMU/I7N8DaWcTph72KX9PdmBDmbJ8Y0t4Oge2OTByzAlenU2fhU2Oqd\nqYW5rXamytI0pRaE8Ly+3sSiGvAQqgbgcLs/tcAZzXnqrElPWuzjZ0MUSXGY\nllrT0fjDh/gZzw2khDjbms+1iVewKsSf/NdJe5A8w/S4x/h4AKz7siig0nwY\n6PgDhTG9I0GVh+6DY3VbRR7KE2wiBtnrxaJY/Hd4JHbpCgBfYArc/FWCjVbn\ncYS1HeBqzIhVwJVKJ9wehRogcKA2WZ3bMXtz5iH+erXHGsURcsxj1ejvhevs\nty/ZIh2TWDFkJUWgCzNRyfFpPST+pjGLmcz184THlGiRGJ27VAzYhVHdU9kv\ntHLQ\r\n=h6Je\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.1.0_1539815368433_0.5277302245956088","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@aofl/rotations","version":"1.1.1","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.1.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a40ad0970e560be33078680791af394cd2bd03e4","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.1.1.tgz","fileCount":5,"integrity":"sha512-DYgpGySabrixet5Zk4F2BikFOloHtg8GxHFplgPdKyh64/S5xH8dhrMxFJOV47Zfh1lXXTUdn86cWyX6Shd1Vg==","signatures":[{"sig":"MEYCIQDzePwwZ6FdTH+rLrptd3rzly2B1ZvrkQk67+CJ3kANDwIhAMvp3bG7/Uo/18iLuQYxE3xtu7QBeE97XZeEUY3IqGU/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24920,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb12KgCRA9TVsSAnZWagAAtUcP/1GuXCWNtjz5ffeLUZJd\nVDwI8heDmVI2DP7m1CZYGrWRNUNG8zx833/yR4+emA08e50cIw+4RMaZDfBo\n4CEk7dmXz5JHTrVm8lS5oajozQE6JDVKZI/qVQU5AC+PejYSnfnvQIJJrS5n\nJGniqky0BwvvjY+c543LHvIBheqEFI5GyiMvCwjiKz0xicyJRCwBsvSZ6O8D\nULx2m99thji0LdmhlLAB7vi2hifQJ9EKY63tLtkRVZVzxHGej2GSVtYPbb5e\niG6Ds8J3NYF0xhn4jcLIPWGvdYWyKD345ubungKAe39Zwiev3ipFZ9mBBqI8\nJjI2wc/JHZ+VEwcsuPVnZhA7+fh9fOFbHKIIhTXuL174FcS/L/YWp2Uw2sfO\nWKEBjZieE3X/0qdJUcnxNTi2a0baG6MzLMxV0BJoUaXgNpp3ZFgkLHt+ZpS7\nrdUQFIE+X96M/gGShf0QsUDfI6YklJIXvUEG9MWFJHhmksZtGnTWX0d90nPH\ngomG255/Ew4eWaajh67O4QTf4UvB4j63+Mrrjaf3sIiiC2rcDTeZQZt92rc+\neRdKmaSQPZGYb+eqvk5/a0qAZPM70XITdZ0IFvdBO6cUPfvMtRWsXOuT7iH0\n1fngXr65zfdvA6Vt3L5fePr0bj93cOY0I7tGF8ePZxpTfr6Vg8y5XB4W3lYn\n4nh5\r\n=pG/w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.1.1_1540842144290_0.08519878117356106","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"@aofl/rotations","version":"1.1.2","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.1.2","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"bd5d2d7728b3fe71025595ffc4b923fe81f4a84d","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.1.2.tgz","fileCount":5,"integrity":"sha512-G3skXbAiN3wjM+eF/hYs54e/ROOL2XWQep5vDpfcztI9TKlHD9ePXbec+6D2Uu62D8gQj0V89r7Mpce3Uus5KQ==","signatures":[{"sig":"MEUCIEIGCMSVksDc9b6gHe0zfWuy1M6rVMCrcxxCepKwSxsSAiEAntY0PXoCkl/HmADGTkFmX2yf9tRq0oSuF+dbXy5stpo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24920,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb12KxCRA9TVsSAnZWagAATc4QAIsPuNbi33CeCYgwpqY9\nHU8pBfSW+52oREGm5C/quz7TZj1WRULEKE9uRkWCHHF/733Y342/MmGpfrjq\nnlwUjM3unTC+grxgbzKS/v6j8zidV7RwejE5zYj6kwbQlpHSnec8Rbw5LSw0\nxvbNQHG9bKIeLzmcyr3lYbEaDtJRnJxtD9IaRy0edpOIqnHkVyWBWgQnwKds\n0nLVU9AEt1Etphi9CA3wf86HP/uyKGKufvDK7FxlbFL0DlojokRyBbEuF5ju\nIKXPTP1YP6CxGcjqlnx2W8XX1ZZRb05pPrjj7/Xgi4Aas/6zCjERxg5gJebB\nx6BbNIMSLmqDar+OcaJHf5Sr/L6bYs+iQFDJEmtPFI3SX+qCotJjb/Ql9vW3\nEYwIYglC5ua7erAM9TOlcWHLDHqwim2e+Zzxb0MxsWDF3ZASZZ0yGVEWlnn2\nGq0UihnZxnWFUV/ToOXNckeMmhpDmzYFN0NUaRQ0+ZwMGEzd0AN1nBj6MMBX\nF+qXMrmrVJbWZiqODcZy6E3bsjMY7mlBkJBHmaYBCIsrOkegQWx0eNJ+wSyz\njv2X4Ulb6v9+8+scLxeJ0g6SydI55rsHoqrwRsslqZp8wBoIu2eWy3z7YOlD\nCAWpVqE/bmQZV1CmT9Isd+z2xfktYpXdSk9h79BPfDFq11deQfncEeCM2wga\nMRQp\r\n=SIrI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.1.2_1540842160293_0.7460644412479134","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@aofl/rotations","version":"1.2.0","author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.2.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"0deaa9e81ed120095101141ef19bdbec5a8054a3","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.2.0.tgz","fileCount":5,"integrity":"sha512-fMcnf6a/KSdrbFG8UYoiVB5p0jzq67H/voTTWj9Iwpx7Y3NYc3GeQq4xF8A6sVMTSkZ1jxhE2CP7vKewI5UNSQ==","signatures":[{"sig":"MEUCIQCEWMvGHHWBKLJGQAnKxbhjWpya+Zyy19XyR54qkIXPxgIgTUs32oud1kaJJSDz+A6/a39QRBBcRxFnHl3Dohz0Wcw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24825,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb4f6YCRA9TVsSAnZWagAADCAP/3TClw8wqne3yLVieLVJ\nAQrnY65cbfPumV+z49jfD77h+weTFljIFz11FnYVFfH3BRiZL0FXnifrc9cU\nXVPvB0UETssVQQ6S/jFUZqiQiWDSck6Zufbi27eUuNVaAGIiiBS+JWhf9yfU\nsifWRmUjI7S2JdoEmJvrp8VhDiswc/HE8dTgXWOvVVfCFmKPPCrYZjzWxFO+\nLneuMYu9mUFYSXcVu4uxnBzSkfKJ6z6Dyg+7snGEom5kktZTYf7udh6NWThS\n4t07rF23P1Cx3DpI+0Q8Ns6sxVsuobPshU1VwDg92erQOdzZOabdBsYuKVou\nK/Ux8oikp9980R2wTwO+JGApEmFlZE77oAhRcFXkurC/Jgi4ZzS0BL/iX/xJ\nZYg4rq04/4C0KM7S1zxHPLsrKhR37dESg3VXZ4GBKPuOkPwV6giddj/UCYfU\nONKIHwtMdQkiv2h9ig43KAIrN8ylYEFO4I37XbyTZ2+PhFc6G1uggnITjFBV\nOAxseODHeBNb3X4xkKZBAUOtZ+p7qHUfgtVIWL7xnvxPz1+Aq3xxIJNebQ0X\nZSFwiyZaJKqNlgDgmK6Qx7wVS67NbSEOfs9/zD8Af+Xexk6s8jN26Fjpvjdf\nR3nLw/MlmB7ZD43X+IvZL+jn2VMIrx3SqYZMea0V01F/ZoN/1jKItTQlmVmz\nZhWZ\r\n=iFij\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the","directories":{},"_nodeVersion":"8.12.0","dependencies":{"@aofl/cache-manager":"^1.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.2.0_1541537432050_0.4781766302770367","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"@aofl/rotations","version":"1.2.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.2.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"7ac4b5266133aec0c33a6e5b9dbe2d040befa48b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.2.1.tgz","fileCount":5,"integrity":"sha512-pcyz6kQ8O9fhVFQFSUfZFsrRL7d7ZevZ09Zpk6KBuXco9uUnNBESFqLxoF5t3zbByJJHZJEGp0WXquiK2d70cA==","signatures":[{"sig":"MEUCIGJ5/KHWpL5B7SxMVRXH1psmq+wr8e3RTtsWwxtwW2jdAiEAvew/cRbXvFuzvIkdf5LPNuHn+mbfAThyearkzo7GoJI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb8dWWCRA9TVsSAnZWagAAhU0QAKLbPP68vsXpQT23y1X3\n4PrQ2HbuzRhWlgow2BFFWlNKT5entkoq0gxbSoR6qprI+9B3c37UfLaO9Nrz\nwMRJnC64TdnXpyy8wWJOaaynip7gRDlVGUZ9SyGM4g5NXsSocQcab/n8GQV/\nWECeEpEm8EMdLTZNt92/rAeGBCE+jtVScrsUAUqFsITeGLrYrio8cAxLgVDh\nHbaKM2Ont4zZ7TWgYP5/btC+oPs+VR3CH/Y8ocAOFSzp/4FAMgZaIcl8oSNB\nt1fUyZNNLVW+hRiZmFiAm+5tNP6Xuaq77CO7n+6ZRsdEkXeRo0pHRX9/vLYR\njfEug202oM324I6QGdvmTiKoW+GwRoj9QqAyMdtDCgnzUta5zl6P3ORQqOf5\n7+QvpWWLbnpA/p0sIOXrGvxNnsqjKSKC2BIbui7lISHqg6IbM3/ZmfukyUJH\nf1L/t6S0AlsQKAIg5Rl4wWQlSVCHAnv990RsNIcS7dTGOLCRDQi7KZr+lqaq\nu4q8nmd02xUT/rCeUr+jf0dbD9Il/yHEdqbhc19LBqw5i47GLchg9OKm5n7o\n6bmEtDGs0nzXRtKrmnRx65YQLL6qSUyl3DfOHOzNfocDOHfGqyxAM0D7+zWp\nXM0shVjTEeYj3vVtgOzhIvDsyMcwwA1VsAexdEL8dHOUffCdy29p86mQ7/36\n7khH\r\n=ByVM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.2.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.2.1_1542575509385_0.3154929301173648","host":"s3://npm-registry-packages"}},"1.2.3":{"name":"@aofl/rotations","version":"1.2.3","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.2.3","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c29872207721107fe56145cb5eb00bd29906cf33","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.2.3.tgz","fileCount":5,"integrity":"sha512-Z8tBhyL7OuC7xfJ2J960MHboqZueiZhBn6NudKvUIlq5csDUT+9Z2JAcL0LqgYeQ9RslpMxpdDHz3S96Z/ig6Q==","signatures":[{"sig":"MEUCIHntR7uGkOT4sWmiRQQb3QT185GoQTkhzw1vCFzO8YIyAiEAyjFQAWsUo/JY+xKI8hsXwyQc7RQ7Fr7UPA7n8io/R1E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb9KNkCRA9TVsSAnZWagAAEAkP/0u3NWgs4iP7o4wKvOqE\nbfxWh3DmI+1YNjKHexk+SjgkWTwroSAS06H8beJQNH9kyjR8SHVtbliItBp3\nOpkOWd5zlXisRDfrvyvq4tkW6u5ny8Dh4gd5uCNzr1fDiiv4XC033WuQPjef\np5XN7QOMuybMW9SdViLSWXuvVyPrXV2Rmk8Cpnl4Rp1ucQGMPGoySH5viFEz\ndnbw9+0olo2YQ2r87JrmteB9bSFKgJ8d7lu18Q2N/1bDYd8S8328oeD+0LMZ\nG6fuQ9r5ZJvSL4PIf5H8O8Egb71jAOrNtwl7Ld5m0RHRAOaewk59Lv4FQs36\nuNiDiftbn6UWaZtYl5EfGPN467BqbMfPWtm3nzujgDba4qtGBY5/nFIfUTb1\nnXMR6RKE76ZolUbYeeKcs3l/lLmbfmZgv0+5kSaFXlQiwOeNSmGWYC5t4XzD\nKbNr3n5i6TIZzfmS0Gr5InP7wl262kQpmvEC2IJVOLUTQgXxIhMz3vF0eqB1\nvvFG37LVJjs1AUi7Jy9Oqhg5FAqBGq657fl5eh7efK7/GW11Ipc2Oy+NpcSq\nRYTvb1JZBCHOSVjc840V8tB6invyzbLM3DcFSw9XbWjivH54Lij6E6TH2oWx\nIwl87cT7RRDS29iATtVg7uixc0dYSecriGCcA0mGD36rZVxBQa228K03HFMn\nL/2u\r\n=HGY0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.2.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.2.3_1542759267646_0.7713106652166897","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@aofl/rotations","version":"1.3.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.3.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"cb6386f284613b219350cfa6b7108eb66fbbe3df","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.3.0.tgz","fileCount":5,"integrity":"sha512-pmAFCA+KSWcin1i7HC0r7juH+gKNY1D2MBJ8RtndGMU+nn2dGq9j+nLqP7t6QZP1d1seLRL3k80ZZb92Rjr2jQ==","signatures":[{"sig":"MEYCIQCzBUvUWl1gZKcAhnu+H+4Vi9Thwd9UrvJCkn1gEWhcHQIhAN7RJwCvByjGvPIy8tld+xlGrcARMOEav9YwTng8Mgh6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcCY49CRA9TVsSAnZWagAAPsQQAKL5nc5X92VnrXVE4LfE\nSbcqTYQ3GdiLvxLE6/oXV6b76pDOBuo23/EnReylI5Man6fhc3LLHIqmkqd+\nsqm7DiVVMGfJR5u9+XoEbR3O1+J4hr87aSEdgGLK8CWSWJgtsrSiCYK0JGRh\nXoEfPZHi8xfrOcEvPM/W42jrVEG59cg8xiQzz5ySWSYWm+wyNpmt3hFXz+hj\nJ+YzU+QHB4PVqHwgnV9TykS+22rcXLx2Eptcd0sl7LOwFCuebzZDPKpAWrpN\ncp7Ue6yTNIGjj2CkvVUaauq4s73rwL+RmeOxyfssygEzPHWLoXvO31Z+5Rz0\niEn1TexyfIa2jdktiT6wHttMquo4gYXpemXPlhO6wlSjMl6JjXEWzbN1nc/y\n8FH5kCdANEuG0Y4uinxE1uqk7DB8V43+ilkXfYAknpD5cdw9AmmD3zyPnAr6\nES4dgGtWfwJBXTHny6y1A6QupN8ZLPU+whfVLnqsZ8ZU4F/xh8x9OdiehT6y\n+jOWJiqs37COZ/b2j1ASSAhIG7F/kZoSbjFDUfuaI6yG39aFwPHoiOuJAF64\nvlXkS8M6twzi2FssycTfn6mRvNkA0UtdPhMZQIB4dT51789c4XQDcV77yGMJ\nuEmfn0ZXWwUbhjcqcDgeqXxC1Vv8gZPgJKgDTACuTRAVdYHIW1ORwCBCC3lC\nFi4Y\r\n=KES+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.3.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.3.0_1544130108613_0.73557846888118","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@aofl/rotations","version":"1.4.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.4.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"59283fc22b6c55fc3b61cad61a72cd001cf727cd","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.4.0.tgz","fileCount":5,"integrity":"sha512-8wEehwBAivZD7PVJwiGqfGciB1LO9TYoxxtOgti43+cmBLd/wB1YZuwyJKq41QQkBrAuA2e14A5b7AA4injROg==","signatures":[{"sig":"MEUCIC4shoLxIhkZhQHhYNOJVNwT0rMLWGWRzdpKfVe1+X2FAiEAykC1irjZYgf+9NRVT8tN5gX49DMrAv6UFT8YzOLrx0Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcJY2BCRA9TVsSAnZWagAA+i0P/1lki/sK9izU/HqpfiWh\nmXG3mBXf9m1QUfmbDhn4dw4qJCT57LOzGQjify+ypaFnvp/1WVJFCNsFwH3Q\nvTHkHsrh06nrOH6Bvgjjj93OJTAJlezjvyhPbus7VOf3W+UGMhoXThT7Qw0l\ngOuOT+/335PnmVQKnri8vaZao+HBRDPqZLK2gQu1uXYNNmbRrxY0NDEy4+kj\nHZTRRwGy2Xlx3zm8OfY9NGfaIZNDMkAOyTnUA6DwSBbid9F6QTp99Kxssp+C\nXN0J6ocyUKQozXE0iGxXDfa9v+trGCntrEREozlxzg8qU2+LAoVl2E8mWdPw\nfT5jEXoOMS6j6nhdwBe+J1YmzQtwB1q0XLe2dMRDEmp1JG1LgFv3rtek9djJ\n19lD2Fk2xoN+cBaD7jKhNgnOJgxwGolxLQdIE5kkO+kppUYUiOJidNzOX/YS\nafK4UiS35shaR6fWHq72wF7fwk53g1mN0+p13f43zsvYwBCKxH1yMSsr3eYk\nThi3Ujg/wDk/qsYiSP5gY0taRUbuYnbH7lhxj1r5FyOI0AxwUtH6uFKUiu2g\nmlVaoz24B8BHxHcHV+S0uIu0FC6GvY2SEL+2V87aakE/mF5gKO06wgHS/QGX\nWIGCxygvJB/7OeIiWOrwBj4gaIlBFaEAHeecqFMg7OCgwJRkUFqqQQIef3dY\nQvgH\r\n=q4wY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.4.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.4.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.4.0_1545964929095_0.9183360873629167","host":"s3://npm-registry-packages"}},"1.4.1":{"name":"@aofl/rotations","version":"1.4.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":"Arian Khosravi <arian.khosravi@aofl.com>","license":"MIT","_id":"@aofl/rotations@1.4.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":["Daniel Belisle <daniel.belisle@aofl.com>","Micah Blu <micah.blu@aofl.com>"],"dist":{"shasum":"0759bfbbd5386c235aa869bb5d1bf930d83823e5","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.4.1.tgz","fileCount":6,"integrity":"sha512-0+2GAqcUJgNc2x2j8nWjpxi1D+MPSVLuGNWsbQheUuTKc0exm43vBE/lhNUWhiMMlzY0a8ig3arTOYM7WR/LNQ==","signatures":[{"sig":"MEYCIQCeDHCfZC4QZHGZ1RsG9JRGpYVXHPaq9aLyX+852Cwe/wIhAJFy2TTbvsF+O0k1/i3NQazVYUeNxM4JLAZ/LUdTEUFX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcM5t5CRA9TVsSAnZWagAAnxMP/298jfILHBlSiV1mlj0S\ntbLIOZEIfEiVWd1CG8y6vVJoGYJRBNvkJS8zvQXz7j3IgOJh+Nbcq8FvGN9j\nkIIoiu6MjfVtebFzub9agNc+46fFM5V5djY1RUrirElWlzCXQ/rceY8RZwaR\nhtf1AVMBh9J0D6Xz8808Q2l+YDF63V/ZKxdI19NspsdLpilh00FXxYckaV7a\nR7kBToHlPn05pd0oMbKSHcqlkMHrKdHpriHkTCkle6nytV6FozZ4QZkzW0sz\nf7Nd7zXNi3GhLLu3oc36c0Aju1L4Pqn0aBBDfeRno/ATXLiUfGdm+pD5u1Qc\nSDqoMthdYRtV71RDkKBa1JnvFggox+XXf//Se+CXLqm8IxuvjrkTsTPxps/N\na5/MJVK/BZI3GAxahbhiAvyaRWpi/c+xf5AETrTS3OcipUT7Eqt8WSEEv4Zp\neAjOO3yZ4m3+U+8I9uBxQYXuL1IChQs0g5iURtOYW7tvqpEVA3i0jPJmkgG+\nxLuWheoQOPy1szyjR30hmXidtljj6tqNyJq/RU95sOjthgV4ozSZxRS1ntdo\nkPW9kABu2IV0l8uNlkOwCp6gUz+YAx/Zfh10toF1UdCpg0aKvo/q96y+d5a6\nM8nRo+F/XWyaPJr96xJHlnbNFihe++3WuK9PxOM3sHe2JxVai6EDhBo7IWMv\nWQUo\r\n=4in9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"60297b316858cd061ea1c221a7e04406b910ef38","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git@github.com:AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.8.0/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.4.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_1.4.1_1546886008430_0.6004222993666484","host":"s3://npm-registry-packages"}},"1.5.0-alpha.2":{"name":"@aofl/rotations","version":"1.5.0-alpha.2","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@1.5.0-alpha.2","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"871f19f4470a90373725d4f61ded9ab269987851","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-1.5.0-alpha.2.tgz","fileCount":6,"integrity":"sha512-e8fcjqlkEmZfvYFATgyEd3clTERl3O2yfkvqvkaqfHMk3dLrFQTu/a7AxhDna46eL082hSlSRg6xR4XtgTwRWg==","signatures":[{"sig":"MEQCIHFCJxIRJ3GM9qYo/siiv1Xl6N+goHmDHglQ1uVdR9bxAiBa572XbqdA5stFGAkvzLSYu9AgY5CCaXc0x5lx2jsGHg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcQQe2CRA9TVsSAnZWagAA+3MP/RG+CB7qNy4/LoFKhv+z\nDA+KYdiMjlZxzzUOwEs6uRdjwnpSe5v0EDeF5MQLjotpgwpo/snNS/5n7Frl\nrnwb69mPncUXekMR905YBRkeoKpjuL5MMxN/+hg1rKcgc+1QzMrUarpYygRc\npuu2yNyGAaTOZHE0EBRAJJBF6Hq6F09B4gEFQwINfCgXBbdx80tOZPmhdN66\nciUxGHDz3Njx4hkf8uMptinedKPQJh3HyBgjjiRtRNZJTL/zhPBQq9TOJsze\ntn6WXYwSfBoI6+IogEmA4DSptfJa6jJmhUSivCpoGsNEmy5CQw6HGHr6rYbH\n0WdI1fnU01jdZb/ER21YJMSJ9bv22/jdKFP6OowJT3if5erjXGBDwaJHDyDR\nWC8xW7T02y7WcKnPtmtnJ2FD0a6BSnPeugUXn8oHEj+jDRNJ0v8HYrK5U1XX\n9GgrK+1JjcxOaTmSW/W5G8AyUqGMizxAk+X61qHZjfubSmVxOV0cBFOegLkU\nNESEqq4mOlKKPKsFuHwCDxy7B0ukWVBLRN0k5jXCFmrZrtSTDzYckZT8gtV8\ntAWax2fgQbqndX0IPmiDr+gf3S79t1683W9mhnuTMD/ZC/fr4oGn+QId1c/4\ncsjv6xg37Y1sgD9uL4t/jbjdbYDQI8r758Tl5Lyy/vhDrto0tz7XLV4fl/J8\n+I8y\r\n=lSQw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://stackblitz.com/edit/1-0-0-rotations?embed=1\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"069f56d81a39ff1cdcd698c4a3227e36f2c5a1d7","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.1/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^1.5.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_1.5.0-alpha.2_1547765686031_0.11208149617921914","host":"s3://npm-registry-packages"}},"2.0.0-alpha.1":{"name":"@aofl/rotations","version":"2.0.0-alpha.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"},{"name":"bill.salak","email":"bill.salak@aofl.com"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"3ab65f430828ccb48bd489837501b328220c27bf","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.1.tgz","fileCount":6,"integrity":"sha512-GGYa3jpwOmCRr8Hw3JMDsE3diN+gjwUmR6d3EJlO5jDjShzsob5Zr5i6/CZm26dB2sIZtI6WNpbT8L06odIkBg==","signatures":[{"sig":"MEUCIBOtj8d/5Pi+L6RXO93u10HG0X7Oelv/S3/lHG3N6HRoAiEA78TLXfh6oczv/hDy/0SIJaPU8bbkQ/y4gRUfZkgPuEY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcT7I5CRA9TVsSAnZWagAAhXsQAI+oe9n0hHRX0bvlT8P7\nunxZTkV67/DDmLYDP4UDFNmhY7G6JApaHXCJ26bRMVQzNvbcnfA+TcZy/qPH\nzTaqgzEa5z8AxnBIvsrVUoLb/GSOyL7QGEnCFXRI07g4U37FXiIus1DYCUdJ\nm2fzmqroyBJy71+bOPk8gNnjyr/n7fUWWJttxeEZmEquKjAYxYjzJJ319kxC\nBnModZkn//ws0vZ4CiBbNY3kzb0pzPIC6Mmakx+MFcrXxGOfDzu5UwHXesEX\nZguOD+XjgrbQFZedmnsTJGdwr+pNwUGqmE7TiaN3o4kmRCikN6lTe9eRo7mT\n2ovupY9jsT+r7RpQtSk6wi19KmZ1JoqxZHOFZOMJIcPQrtV3Rv5kKM0Yso/k\ncvqWTKe4iuejWd2jVH6dMjZlG+WJz1Ku7SLDtlhA3nDFGGrediCdPlhXOvz2\nj7fQtN8W7x1iWdzvz6qQcVnLEU6iEm/ovMYywWi8xMEQsW2g0xtZCzLNUAt1\nSPKWUVLm0k3Ff/nEyXmhks/ERlBMVfh+PSH/0pPeOdvXkg29YfFR6lDfyxO0\nK96JP2pdS5lun/v3rM+rSLe84k0jYgWlaNmZUUG7Wi5mOO6S/Dln3B0zoqUo\n3oiTpPI72R9o9hCCI2bOkIW2chB8JzO3vnSMVo8G0+qbLw3U4AwQ/c+cnjNC\nFh5/\r\n=J+zI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://stackblitz.com/edit/1-0-0-rotations?embed=1\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"afeca11d48651d7710e6942de5fdad812d9d87f9","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.1/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.1_1548726841215_0.4013689995624732","host":"s3://npm-registry-packages"}},"2.0.0-alpha.5":{"name":"@aofl/rotations","version":"2.0.0-alpha.5","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.5","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"04bba11b96db4803328fab305d85381ca0a9b27b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.5.tgz","fileCount":6,"integrity":"sha512-Ay1jMOAFz2mRzdW3eA7GpFBU6nmxEyTLaFXXpD5S6fT+tXVHNoXPZIlUMkIO1R60zULYIAFaJJYUklwkRT1HDw==","signatures":[{"sig":"MEYCIQD9zwxIdYPf86NDTmOrs/SO3ha555LcRBwOjN/ZYuC8pQIhAOZYUiXOn7+vNqAgdLH5jCoF0v+pOGs/0WscqJxfKSPJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdciUCRA9TVsSAnZWagAAg1sP/2e6z/wBCE/yscRmeBQ3\npwQcHo0Wy2vL+wfbojXutwi5jdMHHpSZxoMgOEH5hw1ne0NiP7XwxEKJXOar\nxPlTX/G9dk0bhD92QObVuVBLHlLw/3Dk9bVPKnraK5MQJ+Ezn+ilBV9Hai24\nfFFw5GDwdOxyraC5V38p+3G29MFDtObwYneDkVyUDhIvleHZ03OgHTOJR8H6\nfUMG3XDHOwZMTBTjaXnzvqF8FBIP6pXGqfCygKoymoEfwzr0nrQIKmCIVQDw\nJ5vAfyHdjPTfCLUQLIZAEanaxOCBtRdA7S7W/a84LoPN60F02wlnA0VeI40Z\ndFrx1FRrYWOwyI+Q2Rm0LGT1eP3wSR5ISIXkOzTOUNyKnyzr2XhGiBCNGc+A\nngxTJuHp8PvgVSzWC5PtUSUL+b9Pv+ImaeHUI0B4FRH2fhT2pcdMchX4Phj1\n6/3rFUwDmtsn8WdiIJOAnuBMF0wowN/NGIermuQdS63FxHgUC13ITXxSy71u\nnBu3UJ2auU6WKo2b+KzwG0Jm9kUqJ5hKsYHJwkOoD7g/XDVNw6eUARJG+NNn\nXnCQAwMdiWbW5caag2/yYW9xXgLVA3giDUzebgcbpI9+2QXVm7l4yOkFLbXu\niJQ8vgyEmFpFBpbaftiBD7zuYk7jt2p7YYRMCyUr1uY/oW44vUxtvJXxrM0a\n14WP\r\n=YzFX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://stackblitz.com/edit/1-0-0-rotations?embed=1\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"00d91514e0c953e8cd998150ed5705b87db20b39","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.5_1551222931325_0.4398305422223161","host":"s3://npm-registry-packages"}},"2.0.0-alpha.11":{"name":"@aofl/rotations","version":"2.0.0-alpha.11","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.11","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d69cdfa16f79582304cafda8fc0480a2118ba4a1","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.11.tgz","fileCount":6,"integrity":"sha512-zzsEX1tKSHqkgohUdmAOq/+w3PpSj05vETL77OV523yxTIcsw/VFS1t0+iEyyEJNKE2T6SHuX4c8Et2RdBAVRQ==","signatures":[{"sig":"MEUCIFMhYfYBikHat9MscLtB/yjhLH/qMCdQs/fiDRcTkvGkAiEAoPbBuJI2IlaRTP7xQqE68kXXowLFMSLi48lsm8ZTEYo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmdGECRA9TVsSAnZWagAAftgP/A46Rxu5ABhBfmrHkJpm\nU12BJsEv12qMG0KOhrp49Rdf2zBhpQUKiPNsW3iLDGXWLW/gDGsI8YoHmCwj\nJ5mmaYrFL3ur313CfSnaHxI7EBpQqZY4o4e9UEnyXWU9Bf8aMMZ7Qm6ep24c\nYtGfImFpoOBBBlnluVep0A/Je2/TuvHDB9F5KAanPzeBTzg6lPygNF0PC5es\nvQe1mrm3uOyeBV4jqJAvkAUSoXXjLgZ5oxXof/+rb8EMUnYhX+TIwaMyldDc\ndQryd0Ju6Mt2bJM72ZbysgtZDKA5ya97TTm9LULzrwQwKyA2YyI3Tqm6tfSo\nKbuS5Dd1JFH3tZFa2/8BH7acyVx5NHXmLvicVmnGPJ005DWsABZJLtDkX1kr\nA8jGYU+QQcq4oKedVuQpycEt0RdtjlASpkts/pZ5VDvpI5gh08e+aPppJFqS\nawLWE3Mgh6sE2Hj6BT0zp4pcLLV9kfBXy3aGlWiQWNw+T7CJz9YGvuB23Q4p\nW+aqE3bjOBM2js6DSQj4eKlf+FyDN0koT5BWmEWUZMQnRtJRa022cVk0EvJ9\nBB89ATowb4OIFe+jO+6tpb20WD9fCvws2ivAFMZIbzeWp3LZ//ZBuNDCpypK\nj96cgaKTecS2kP0c1dsjuA47quS3XX4pgSo/jj1V/VUEwCzynJW67KENnYTx\nlBVQ\r\n=SKxE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://stackblitz.com/edit/1-0-0-rotations?embed=1\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'page_rotations': {\n    '/': [1, 2]  // corresponds '/' path with rotation_id_keyname_map ids below.\n  },\n  'rotation_id_keyname_map': {\n    '1': 'routes',\n    '2': 'routes-b'\n  },\n  'rotation_version_page_group_version_map': {\n    '1000': 'routes',\n    '2000': 'routes-b'\n  },\n  // rotation versions and weights\n  'rotation_versions': {\n    '1': {\n      '1000': '2', // version is 1000 and weight is 2\n      '2000': '1' // version is 2000 and weight is 1\n    },\n    '2': {\n      '1000': '1',\n      '2000': '1'\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home::CN'\n    }\n  ],\n  'routes-b': [\n    {\n      'resolve': () => import('./routes-b/home-b/index.js'),\n      'rotation': 'routes-b',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home:IOS',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\n// each rotation route id is associated with an asychronouse function which resolves a boolean.\nlet rotationConditions = {\n  'routes': (resolve, reject) => {\n    resolve(false);\n  },\n  'routes-b': (resolve, reject) => {\n    resolve(true);\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-b\n├── home-b\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by evaluating the `page_rotations` paths and corresponding rotation ids. They are evaluated against the rotation conditions functions and the first to evaluate to true is passed to the next qualification step which is the `rotations_versions`. Here the weight of the each rotation version is used to calculate which associated variant is shown. The key to the left in `rotations_versions` corresponds to the name in  `rotation_version_page_group_version_map` representing the final variant to show.\n\n\n## Events\n\nnone\n\n## Properties\n\nnone\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"71e74dfad7e635e8b93cbe9209cbdc38fbcbbe3f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.13.1/node@v8.11.4+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"8.11.4","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.11_1553584515682_0.9636522240671732","host":"s3://npm-registry-packages"}},"2.0.0-alpha.16":{"name":"@aofl/rotations","version":"2.0.0-alpha.16","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.16","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"439c2ee935a4cf04c4fbda2dd7059ca1f853f217","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.16.tgz","fileCount":11086,"integrity":"sha512-ZqHzFIklaAc/NL70RbFpz1FH+brsQ0ZbipVYEwIS/tFKNoKF8+ZXvrtxn2VMo22aqeOcms3cvUx2WUVEKPPA4A==","signatures":[{"sig":"MEYCIQCQWUoKqaRh0karutPlGPmIf8Jyz5++CPde7U1n0sLGqwIhAOYDjQm8NVr2oa2c7YFinL9OMWHSug5wA7BmftA0V+WM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":49091644,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwhFBCRA9TVsSAnZWagAAGNIP/2am3//FewmJ+S9Z0UHx\n7s7V329AaFbsE//DbvYamsbTVAMogMVQp67R1LQESvPbPqrhEQ71F5no8j1O\nDZhJSNRA0q4xnK/GO8MmqIIdyKbxEbb/8HjqQdCBUnHQge53VrZAx3FC19Jc\nFFv7g4gH8rzGlt/NhDpZd5MDJiH4NCJ1xc8yXv8H8CLe1bQhsJ5zfzld1epB\nlNDHhKnzFXt5rSrSrQvWuD7zw5ERel5Q9rsK1Iu19OBky1/EOnMjrr+YZeq9\n5RDMa3OW1/lToTmY3nwYvRTwz7yQ2M9h9CNhSFZw9XScZVcL4gnk/3aCNt99\nH47TvoRV6Usk0f6Xg99N3kWhHhlrgm8cmW/MUs/E6jRSF7zxORYY8iz9FQBZ\n7xurteNdHDnzq+fSGb1UymVxk8Eti70IR31R8g5VDVJT+f1RQPDYaOt/0shb\nQfSSqYYgKrsZj2Ku6pErkYghFx/7tIYdnDzGYjPPUqPBZtZzDitWOv0p0vcp\nM21zNawo0hjN25Qtdow7pkHxhHfJg7wsgnfgVfMdeex0nLv7v2CJ8HKStgwE\n7EiAv3rS3RxtRHZAbO1Ij/Nc1NDdU932DOTRGG1RkXJUB5vBjOtLo+/9VpNR\nQT3Z3pFujLVsxR+RrVQJUHrX4m1QpF/79ZDwmWp+u8jGYLsdrZMHp2ISoHuG\nL+a/\r\n=PqVQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'conditions': {\n    '1': 'baseline',\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2', '1']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '1': {\n      '1000': 1\n    },\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"0b6aa717a40d408713b5b981754243de8a8aeb55","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.16"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.16_1556222272347_0.0927410629332599","host":"s3://npm-registry-packages"}},"2.0.0-alpha.17":{"name":"@aofl/rotations","version":"2.0.0-alpha.17","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.17","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"982515677341cb66a8046263efcc8c7daa208bb6","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.17.tgz","fileCount":6,"integrity":"sha512-n8KD9Es7TA9AnVjPnGd+m6fHkGgbctEP6T5o17jBul1V36/cFETJPi0rfOSj1B2NwtVwDVNo1c85TnCMVNyFtg==","signatures":[{"sig":"MEQCIDsShBoiBk0a4/GOvmK2DxZRfCHPcEGUxwkOxG+oI0PiAiBeosMwgVBjiwGnZZmlFfrh4R4/5P077hfHGCXiK711Mg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25803,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcw0+TCRA9TVsSAnZWagAAEcAP/iAwgzkS+WfOLWrdbc1I\nrt8BbJoDih9yO2WDebJRHuUy0o9FlC9ZCkYjy8NfHfu8RelIeQ70fhbU96RR\nqXnWay9CxwX0TB0KzAldM2k/8YI0VRFXJWeG07GD24Dx6Yu3qM0x+bhkxDj9\niwIUbgX4ssZMg4EGh8g1jXguOs3jCHk2v4myBfmTxAEk13t5ZswE1/P0MK3P\nuOKyKSyLww2NcdJIrTagQnTBbHM29voZVXX0THZD3KsOHSVXUJrZkkZEKr0i\nBl8cv/VuUEJEUQZRRhpYhlt6nBEsZmhEEaDMmJowhGMqbmDrQIIQeqMZXNDT\nJ0ICBZPz2Oiq508fp5HsiG9MxSFhUMtS4aDWlknDcKQKUVgJzKSBeUN3fBS2\n1qpKnjYRa8sgbnAKCpswgq8WgISo9UceoGtlhSlvSvheRp7REWRhmpoZZyvj\nz5suXsWXWqq4U0JzNTwuibnN7ikTMGnXqfOG39+uZxwCbYmBBbfks6qxUBjD\njuzn0ZgwpZmgHMKUMrStGqhGc4pyhpsuo2rEpJroDSx2BUsE4Mn2GQxbp9sQ\nrnhh+Ce86HmsPZAzFwF8WmZ3R/PdBfUqfhed6sGiCj9ylmFn7roU8C0WBfmg\nkuVfuTUJ3nQ5kvR8mtPHT756zxpj+OgCHhc+miI0bagV0HeD9/EGKbPB4iqJ\nsbB3\r\n=6qbQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'conditions': {\n    '1': 'baseline',\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2', '1']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '1': {\n      '1000': 1\n    },\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"6a396437dcb380ba2269ac50a5b3b88e54f99027","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.17"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.17_1556303762160_0.1300572162089939","host":"s3://npm-registry-packages"}},"2.0.0-alpha.18":{"name":"@aofl/rotations","version":"2.0.0-alpha.18","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.18","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"8bf6342417c325a4952eef34a539b2a0b7d24ab0","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.18.tgz","fileCount":6,"integrity":"sha512-P5VVPJc3SdvG+uVoYWmLvsdGy9Pc5TXv+5x4iLMpmSRqtFo7AUa32w2FHeBo2CtXT1G5AZu8aPzepTFTvPWoQQ==","signatures":[{"sig":"MEYCIQCp7uhh3AV17jIMRUH7LALf+v8QcMygHRRWi7+tcgtkygIhAKU4FoeqYko8Ox871H6g1goRPgRA9RJ4X806TM+AHd26","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26301,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcx2ZeCRA9TVsSAnZWagAARR8P+wbvsFlcRDjp7OT3QQY8\nkrzHiri65uGhQBF4m8SOssv4EgnGd271QLCgh1NPW/wsPmv4CKUAYXi54wS+\nvzHb8hOpzN1CgZckU/R8Qd5XfxRzUFMMGp2j3+EDyJCEtSed5COnZvMGyFYO\ncW1oaskPSod+6oDWfYRF17jv+JA/Ru1q3TzjaOrVXinlcwLfZe7cZISrnDDM\nIu1xnhCIv5GrqDmrFtEvn1syUSBzX4DhDpNFn8NRNAtSBu6njEs0aY4RNW2U\nRLlFeN33Wc5YbPT/kEs5pPSST28wZ0iYj8JjqnwdMRambJzA2BHalWwLTeeF\nevYmiFt7Y8x66aOmTKbW4/o6eylC3ELtBw2/us6pYr0vi4V9RDUuy57sNYJg\n70ayJWA1uG8SrKPkkCAxiKC/aDsFnXPpYBeL9+yQdypR2PXAbP0do0PnVwNw\njLPOaYFVEe4hAm9UBiz108Sz1Lk1G+y3xEi34NyI5OHBRJWhnQVHIjIdT/Xq\nvaKDvgsohwQfYf9cHUzVT4GGprz6JPaI7mfggKLZu3Eq3ACTWPdMndZSOKrC\nrkqv4V2eVtgUDDBT7Aqr0rSVlIO2XyPH28TgUMVdkUGjArrDxuyF1Xtt7rLu\njOB+Vigq9yI7c/5UtZvtT8yf+y+5cxVlSaQHZQbOddBNf2V2Pm96W3DVC9mp\nEkTQ\r\n=eMkA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'conditions': {\n    '1': 'baseline',\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2', '1']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '1': {\n      '1000': 1\n    },\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"a3ba6ffdf50fe4d1db7af3febfa071c99281189f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.17"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.18_1556571741299_0.4640025528963756","host":"s3://npm-registry-packages"}},"2.0.0-alpha.19":{"name":"@aofl/rotations","version":"2.0.0-alpha.19","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.19","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"b7178d742c67006ca7c2aa284b7a39b7c282d49d","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.19.tgz","fileCount":6,"integrity":"sha512-rjxTLPbz2f1GDXDN7EO4tm+iSJ4Pzal1Pdfz9l/AmbguOztnYgXZasMtK3WjBxGL6zbRL7BAg4Zh1G8mSIXN2w==","signatures":[{"sig":"MEUCIBi3qUWXp0kC2ClfmJiSd9pwOObvpQVDbKMtU2I1z5wBAiEA45a7ZUCmIiG7AiiJzmHAaO6MONYq2fJmJZxNoKeL3xU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26336,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcx485CRA9TVsSAnZWagAAxJQP+gI+PFbM3AzwNUYQbxxX\nHAZq9L/g8EoE7nWtZ3OSVi6LYnBTDy7ijLrTqAbY3uIE00ymQxNmU9JFvcRV\nAVDCugQa9xSDO9ihmkm8eZqB/E/BOFX0uxPeQNgstRAL72km6w7QUkeabOjh\n4zbauenP+h2jRcKSxd7YoysRVPur8U7keV8GRyR4dpPFkN7A63gCr+cCey8j\nuzoNqCIo0UAW33c7cbkLz5ZmksxJgsCNHv5p8WxzWwojfWgFJSsxCFXpvo1j\n4g/9fvbFlxVvJzQ7PXQkp7C5CSOqQQqtjS34dli01X9wlJ/3H6uT0PTmX4p6\nxOJHjDPBpNOofuwd6cep5T7uMyA30SwyHNytlDlQ1VjFdeyzQ1Ni4qDuEHrE\nTDr/vFGGyt6zcU0mZMHqVsRERN/mg27thw0X7AEu9/Ea1pMn/Yt0c3ZTVKl3\nL56kRrnIG+rBj+UtdDBmLVwxw8krx86/NXOaRj8NXcksGCcjAXxPk7+8TofY\nkEZWHlg5Gemv+eJZ9Kd/ZU95FYgpRLMa2iu1job4BC64i/roBgl0e8vgRq2F\nneHXmL9iyx8ny4YmmeKZ6hXB0mpsGLuM56c7KsBAoio57TVgQYPhFfiSzmNJ\nKGAVWC8/EKqYBSw239IVm6pNZhDUG0cb0MwQhiKXFcyx4MTy47fkH+xg/7i4\niJJ0\r\n=mc0d\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'conditions': {\n    '1': 'baseline',\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2', '1']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '1': {\n      '1000': 1\n    },\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"335781e4a885f5d3c3943fecec980d40dd215c60","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.17"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.19_1556582200626_0.8745848276574648","host":"s3://npm-registry-packages"}},"2.0.0-alpha.20":{"name":"@aofl/rotations","version":"2.0.0-alpha.20","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0-alpha.20","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"47b4edcdd1741a770dc1bfa3b77c688baa79e046","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0-alpha.20.tgz","fileCount":6,"integrity":"sha512-QhE/7I0RetFOUbp8506pez2D4p9vqm7gNzV6esKMfq2EfG5jDIABetowRyVnqc+ef1JkaeYhkIVHH5hbm25kCg==","signatures":[{"sig":"MEUCIBQopbLaUi0CB4+JOZMGxzwUL+gXjW2xBfPjH9Zx0c+gAiEAkB2UU0rqfoFbiZPAwk44FaJAP2oNe9x1FU1NuXscjRA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcx57mCRA9TVsSAnZWagAAImsP/1pDGeThngRisXma19s6\nYiZ7aGA94ifWU8PIUxT2ooeYfccUaLpwj32867pdsiCa2DkPnAuiFWk7OQuL\n9BP9xXrpaZ6exe4iWXnGqvqEyeaz+fM+mDEEpRdm6TAYKYvVFIoZlyTkN64b\n6c784He4L/RoEpbp5hlau2r3FrOu6Q7WGBUuRE9C8JwUxNdbp6djKm5LlA+1\n89Go3sH9lpvdHGnaiCWOUlD1Fxy+Gxt8Lmmyas7uf2Md2cLBcsrs1TTB3rG5\nrh9ojzDvWuSua0+I+78AXmLPIhloHjxTotFXyrgHOWCsevUIx/hKoHny5N3e\nkMLEhak9Tk1RmyHCFQA9LAH9AnBBTIR135RMMg94fZO5gugO838lPxvrefij\njswSh2QScabHZASN0+HwGUFryKJ0IUbdJEtUb7IMqNNPU4oVfQ/QAWyoE+N+\nP6QU2Il22TkvaPNOcPSPx+UYKHRBVGYXtV7piKAGriaxy0fap9rNWTctDM1j\nhWwNZNUAo57GaZi75sOjy6OBpRZuqOZQtNZpbLM+dmQyKPcLsm5hVnLa2rJf\neXceeGt/Eein56kvAj5g00m7G2HueTfEZzvbdZoEPDEywSfzhTc+bvWl5j4v\n83WsC/G4u1ESKcvVRyT9ItCjzazPfUYV4AENly2l9L0LVaK7Z80Cp69/hqFK\n5qX7\r\n=kkYP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_id': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"5ce89a99386b67b1c24d1ae8702dd600ab27b7cd","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0-alpha.17"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0-alpha.20_1556586213550_0.02028703467276416","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@aofl/rotations","version":"2.0.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"807f2107e3663938fbad75ef771aff573ee6ecf5","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.0.tgz","fileCount":6,"integrity":"sha512-qoKo3MXx8LZjTEMqcKg+chXNEKQp9hNP6VItxQwPGlmYc2hGdQKnrC4gqK1La5g2K/UR/Ngf1RDRPUk4weiPJQ==","signatures":[{"sig":"MEUCIQDhByVn2mrDghAfsLfu9iW6gQq0PM+1x8/kUvHXahB5oQIgN8L+IyMTBDCshI35gdo6djtTlEyrOxUYPspEC9i/U7s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26620,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyKKvCRA9TVsSAnZWagAAy7kP/1REMHR3ziyPT/qHZNKx\ntNil6BGtHgzYcWCGoA8Ite4edr/2cyFJ4utmCBdF3b+L8sAzdhId/u83wa4b\nJwG0sQy1Rgr4RZirfzD53kRoXCIAGD4tg0DFBWxX0chYtBo6s7NPHVwGlPl8\nNfcOsB4VRRN5lrNzDsT9S5DJrkv6GdEyXszw3rhColCKlWKRMS8r0hovl9wB\nRrtXExBxn8ozPvp1HwUQvyqOUW4icxkJzVT7Lv5quClie7f7DltO3T6Tep5/\nEsATsWrYRf1y4hpHyDZ5GgztJ02lZZYOLKX0cn9gUvgskKPwZ97IQn87kUDm\nhT2BMZtLKCdHGqHvGZfgmG9Dq6oLMjnlyfBXMujYr+QGNLEv+navdVIy6rGP\nhr3+TJ7PZKn5qLw739qMDKMEYQEOeopcyTlTT0jrxwpajrdifRZUqI+NMPXr\n8YsKrA1YWEB4r6WjTkuA/d581iy+UMgkrrSbzIZIu/55+xv2KkBpAdUiRWWQ\nOpfMmrlXP9Y9T2XUpWX500yCzf+DMCrKCGm8n3OGROP4GJkXxuFQ1K6QHUyI\nSRkQvCnyLcL6MMSHIpI4RJY92fAuuqui5jd8eqfuMUkHdebb++Cm0VphrzlZ\nZe4cYGRSQnkYSkqfrGpfyfL7ivVChfsR/XyVx7VxBDb88bgvtbHy4hoEY82X\nJUmb\r\n=TFZx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"91b9b3074f7031a51ce7afa9b542ff5dcfd64997","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.0_1556652716652_0.598604459566997","host":"s3://npm-registry-packages"}},"2.0.3":{"name":"@aofl/rotations","version":"2.0.3","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@2.0.3","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a0dbf7d06fd44366b841e98b58b4df3356782d66","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-2.0.3.tgz","fileCount":6,"integrity":"sha512-AT8AeVVYrHcMyp3/x8dPs+lwf5+HJ6ByMMFUCSjIqNFoLh4iaDZaImUHO6Rhpw0S4mNPHBaWn3F8ze4bSSsTiA==","signatures":[{"sig":"MEYCIQD4oh0W+j5sbq6Ck7omWl6UhmnkDqxCMYufzbo1GER8YQIhAITzkmZh0yEYdTBkDO/CLXcBU9zvT+BfAwkFIWh29c9B","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAVTnCRA9TVsSAnZWagAAB9wP/18EseGKPgP33n10LXD8\nSN+vuqMsKbct2idO7xzCMlOVvIacLQnWF3/6/AhS6uzgtlwrlP4Wz+Eb5HOh\nJ/VpwQNq5F7yinmLBDwq1iWoHzKFVAop4l+4WAS24m7JgBPIVW2kI7fBnVal\nvr/X9KIdGwWxSXxBxlaWGXtmmvuhaz+NAUSeFLmpHFOEk6nnnzmvmZH5iYRp\nDSR5EImCdi6HXD+jsrfhRmEx5onZdQsm02Ib4LgRX2k2+HD0kzfrYn/fyw0B\nElHXtyDWETkmkYh6xrvCM5Sc6pHXWjvFH1HUBkCZQ8vUmAwggDXdjO9/DdrW\nvylY+Wb72a3Vt0cLhgGTelfKNqWn8HgfqBBv3pk3BL3LD2FmIOjT+EBVTxX0\n/ZfiswBBWQG5I0pgbLs8mhLhu3oSoijtIfGW0VH4MuCAcAsprlaSRcT7IyR6\nuPgh6lQ/slQXRumXW/sABNnwLxAIeOmOWGgoM9mqAWwAzn0jFzmnDwB5vjhY\nVA1sjW/QzGC1c2tOKY3CkO524peL0G52BssWu6QGs8oVo0PbvHfUcliwsc+B\nlTMK/tTx6gWoEN/r7oMPrOGVFDLPMxLr2LSJ+xM3KyZqIw5i50l84McQi3KX\nF70nfLnS9+e1oqqaiEWpJN0v/FtTNVYs9vZperyIsM8Dc1HwwHn4o2ILMiPC\n7odX\r\n=R7lR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"1e200e3760977b610e992712eda22b19e8762fe6","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.10.7/node@v10.13.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.13.0","dependencies":{"@aofl/cache-manager":"^2.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rotations_2.0.3_1560368358504_0.7559592162236755","host":"s3://npm-registry-packages"}},"3.0.0-0":{"name":"@aofl/rotations","version":"3.0.0-0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"3fae72846a3a82c6ca808ec6a212aa82b3afb029","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-0.tgz","fileCount":6,"integrity":"sha512-MXTsO4kYezYEPMv+CqUSdRm8dVqTo9r7KzqIH1lauvlIIBknDQ0JFlz1lHDwFg/yI8AojdE8Rys+ORxfx2JsRQ==","signatures":[{"sig":"MEUCIAmXPX0T1IXSY6cfHSzM3wfrE6UUQFYK/4H7bXhmnxuuAiEA/YjD6J9FCCg/sqloXbUcEhRudG8O28oWix5DQpV/j+U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgG2BCRA9TVsSAnZWagAAqc0P+gMGiL6SAlf+hwwOyDVx\nL1CVZXsoV2NQZDthy5UruH+00wwHlGgihjLOMCg5svOJKgmmwy89s+SuNc15\n5hlWIx0p6/Oym8XzSGUNZCPVGjjXDbLSb4WOXozhrPzRgtm04wiS0KVsRN+6\n2pBW/FaafLk/YETgs4sO5AIg1pihYmGNwODqxHkeqJ0cfq8K4yfYqtdhBYIa\nit3nVm1ArIq+K4q4ErnBmr/r5XcgHeSxYvY86zCtQ1Pt5THcV+DxTiWTUnli\nfKwYb59QI53FvkIuSiBAqttZaMEqoogeWVOMw+8523Oyt8Svmwkj+oGTnmF8\n6ZwaSBJpVAvlUy22/8IThJrUnfWJQmMpXj09LBHbaSbJ8agDAuBpyyUT9SI5\nIoAZc0jRa4n9XUvWryVElE7kte9gpWwwfvW3QWBDhGghgEqmLwgyEDAz8ip8\nHNaow9+iM5YaznyWytezoWzfAt87uJmt3tI5ByjwLKZ8l21x+djG62+Fu/lb\nXolfZf6JKrFZJ1YuxAo122McssNMI2yGzzkoNet9bLqrtRSLVlJV48o2Ol28\nu/O3l7PqT2XhJiwz3UphvRpR4WRyql4S7zWdhGa7cYbXz62Xg1LfLRTkRESI\nRTSInwcMGuQKFPMSKp2FVaZe35i/SRkMnwi6iwgNDWTA4sIbk3n7k0gTChPc\nhNnC\r\n=bqx2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"68ed707a605f1a3cb02ab70ff9ed8a188867028c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.15.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.15.3","dependencies":{"@aofl/cache-manager":"^3.0.0-0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-0_1568697727217_0.5041612409064542","host":"s3://npm-registry-packages"}},"3.0.0-alpha.0":{"name":"@aofl/rotations","version":"3.0.0-alpha.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-alpha.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fcb522d1b572cc2420bfea2d09f6313767e83d17","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-alpha.0.tgz","fileCount":6,"integrity":"sha512-JhVEdEDQW11cuWEr7yeX4QUGsyMLfNNP+DEKPLUGJ6XFbpWQ0NZsEqswHesc+pwf1irPpgQFZz7Bp/TI0H4oAw==","signatures":[{"sig":"MEYCIQDFPX0LCKmHUgn4iUFsENLN58OGv2eDOYBCX2xp6b4IegIhAPZkzD3jYnAGkCmDGSlIxFlUeND+GlNv0yoJNDWBXj9d","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26943,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgG36CRA9TVsSAnZWagAA/ycQAJ4qjF5Ehwf77GHP7Lwl\nXVz83t72k0Y2hxITmAhr1YhmjUSCtCyYKkimrDp4CQFE47DWYD5Gdy8lJQNs\nInfZiLvgLsGs7PA96LolgT7aPZmAKRsA9ZJYVVrvC23Ko2cuyT4x20wV2VKP\n7/G2fgtBr1/UHEx35uG+R5qRXgySzFwHSleeCV+aDTMFCGqkbAk9V7ahCDiq\nYve4iBgQ3s5fC9Ul7qHTEJAreVbZWmLR8Xlis1A8gbSK8v//HHQeJqLmn5z+\n+q1Z4RkPl9lyxzVWBW3vuHtwES30RKZvdYpJVvCwllf+Cd1lWIHxlg6TO4R+\nW6e7xCEOdFxz+NO+O8GUm3rH5WSKsEtD5BL0xWxNMTWW3PiIxulbywejFqOF\nnDHM6pWlbALt1pXf2Nh0GbI49n1LP02v48l4nbWZzW9osc6CdmfDLOyKjRep\nR2aZXXbawkyPVMHAU6tu9OvXlOzTvwQH5HTDNNmY6/qTbDDjZEq/fHRuUuet\nDMDtIJzj8Wq/HyBJdKyPT6e6aCO84afbxGT+pvYOMeJ5JfXe9jXDheuIrSRh\nrVEFVF4mn6leaqYGjCQ40emKwZst7/QT/ch11nQMQVzDMFw9L3sgKpVQr/ld\nxUDqjajiD93lBXTFurXXSgYBEw3EEJXogZzgO+TX+cpFBtsWiNhe3mJcQQvd\nOeev\r\n=25j7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"c6c4d16f33cbd321585e3e7c86b1aaaeeccd3627","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.15.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.15.3","dependencies":{"@aofl/cache-manager":"^3.0.0-alpha.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-alpha.0_1568697849534_0.6926370453738202","host":"s3://npm-registry-packages"}},"3.0.0-alpha.5":{"name":"@aofl/rotations","version":"3.0.0-alpha.5","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-alpha.5","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"55b0c14002a0832ac4951f5dd93fdbfbbc4e528c","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-alpha.5.tgz","fileCount":6,"integrity":"sha512-k4ZeAL+TCdqg4cKcJnOMT5+wRupY0YLGfHK/84LbuX75+uMma1YQ++MNK0Fwd2nNupwH8bHhgvZDpRM+JZTRwA==","signatures":[{"sig":"MEYCIQCkCykWpqkQOjIQR7hnaOis87thn98VR6XDamBmuFVqIQIhAJ/NFTNMBI1kFhjjjg3uDn/6RnNaz9KrsMCLxMXIt77q","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26943,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdhHKOCRA9TVsSAnZWagAAfTIP/j9CSJeUDB+20IvDMtai\nKigV6H68pHiE5TGRnh91136mDcqxcZS5uTI/mc/sm3HBUSpf3ojcp3kfOal5\nhlCcFYJIqaeq8dMmBkaBPeYOS1QwJ6+a09x19TaWKNP9jOgvr4zs5Rpn7wqb\nVBWtP0vDQH2vPExjVnWIedM5PjbDnkj3B9NGBIApE+VQtom3NfN4cQm2wLSz\nXUsDWXMBT88ztgeUvbnGpJUTMZaTWmlDPJ2owETwEHgtiIrJ39p2jkj7VOEk\nAerqdp75yCmiwBEQRgkjKbpRi/PoFw0eCVyEuj+kuk3v+HLJSN24zF+dxtHx\nk9mF6D7U/ugtsIB6UvS8hXxm8wn+BjQzAou05MprO6U2tHQ3Xz1Wr3QtV5vs\nTsp6MEgiCcrU9Fhf5jSraI0kFwMu5HJrlgnpQFNiHFtQEGS+2fJQhNUCGTQ7\n8/S21Z5ZLx4VAZSbri4zVgZI+s7H5cf0PjxvKvAOEARrngZu+bM6xJcRpchp\niB46I0XOvJcQ5z6AY3rEo5X7sOAZ2i8oBEKXlkPaaJ68TNcoXuM3sdDGQZZs\ny/Cx+oEiJ5hAHGSjGGNrtIJIohjzWNAYptaHG+11s5e2w79GdFVef3c7F3Ez\nV2ceB+Bqd+Hn7/oHqfmWtqkkS2CmmYnm8ziGpn+CpWVNOgN1vE3lTLmhBrWX\n1un7\r\n=QAUX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"09f43882b317744481f4b6845b1cfae0461775d6","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","dependencies":{"@aofl/cache-manager":"^3.0.0-alpha.5"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-alpha.5_1568961165818_0.15245277563868131","host":"s3://npm-registry-packages"}},"3.0.0-alpha.11":{"name":"@aofl/rotations","version":"3.0.0-alpha.11","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-alpha.11","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c3b205f7eb45f4d375d7742046f10230bfdb156a","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-alpha.11.tgz","fileCount":6,"integrity":"sha512-bZtEPW9KpiP0RdMfP6wNJf3+n2t8/QLaATwPl8uiSBi+gWz1c9AxCvznN6oTvt0Td39HCR94B+QsxHrHxW8/Hw==","signatures":[{"sig":"MEUCIQDiWiofznJiyCOqD3UURgj3+7frKTLGA4vZPOknSjQsmQIgQ7qQbH8Ad/juiDnYMsyO2kv+++jssvbrVMSJKDVEQqw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdjbD+CRA9TVsSAnZWagAAxgQQAJ8m5J3okKi6fwKtEmTX\n5keJKzMtJ7GEX3qGdfKX+UMNqbBkpfTXNC1AQYhL0CWnxtV1ycyi0fGmmJGy\nt5WctrRawEKmrU/VFvjoEpipKqx4fnxOT87imGXl6zlJAC2DGKjSRmOd9cxW\n/N5K9MJCqjqDNivfqrKQD4gy7Y/DjXBLmU1dh7KYpx7VkZETKhBt22YetLFh\nUW8NToepgl3Hjx10qWbXQqV1qh4VyYriPmnPoLlD9eRZXHkmjV/wOLjoW9ws\nm7LrBjLr/HsLFHB0MogOgVLlF0ATKXNhUdaxhsPB1jKn7Ly4Ta24j8C8rSkk\nQDFPfEnDHwpYBksB+iEdkfi8oprbhL6Pi3k8BdQzKQmzqnGqootvAYvQfkIQ\nCAkQyMulMLOKpgMIahIzNmiA5N3go5Q6/7V19JIWqtoXmO9NmrdvRaL5KcDU\nmBngDJMrPDBUZbkwOV4Lw4V0phkDMKUj8LECm9IMIGdeHBeFBMBJumwVpWa9\nT93l67bMjnGk20BWP1FRhYmhTSVC5MGNKA1s1YBWOFlkZl7Q3npt6LNKGsKu\n8Ra/xEadfiuXHjZJB8SzFCfv3JU3BjP0k0DSgDC8EPZMisJXDWOi9374+8q0\nWg0ZDF2NsHqLJD4lq8uD6xW2LHzVpZOK4LMCv5Px8nj8+2Qi76yc+rXGN955\n0ZyO\r\n=+36W\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"ecdfe7e68c95cd3ce9eca2c86626275d1d4559fe","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","dependencies":{"@aofl/cache-manager":"^3.0.0-alpha.11"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-alpha.11_1569566973691_0.34948210655215983","host":"s3://npm-registry-packages"}},"3.0.0-beta.6":{"name":"@aofl/rotations","version":"3.0.0-beta.6","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.6","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"399107449bc0809483ec2375915650614e6d0e3a","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.6.tgz","fileCount":9,"integrity":"sha512-hikUH3NNjKSVsUqIfegMYxvvLOCdgR9PjyA9BFmL6MnMaa3D854eE/Hnmz7ArA7H3uKKLewq3TL0gLH/+k9BUw==","signatures":[{"sig":"MEUCIDkNsIGT9FE8payG0++xYKBBJ+N7Sthi26aQcZzRgBr8AiEArFFrkWU2UrGWPtV97A08+getdq10ewWHlBukzRRVrSw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnBVpCRA9TVsSAnZWagAA/JUP/04jBTB9tISkdWtMtxMX\nhwzt6Ev2tGKttbLwmEzzE3bQSoXWjalyWPC9Jrk9Gb7QGovrsSF+kf7Fz1E9\niVnOWbdODry9cB1nvZ8CZ4cUwNuNFmTBzCubAoWUw//4bbQuCzgBxTigIx2x\nOdmHxu9DcWVwIK75O4rkzOOskprN87qzq3Hgpi3+k1r5/xIQpWR9z7qOJcXT\neZU+F/8bwuLqKWqDyApkI2zDfVitl0P7Q6Kk5sUpTqyf+1BrgYsNWoCR8EJf\ntmR2vj5bX5yBu5CIWG9wnFt/ICHUv9/I5+UVdpeez6z8/ZAvdSL5TwUnLxoK\na3A8hWJbqm+rFnVkWonczGNs+HTFIBG53m+WS9x3hQK/ES6yS8u492uaSMUb\nIdU7Vz2NmRsOGhJDCV+bIfi/mCZMOykT2obfHPVtkSZxEJ5uTDOK2Jseczo1\nVICque+i3V0rgzmWqa6KqHKHo1tdpxRAtSJdNm4qtbq50sI45omazqf1rEqf\nuAzwEOyPM8vLpCysau1HTtzsFJdd5demlU4ntkeNKGZOwtB7mwk1j0bsINw/\nfymIIItMkBVP1aKG7Mxu+ZzaWTxtwdOxRXQPU1oA4UqfGRhAJd/sf3S1oK6U\nSG/s62viwWH0b9Zq12S/xKVxanpA+Du3olD2HrTEG9f+jZ5DkvlMFPg00Nsi\nE3Bj\r\n=TFjB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"23e8e9dd00e515c9305baf320436e43f51d7edd3","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@aofl/cli":"^3.0.0-beta.6","cross-env":"^6.0.3","@aofl/cache-manager":"^3.0.0-beta.6"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.6_1570510185064_0.01588344611157755","host":"s3://npm-registry-packages"}},"3.0.0-beta.8":{"name":"@aofl/rotations","version":"3.0.0-beta.8","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.8","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fdb3d3066def96706a8fd2c270d6f72c3a8813cd","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.8.tgz","fileCount":9,"integrity":"sha512-ISElmq4fxyDYw534ELa0F5FgzOTyfZMGKjquzbJAPbCHbRh5z92HW8JzYy7z7YxK7eCFS/FOMPYGGBbjKyqslg==","signatures":[{"sig":"MEUCIDINMkHcCv0+R2l6RLCdo7viIvGdT+biOXMrWXesOunSAiEAkZ+J6P44YL17dI8EFroxwkif3ZkYEHDED8opq/jFzbo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnCMiCRA9TVsSAnZWagAAddUQAINKE+boJwA1VqO5KmdM\nswV1klrTtDLGZBO7PEe6SptkBvVd2i0lCgtq4hH1OryHp65Ydv0YS1YP9rlA\nO9loS4t7FCMQCNAruj6qp8OQUgJjn1elpZFy4JQrkC3+p4EhTNUNtJIIWwGw\ngebyJUfakj1wNcXy8C/zvIX8FLYZVadNBptLKrBF+Rb9U5Jon4NK3Ji5MUIo\ny/91ywlR7Aw/9IflvYozOLM8VkmiJI4sLUbRM3tvARGyakLF1MBAeDNKkTsq\nu/Q65++6WaWKa0/TGmvhsR5di+jkiFLg1X4mPBa3t5wAwsZ5SRUX5FYPKxcv\nA1XL8kpeR2JEiCwlmXumZcOqwV85VqF8WEYma1w6eJU8mNymOqhtQJ6/meOa\nrpkwW14Cc9hr1dBoCdCUbc5491naWqWe/trUasF9gCokLRQhM9n5/95gXu2G\nHsp/gWmVIsGOSk0+dN2NZkIEFhmAzHrxYLni6ZLcBmCmmDzj8WxVyZKNzqgy\nHxldZ9/odY6EyL9jpV85qvE0eCnT6/LAuJA1hqFQuM46qh9C4NBpLRGJNfAA\n08bc9cu81DBM7SzgvTDd62hzMNjHHaBCW4uPihT2DARUDj6HMF+P9XY5U0Mt\njI8ABktQOZWaccvztu+fz1fx+ifZ4yFPyBFBQof1qQ/6yaZkeD5gisGZGRoq\nUf/6\r\n=EjjJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"31f766f3cf621147bfa1530b863757cb08e5fc10","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@aofl/cli":"^3.0.0-beta.6","cross-env":"^6.0.3","@aofl/cache-manager":"^3.0.0-beta.8"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.8_1570513698139_0.151448014053293","host":"s3://npm-registry-packages"}},"3.0.0-beta.9":{"name":"@aofl/rotations","version":"3.0.0-beta.9","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.9","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"8cd34a64af22a360637d898378bd125dab71dc5a","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.9.tgz","fileCount":9,"integrity":"sha512-Oq6dNYyHCaC0Evct8s+f26DsWsUxacUMgzFFyqKGDgSygd6MPbSpf+vTa/kuyBQYH0uqpDclO9PmUPZq6e1KoQ==","signatures":[{"sig":"MEUCIGIotPMd97l/M17Os7PICURkolluNTEHMQMO8pV4HTGjAiEAn6H9htr35IgY0qRmWSDr9jY75lfjfP/Iw8u/CNvGD7I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnCiiCRA9TVsSAnZWagAA0C0P/jdXmnRsxAeLoRG7IyOL\nUOfucewaVVZRlw/wYObQ0OT4D/GkvDDPjmQb4+DIhg0fYNCbZPRK+uZaCLUz\nBJkYYhtITc+OauDfyOJSjfQotuWMpyoxLxYacyPIk81fzhK0M7wIzT4O8P0E\noFuZBzwwqilxWGi5v+/+JDKRIh+y7h9LNx5M6K+W2wc5LiiCmdDUzh+BCQpZ\nSfcA/9Q2GSvXZuNxo9O5KyHQuhoQA15TPvYGlJkf04p4M+vsNpcJArsTBUy5\n39JdBkZYP1yq2XzQfruOyIF4hmMQpUp8g2/nAtk7nEzw3/+d1a8/Y+LnTqkZ\nnmSnvLc6TNVPMwaKN4KpWhLr1dRC0/RCQXVg+NlsmXfAXsFDuy7kNeQhkLQ4\nXNLe3hep8+YPnVpo9KuBy9YHTYavCijnv2w+S1mKvqwLC0SlWlgqXox/v8Ji\nw3rxm3qOm26MEngJaGlUR8mXzxpaDhR5Z6qn71iTAss1/nA+bxo7Bm1BVqzv\npKeEhvH8XI+GvN5uEQc+FieLkmr4j51Yvo3mxe1qiCV1sWkdABQnrJBjgdmV\n+s+tTx7oMGygvJIoYSG/U0fXdPIfbshC/jOqLKKj2Au3WoRZgcmrXvkMyjTA\n3+/3R7/wLv4R4pRYaqalCYp04RT5uSwXaYrkbcs266Wf839LJcDrAHaj4IFz\nsVPR\r\n=RoD/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"e9e6bf24a51611b9b997dc99e770d43466ba063d","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@aofl/cli":"^3.0.0-beta.6","cross-env":"^6.0.3","@aofl/cache-manager":"^3.0.0-beta.9"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.9_1570515105815_0.8827020699296133","host":"s3://npm-registry-packages"}},"3.0.0-beta.11":{"name":"@aofl/rotations","version":"3.0.0-beta.11","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.11","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c95a9d8c47e76a7abb3690979b1fa30e36552aed","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.11.tgz","fileCount":11,"integrity":"sha512-1plNN/fANRVQ4SOCVzM9DXei/Xjp9+tQEjfzrdKK+DdNA4BEH9pHncS3IkjfJX1TYMuWDYWCA6RMoVMvPzVnWg==","signatures":[{"sig":"MEQCIB8846LtORzqIM1H2ESXHXoL0VgieAFW30Y3NNUOfsLJAiAoT3DCCfHrWHiFstq0Amv44blzBANarIMIuild2ivYDA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":58703,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnFoiCRA9TVsSAnZWagAAcY0P/2PuWjR2GyNYfcXYdjwm\n9P8cK/u/jH+TnmfytYT1Y7o4WBeW/QaLBopoBQRgp7t6AYU3xwD3f1Ads1+A\nWDFego0VbAUAacpyZq/5t+/6ibPWhN5CJcegvDEQFsnKKkqPqG0gwcNLETKQ\nYhVx3ljZS1sncpZfxgmm3UtVB7VoWqP7A4eR1OzKv8rHarOB0tBvx1NIrfkC\nDu0Dve/xkyQe5aA1Q2cDZaapp3NXMninvZbQIgPYq/ODoblsadXEB6eHmHJM\n+9mwmi9Lp2rffPHEFaGgpGjBVI1uY/WH6tBP4s+ubAe025a+0iI5cmjF1mwv\n1Fy//HzG/3Z/wFwANTJIIDQjsKAIXWJvp1mDs25MWYVGvrtmktfcJiaPG6RY\nB2vTFgVswGGxZ/Z21HEHdMZgv13IA5JvK7u24E3RO9unEcsqkG7qY/4+DBu5\nOfcwE6qg+HLl6LvNPtv+t+Tah8MH+zkasFPuGpIt0WkWG9hebDdJozGMl8hM\nh/ZbNaWHIWTvyPyelT0q2N7HvFK0+h0H+EkShV8pfmErcfDheygD6zjcR+Bs\nPNhSQ0P6RgqpL2V7B4PXomve6yeclbSxnsXJv+Jkswy2yP4ZsSvE/i2r3t1N\nKDQKa6cMLHU46SQD0nEY7XwiWMg4BAWGAN8UzKRhlCtpjc4tXDZyoBPIigIl\nO5VQ\r\n=hoFY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"ad7cdc30523ea031f8d1bf5c62440f80f75a7308","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.10","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.11"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.11_1570527777391_0.1837793314953302","host":"s3://npm-registry-packages"}},"3.0.0-beta.12":{"name":"@aofl/rotations","version":"3.0.0-beta.12","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.12","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d997faf6ac4bf2fccf729d817ee902f7c2df0864","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.12.tgz","fileCount":11,"integrity":"sha512-yV7PD/gEVFQ9Sd3lYtZuKhVjihcg8MrX1eEjGRvqZIWgw8t0A3ySGwSQohnW5jKjKKKfONv7ekVDR75AGKq9og==","signatures":[{"sig":"MEYCIQDw4ei/yxMxqQspuKrtivxPjfFw16Pa30SUdTvyABOCdQIhAKYwcSKbst3xJf2gUMV00qUX9J7f0SPCYS5dM9LCvKLf","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61305,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnFyoCRA9TVsSAnZWagAAk10P/RZWOzhr0As5/P4xiHjd\nJvQD9fRE0PZxisuj58nqC05gu1H7QqC8IFW+JBtRiNiqEmaeq2kx7jF0Lgfs\ndnj37Y556dHrS8rkAvZdvCzTWYiPp75KyRxj3cZku2WlpATJQQz8V5LZwau5\nQf/AznnQhIOvOesZb1lvRLw30eJOruOg1sQnNy4eXUmXrELFoJT3Em12lRCE\nyCZ0L+M2b0X537o+GjLvuUzek/r2AkQDW85waK9f/393MI7POHzd89Mt+ekL\nSB2sPeuIlIyVVAuRjmonCRBkOh9lA63ycXeDj/yIpcGk8FMUGfroIC8aXAgj\nAtgnjKejUBM67O+c5y2YX/SgEypYS/tnCTGH63ZihEKvWs5UEjD8KiIDKqgw\nGLUSlH5Q/JfTLZsk+Ig0zSPOSiC1ufmBxIJvPAf6doXDU3Y+COGM5Hd4A+PH\nOMGkkbF7QGzjYgn5V99EGrLA3O0Ca0tRw0ukt3neDz2X8QvSAnOa6W0O/J64\nYxnEMdGYe0ybgTrZFYVFBk9wKgrwE13ofzpoc9NyaW1htrMVTcgir+3y7aGd\nIT0Z7N6qZzlOK/9g0lY0TYqhMfHz/AB4/BweOfg2Fa6fSY6lFLu0btLLfx/v\npnkNYRq1rNOEMFqDnHsbSuSnA33wWy0Kc1pCM1ap+H+BNBb45NDjqUf2kMyN\nAfg4\r\n=2+Ck\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"7fefe74af1885e7b807b6ed3522d9ae661e52645","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.10","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.12"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.12_1570528423561_0.3731032033559214","host":"s3://npm-registry-packages"}},"3.0.0-beta.13":{"name":"@aofl/rotations","version":"3.0.0-beta.13","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.13","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c5abcdec38d9960df4339480b24d3f572c743216","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.13.tgz","fileCount":11,"integrity":"sha512-MdeC64nsto1UCFBwkkqB2hdrqx1DFmocoqkyx0pxx1Uq2REEiuYMcugrR2xY33M+xoBJP0KpDbjNYaJzL23r1w==","signatures":[{"sig":"MEUCIQCyV4KGdNdpb9djso6ATd0szE3QuDEkUY0RSw+zjJ4lewIgL8Pgl9KSov98rXL8/FS0OJc4CBb7NqZpjtc9s6FN7LI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnV5pCRA9TVsSAnZWagAAIdsP/1W9NhoIgceLbJWfsPGT\n7whzht180JJsR8DLqvFfRkixNFmefJx/uGtbh2mag9dW4lNDEsOg8k/vMgmo\njCqvICd1zeQbk95Sm5PVNqwm2qHDlkkNf6LuH/6dl7BQGr4rBpwmgQMuKlfr\nV2iW58aO4ezAgu5QXi4IvwjVXCaZQXVEAJP1/ap06yei7Q9q4O8Uj/JIB8rX\nW8CsXwJv2tTRwE/P1fcvXT8VM/ZTwTl9KNPGiowji0bowv3DDHswcYLpSzt4\nPEl391mdvgLYWKlGuNHbSG9PeVWrgC978itN0s78aH3d2t7bi0Z41DLCxTVE\n6brsygxT3l9Vo6ne83iRCGYzaYwniWh3mSIjSAVW4zpR4q5Rwpiy8pX0F4BK\nwaWM4UwEZEA4NInVei+fNfAaVPA3olWif2jldfvosfIpTlBnVLBjV6lwAMbt\nQWxJMpMMzcdgjXpmDaWiAfbHUMHx2I8l2E9r3NQVpGlA59+FWp1106o8qcBW\nz5OklC/mlAsi1+q+i16YrBB49mJb2DmzL7QodUd+n5v21v9LKNONhhDWUtAJ\n8jxvSCFl2pEGaI1hM3zSrk9OdKcLJDKBb5UgD8cNIQ8EmxdI/ZMTkqehkqGH\nK5YuYOEA0+pINAmEe6D8LghBY0DjhfbWXDn8vW8QRmEjkJGMTwW5RK8Mcjzv\nG4Dj\r\n=eZYr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"aa2e52c46ae9451fde097de4734398430f2127a7","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.13","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.13"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.13_1570594408849_0.03956630321244381","host":"s3://npm-registry-packages"}},"3.0.0-beta.14":{"name":"@aofl/rotations","version":"3.0.0-beta.14","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.14","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"377d847781692e6d9ecf8305ebc9e8ddc36202ad","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.14.tgz","fileCount":11,"integrity":"sha512-sWHbIampR7+g8KB+5VMVBsXquktj6A0Qy5S2Xfoe6H7gzJ68HTlJAgXNdEcKg21ZcBOcqRkox5gdg8q5oCktBA==","signatures":[{"sig":"MEUCIEzKji1KScJobunjBq43c5mfTWZc2CSZiolFsxnk6AAOAiEArpUD69Gc6zH7e96p8r6nBkUfU+/Qn5h6nqM+3USOEIw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61354,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnWMGCRA9TVsSAnZWagAAmmEP/01JpU9U42gqdzZtw/wc\nlNX57DAWDv5nS0pGUaRjVAhf6tPJc9YrcnrW3dgQ5S79JZuqFbhEfoRlMg/Q\nc5EEEcIaNNTpuvPUkK6tzqOClinrvvdZ4NaL+M9hz8jdfgQW35nYewAU0eil\nuT3FDTttxF1erxP59oGZUKxZpW5Z/k5sEHM5wXyww3gFTD9ZrmmGtfLrQN5/\nEdSWB3zttA4CBc9peC9F3rWpET7PoGslQ/akzh7jHkgzJSgTvOBAy9DDoH3/\nfMmh7fg+uFVCBw3KRDmENm45/AdEFpmCkjZsZF8Wxn3ycX9ZaC2dq5B8qY+x\nvJNWn0YSD0egSP05IDfCixtHXKgWBvzjSEmXT4qCs9VW55t5CMpO6Ma8yR+R\nN54JZqtHM7wVcDFPZHdzSYgjEFJUmzWKPLyrv+nxPkf0gbmhUR8ygp7rvXUd\nkUH2BqxTpPs5cKPw8dfCCaGo7ODH5IA1tFcWbawyn8JOtl8df5QuUzj9Lh9G\nG9HwcNemXR0vCPhpAW3ad7QpmFnCBJDij3QVxyMtdiCvrWUEZsrAYMsp5rlH\nmFNM/wBOYZ+TqSE4b7VPOQE7XXH+WT+C8jlcc+ZzqHSHl2OfShSIPr2p6X7H\nwzbWug3DjZjvSVnTwDiXl2cQBNHpOhvdFElpCHEw2ZlIhUkxo7vA6swrZdF4\nZfHM\r\n=Daun\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"80c0c882f3af67f4584dc8d38de8a62ca5632c94","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.14","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.14"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.14_1570595589789_0.5098685712828703","host":"s3://npm-registry-packages"}},"3.0.0-beta.15":{"name":"@aofl/rotations","version":"3.0.0-beta.15","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.15","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"3c93d55690d472959090a3e0e772aed98a8e1419","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.15.tgz","fileCount":11,"integrity":"sha512-noY9qHodtkPOElurrgcBnzNJgCZgu/kBQ0x8AV9kCUhO5GSMYEHKHItcm+5ShLuWoIJE19Xv3pnRXt5rSxcWEQ==","signatures":[{"sig":"MEUCIQDkWy2ZSv1G7MM49DMD+EZm2EEkWrhiQEcgOEig+89NQwIgb2JI3UmlV1M3BX5Qa6/oNiLwD0ehJ4Q7LswwGfMQLQA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61354,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnWcvCRA9TVsSAnZWagAAsigP/1MuT1IxsJq1z+CTydxP\nUnQQ47ZhP4Xgi7lO5g5ByZ4LhwzmxuyQIYLaXxJfCgRTC9zr1e3yx0z9biUb\n9XBZ/HvGUaXuFu+fxm0p7tT40suMZp/0H3x1RRilbx/s6wvVJIPxkPhG60I8\nF7iTESKkPTsayHIBNiITatYSLLF5KzYEJ1TB+qf/xEq1Y+L+TUwMrEYCB4Yc\nkxDBxTg4kbMAGoRi8dwZRkaAd78HGWj/QK8pHCnsb589yXggLEVJkCuV1KXI\nhTiLSBYX2xmp3TQ+bqydMMwMjklN+Xk0clNYoVDZYP0+8mq7DYdl7H+0iPOs\nbAeK7Ma9Z04L8nYtiuqH3vvytzB5H9lM7Dlh4baRqUKMPMeVbyYcCmJzlItl\n8TW7xMXmnmxeuY2uElJiG/SkVcSEPYx0bsJtlTAsqiEN6szyErSChj8zXhcE\nAwpuSAX3fqKnBFrMcNO9ZiEM5lNPpj6xNDOC6ahyLtcDTKPpB6MNpcgDMLqW\nXFgHTfT8r9mwnuMZOnxBFGJfiRsyH3+G57RCcT6ULXqc3Jhwu+GKLYFvzcRB\nHuWtTDwYVK14/4msPgQfkHNb6tx+pJShFzLW9osQvRlBe7OOY8gCxFcqh3q9\ndDyeLST1/h9zjyjGkMDUGntYtNCQGe6hyicj4jKY2V8goth9cC59tvOm1aUE\n6ylu\r\n=fHrc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"0fab45fd3f4a1789a3683dbaece87d579e9de597","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.15","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.15"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.15_1570596655117_0.3256395074918661","host":"s3://npm-registry-packages"}},"3.0.0-beta.16":{"name":"@aofl/rotations","version":"3.0.0-beta.16","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.16","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"6aefbe74af6c6cafa83773c1dce4607ca2e11de8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.16.tgz","fileCount":12,"integrity":"sha512-rIO87Hyv84AG5oNqPuNnrYs2ozRiUHXKGv7bJUQQVVxsay5RCtmmzwXSavq3yQ/MZYn4zNwMkqARDs8B8CaEuw==","signatures":[{"sig":"MEUCIBZDBFQ9kjd7znBNwFd9w1vyn9MLrfzWuwLMOsKad+nVAiEAwSnntwRL8WWy9x5zJlf0fKVY17+GzBdYyuMrNAW/Wrs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61395,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnWq+CRA9TVsSAnZWagAA/vMP/0rHSN1g+ngKmxkq8VfN\nIGJZhfEjYS7s955FbMj4N1zaxE22XvHZK8bSPXKucDfbBeFQuCVAsIZxbFH6\nYsgwo0yGDgu4+thcmws2GhzvCb+DyZ599ipsYZtdI/2Pk5DyXXh1cp/5DPGz\nVpYZ+NnO0bU4PXmyYtXNSGGtLvaACZquUZ/WbeArcnxwVAJc5RGGCTvfZOv/\nHymScN5k0VCGFhApT1xgDWgz8bax3jYpYLDEvNWII8YVTHHOZhyA4ad9QOet\n8OBdBVntXBB95NPSs1kPjLwPKzkvI3oFfZkxL+euz29iKZ2PIQz1DxFToBod\nDCRulX2oCpYJlzh/YV/792MBUIsDfYvlTpvYQBgo641dpZRUZ5LuvUNn0sWK\nUgtMCnu4O4hM//Ojr411+L6UoP+1/p03vkDAEALtwYyMcB85Jr6ZqWFOEVSu\nwShc2Og25RnKD9rEy8+dEESnP1+nVdSWkc3KslwqFxp0/FoK9KX1IRXD03PS\nS/f1jYXpXgvzcHAVLzOOg/30vw1CVuG+qnbPigz5JB3KoW3k6ELETLOgMdu2\n1tEMpbR3qshDW3ap7ri77kfcg8kRpPZK2sw/Qvq7Aipz4OHrftAMSazgas5M\nW304VcRoZq33iN61R+ZBkAExFYJqNA6W4/FCYWnNsJOT7B3ZX4gOfzxvGo0b\n/pS6\r\n=N2KE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"32c2f889b64c30fba2458f8704f7c135b47c5b95","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.15","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.16"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.16_1570597566139_0.36519879579759307","host":"s3://npm-registry-packages"}},"3.0.0-beta.17":{"name":"@aofl/rotations","version":"3.0.0-beta.17","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.17","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"4359debaa565a76b4fb22c868a49c47fdf62c34b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.17.tgz","fileCount":12,"integrity":"sha512-HKg3BmkDXNFEuvRaQ+MFFQBBPjTrHH71H6sjbrgHNm9U7d1STHBGrKLUf/AwU6RKGwnvKI8vg3Qa98wq3wH2rw==","signatures":[{"sig":"MEUCIQCfBAteQrRuu3/WxY6RpHVNOMF0zztnVATMIcpHn35SIwIge8ePg7E1/d6xZNhZ+CxT0hnKBx1QxZDj9+Y0Hn6GIog=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnW89CRA9TVsSAnZWagAAWIoP/0gn7ec7hHiqMtONWnBP\n9/jlKIrnVkfWNIrQ07A4TNjTtSw3MMoLwCT2OFhNyHh86xjMTttSNYl+E3MK\nswRpTkSqa76SkQEn8ne1tv03u/Xn6H3KEuAxDyAShtlgq5ZTJJMTIcHkDQdH\nRe+gvfBazt+0HGvSs3ZUYRt1a2qKejPDVpQ8aIgwkpbVcnDQbuH02UBKJy9j\nlYHOhuLg0/d1NNYGAULTl1ouwMd1F1j9+T047gCBSh9Oz/JFgkNkfPVLfJD5\nqyqH2cbnOn5v7gdi44s+KbEnP/wiyy4ZITEeu3TfgWBJG5TbxzP06oQPjwIK\n6L1SBhsNrlxv8s5v1GM3mg7YA4TDAvbbn7X0h1L4FU4xcN5BPpKYElT1hlbu\ntOWZr0DOic+JpvNRwFkySm4D+b5Ejl07jpmgKod/zC19v2umHrCCzsEi1Jpk\nMYmgY4YHdnwX69tFTjvw4pISU1ix4MzrjqOvLn6O1DGC9H+4OWwXxLw0zWjU\nkFzouHTM+4n6N79LdcdipxkhXieubQ+IIUKRPw/ZYu17oInjLI0ekTqPozMA\n/tg2peSJ41sjPlOGLUK3atFf8qqfxsNNc5QrbXubbOsHkidWcGGJDlBJNttX\nVk/OYPD9xQCGzWkZqjnn1PiHsFuGpSoMo49ZliGWdqzLj5iw1e7r8X6JleQQ\nf2dL\r\n=GZvX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"1a9a0010d531b8a6ab7287dee07687c312379976","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.15","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.16"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.17_1570598716814_0.661034582798145","host":"s3://npm-registry-packages"}},"3.0.0-beta.22":{"name":"@aofl/rotations","version":"3.0.0-beta.22","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.22","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"7e15ac74bb81e098aca4e8aef0b3a369dd69d327","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.22.tgz","fileCount":12,"integrity":"sha512-pw0BN5qqp4gbYInRX3gMCJ9CzhDZP9Q8UvCXVorsEMWA/vKLFSgkEuZPevTt8tTmj9/ZrBxIliNKRCoIO2O+vg==","signatures":[{"sig":"MEUCIQCIOGoP0cFOz9IuEiD8HYLfU9el/caCWicJt4rATSyCNgIgC3ZNs0BLCZK/tlMq2CiVjRLxOI1Ux+quW9ufYZMaJjc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoAfXCRA9TVsSAnZWagAAwdwP/1x6PAiib3H6qzBgXECx\ntXdFTCCpO+QD2F/8W4kEJiv0q6eie459kCf/vBEf7AqNRhvE2TZF0vJ+6jl4\nXZ/5a2Xcv0tIjTwjFkv3VPriR0g1rb48upvxsGi7Q0xqeSR4689M5Ri3BaWG\nnrv8AwCc6utTI3/2lFWVaC9vb4jiBpx67m5Y9MDTjYWu9sDHXXV3zhrjrU4G\nqMZldFlx6cu64BgwELFLRKKT6GLM6h92kbTCWyp9CF27h/NrVPriQKg9GM8t\n4ZowMTBjVZlqJ6wjImqeij6hR3UFXz+trdcJGJXenWAN7LzFoxnPqa5bXJ80\n/joO44yG7+KhvCVm05oM1SkRzFh6PuO/l8dw7/sajIHAGUFH37caOisWtHFE\nMGMPzywlST1+L148+juFcvYRZigmIZt3FIQU11H5yBdlFmQAIVCiFIyY7XSQ\nPsYxISgpYFdhvSSCglFzx6ttJw6hm8P2uNur4oc0usvT21QWSq64wGecScW7\nmHLNFXouSD45nvLI4KFSxxHrC6fPH+TUCIDNlUeMCmHczHB+CQrPv7/PzVN8\n6AywAgD+e/gA7uYIzBX/i0pewM3EKmnHHsfQXN1r2tUmHy3cVhr8MolEVpN/\n+AcflPwSq69Wl08p87q6sNKTwSsm3I747RZUj9VHVvKWa33OH5V6AASkzmG6\nPEaA\r\n=zIxa\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"6009b3c38f31f159b65265ddbc3653c0087909be","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.15","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.22"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.22_1570768854640_0.16913325893942077","host":"s3://npm-registry-packages"}},"3.0.0-beta.23":{"name":"@aofl/rotations","version":"3.0.0-beta.23","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.23","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"47ae01505dc2abcfed2e2bf2e6d3c1700c617790","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.23.tgz","fileCount":12,"integrity":"sha512-Sz/niqTtD4Y6OFflisd0JGoxt/YdHqLwMG5SFcNP3WED8mkCnJ/g7jyW2kLMzbtctjGDQL80AMiETckLfcgh2A==","signatures":[{"sig":"MEUCIHVGHS47uTjyg0LxZfrWCCwlXByr5mlpYbS/u3d3wxojAiEAh8bpmmacwra53dFF6kmQ/GEbeWboixz/OHn48aVuG7k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoBWzCRA9TVsSAnZWagAAYy0QAIZOgWmNum6WmKcWw3l/\nwZ4UEw3L0bLGFhHzkaILmEUuAhFU6w85PKtds9Y/gcGlYo7XsyttVeVxDCBK\nJJfisOq6J00ztVXYs57uu/p0dg5eCFRgyASgEDZvjMLskpXDYMtcnt+Hq8jj\noQnLhTQRl353GbbFux4ag9TdotWuvFTwR10PiuetbIrdagAzrZzcIjbuZ5Se\n45po66S5h1CL8bhmZ/W8sWoUaKtahKWf/a2KFM0t1+yzghwiOfFjwVVUAdCT\nVTyEQhoElcJvjDWJ5o6r9xvIIv6NKRH1l5N7Hmz1VM/R1ue8ShQwhKm+I8g7\neDc93EHM7LkDbucqkvnD+YgD2i03wyEg2LKgz5wnwH0YIRixIsNjEoPnvb3T\nnesltrOc4If4k4GI5o0fy1qcTAD5l/QKQENMgrDIgtjcVrFjnRvLHCqUtRSi\nJYI2PNQApDUlciDZtHxFikZAyyVdeHw3PN+DNAroGDzZ7WwCm+2kc3VslHIW\nJRKs2fbNtfqBupe0rk0Byvf5UbZwcIFHGA5wmW4+cBUXTWU0+lMZ1nyqNjuh\npqzzaT1mOQj+qYTv9rDI/Xid4nUI6YdXa5A0xMFvhGMOkgPOxPw32LUmzr0W\nhI91qhjIx0qbIIK+0rPCcCTHclYOdkK3I9dTscesxedftqUdooagSbb8HuhU\nF16d\r\n=rdEN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"35327a525c0190a3c1ee36be061e25eeab73ed33","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.23","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.23"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.23_1570772402760_0.46747416984882273","host":"s3://npm-registry-packages"}},"3.0.0-beta.24":{"name":"@aofl/rotations","version":"3.0.0-beta.24","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.24","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"122115b71cd67cf06bb4bf5626b7a357235f2abe","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.24.tgz","fileCount":12,"integrity":"sha512-prDA5uQjN4sfnxCihgpYyWUp6NUFgCOtyN+6XYcWYtYxtJTsgTfSHhR6I5K0//CJsnzgP12lTWLjp69/ZJ3MOg==","signatures":[{"sig":"MEQCIEabu0c4rm9PkWjJ/G/xD9UBZqqvw68KVntLhQJcRbfuAiBIPWvJM+jX1I24/42vl2HxR6JSKWaGM4Jb5sAKdvHxXA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoCKLCRA9TVsSAnZWagAAa7MP+QAEIkJizKPZjsR+mNEb\n0wl0UGXiaeemtMKWO0/Zby/n0FdHOTPZ7qEEe9NBL6MbNvjx6jWIWDVuGVCT\nQZgvDVP5ZPS1xPammT27eojC2YCZumLuqtMggOsFLxSqyGMj01wkvvTgMZSf\nj9pNhukWLIn6aTaHt/SVZuk4vQuXU5c2TU16wjGv9zlgevGm6YugpRZqpZaF\nsSbZwdV0iUCqjUS/5LEd4MMW66ktvUEh3cU1LpPpzMi3jS/zU3Sxtp0m2y8P\nzLD5oalUJzrX0D4pf7DdnN8nIgER1Eq8OsJv2Aa89ed2JDrnzBNwKbXXj6uR\nDwUSmZAIFvTEVmRaBjcpFD37+o2GoiTo66XfN81d5tkBzKNWM6uimGGg+jN6\nOs9XhmG69achD6T1fTK0qGP076x4GBoAeZzzK7jJ1Q23bZbta3Zj7ES9NXV+\n7bLrafZPlGS2BsQheWEZLmX90daBVpdPGJO3f8QVKxbXP+ZzRl795/4Dmtvp\nPhhCe25Y6QHtER7Gi2he5nV5p4OjK9pCIehS2+h+UssGBFeHxei+KserL9Fn\nh5Qmem3feYGtHZJ4iEKnUryRkKWoRAyq3g4j82EtY00Hw9QnNZa4qHbd5X0U\nOZVMNzwMtk8LgKh4vPTdwT34o45IwWZZxVq9uMWgCnNtDmsQLWFhDMmFDl3R\nDrhF\r\n=arEY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"be81016959caf66748582258c92f8c73471a9f67","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.24","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.24"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.24_1570775690744_0.8080001802424515","host":"s3://npm-registry-packages"}},"3.0.0-beta.25":{"name":"@aofl/rotations","version":"3.0.0-beta.25","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.25","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"943935bd131811aedc929083754936fa8ef1e69f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.25.tgz","fileCount":12,"integrity":"sha512-+Seku633MPOTSI6fMCY3lV8aLDp/CQAemPPxiid1qgRW1Bdg9ZDKFFplQ/V0MmhGcmtTcIredy8seImKG7W1uA==","signatures":[{"sig":"MEUCIEV5XvcAjzTVOgfe1aB0zt1ySe4jgKPMXv5eAuaPRnebAiEAhBkhoeVdqJfNUB0UI8j2N2ay5bCZpDL8Y0W5PwCPcq4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoDCdCRA9TVsSAnZWagAAO1kQAILm322CUdcqEprJhmtl\nvpnwYgo++E8SoP3KnvfOGoFiMS4kFwPTsZwv2kimmqaQwrS1xDI23Tf7dAsd\noIRAGXqxf7tUot2smLQyCfHqFVMXYRWNI2SoEtFngnFDa2bqar3TZh9qjPnB\n8A2Hp5I7RJlqjWO1jyqqWthet0pR8V8vdqsfvw6moeg7LWPV9znPlHk3MSUp\nUAeEZyF+VzLa9XoZceWUgh0ft4lyAO4j2+1dnVK6MnkoytiEn5Xibp7ie+76\nk9EYHCWl+1FznHB8hH6Dz0gNlR/AxYzHUQYLClxfAVXDsnWVpLHLItD1Qtv6\niqltyyuLY2FFIwyvLsNjHiDDyBAbcFSWptfVmeWHAgZ0Osj3NFm4YAKU/QwM\npizCrWalpx34ApFb+JgwMZaqRrJ+930KMyVnG2cHHKNqV7dVf7tXpbU80Zf6\nIsKU36n8vOldVZaOjnRAv/2SgOnanGHfkKJtdM1p/ch97pIUQsDQ5Ce3Nv70\nIsgo1RwGicUFzfaJNxO81lKTP2FxBjSo2NzXrkG59gpYKhrvCflIHhxSFBHx\nqDmReA1jg9lBK5CoubpHYlJYn1WO3e+oEchlssUCwnSdi4TqdqKQRcAF4UA5\nyyJoZ9jYrNDZK2TCHA6hAaXFQ4nPcukhxtZIcEjT2i8weoxWzPS3V6E8uuHN\n9/sp\r\n=OoPA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"658a5f60a694ddcc2ddc62e8db80688cc6b71c68","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.25","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.25"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.25_1570779293051_0.9616290578547726","host":"s3://npm-registry-packages"}},"3.0.0-beta.26":{"name":"@aofl/rotations","version":"3.0.0-beta.26","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.26","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"dbef1ac52fd647c7d354c4f59ba37e43828e6f1c","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.26.tgz","fileCount":12,"integrity":"sha512-z7w9sPDkqh0g7v1RZ6hW41g/RIku07PJ/xwOflt17LVJrXpgVuPq8kMkb+3XIDClqcOpQZoJL2gdhhGmJVmtjQ==","signatures":[{"sig":"MEQCICUeXxR7JP20Di8w6IU2FbTid8+8kPyvPd3IvoQxf/sAAiBRQSJ+OA6TGubKY851Omc0PG46poVELHXywDrinAJzJQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoDP7CRA9TVsSAnZWagAA/wAQAJMTZ7WX1yPzp20ges+D\njLgtulYnE9c6gw1JImSGAZz3dghD9f/xFz+/ITfJP4Z/PswQcwOBTSw7t9La\ndpzb8x9t+dnIyXDI8lnPc2vD6uJ7U9NhviIH7T1yZXObHNgFD1+7FKzocLNg\nL7GUWuUherGlJbIF+TkaWs257Kt824YEofCzvJBLts9pOVWu+v6TUn23EY7f\nXVttPBgeEuOcEIo51+uWD3pBZWhItdsBtGLaaObi78lD3Ps9SVnTn22toiQZ\nNdMAPEIuBtfAI2miVH+GPqJJ2H/ofnrdYaRLtJChCfEFbrwn9L0vboYKdqVS\n5GBwS9VuMghxNV9O2o4MwvXJZTUBg05F25aUMBBucYCFM7pAhRl7gL4X3GT5\nixPStFT+BbA+YtuVZzKR2uIbd6vms+6MdozFYSU5hd22+pHa/kDx+ze+zoNh\nhKS7KzjZY/+1ZwcNt9Twqr2Iqdk32XmABc6soRam/c4iDEfhpgXvsStgqYag\nAJC69yWd/HVJtJ0RDNapZ+RqRPgEMR4pj6Glgaj+kLOK2Gb6/4n/7Coykask\nGb3vM+jY5yniFuIEdNfB0lkrvNeQ01yq6PAxPcuVG2ZPOA2KwJwOdDMmSQuM\n4WtrHzpK88fA7J6hQZHhMP4tPr4rcQB68c+wvOpXZewCGJ38RT+kzpvMfrg6\nyyhh\r\n=CR18\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"12fa62b6d27f95d1517f1ec4707c284b865a7081","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.26","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.26"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.26_1570780154934_0.7484736830363814","host":"s3://npm-registry-packages"}},"3.0.0-beta.27":{"name":"@aofl/rotations","version":"3.0.0-beta.27","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.27","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c2e8532a67f199bd5220d474d4d44f9382dc8e2e","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.27.tgz","fileCount":12,"integrity":"sha512-kn0egyS57S7/jj8bYpUKvG9fe0tW/8A++epxvZ6ocWgq4l4e59mcb6TDYOTcVZpnTDZlv4XcOo94QDctFAFpmg==","signatures":[{"sig":"MEUCIBJrvNVmca5RGhezqOcsIgeOPrSyBKJHjTQLioCLXhFWAiEAqLEpRnQANpIyDrAhjkU8WEwWInzme67ArQZYIeaJH+M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoDUfCRA9TVsSAnZWagAAV6AP/1zVdT//drVb6eGItn2s\nSk7Yvekt3xzUlSLAXQ+itrQwyhNnr4j6QESb95FHvIDVxno4/YM+0W379KnG\nxOTuCogWBUzYHuEtY5N2vmK519hYKaWIoBAXCs7TVV37hxwD7h875v2TN6PV\ni3JEWmTvM0rA/Exb/ziwSo47noNou7a2fwnwvTKiXrjBoHFNeATNO+6qij+u\nWzuU3RAVBq74hsuajJ6duf7iU89fZhGlP/vfUKB1DF1OIMXcSMnl4j2NFF33\nnyeeL3OnD5EBQcmEUm8/JDSwUrkmRvAnAORtiDH6trJVzKGFkezuf21KeQnQ\n1IdxUEg/p/e3WcBIL1z1cUBPa1Ao/qffaz4Bol9iO4GKwWyLaST5YiRvEQKh\nGrIWH1+spW+Jjar5uo4fVL+tbCSZSKRx/A1e0oW10ZmO+ImMQLYLQmn790oo\nOO2qLVn24LNCjMmnmcwYezztbMZB+zkq65xix8iGQLXH/vTYqKh2hIQnkbIU\nDy2NynrVqReQBRjzrkCgjMccX0TLYqD7B/8zVEGmxpbl8Da5xnOZnHrzmoNk\n+Yv4y5cRjwtvg9wNB8Catf8CvCO8pgzD18Br5qUxkP1xn3355W9kDdGuzM0s\nay6Nyj8zdH523+roTVQYXz1Vqzj6XX00QY2VUOIs1+6eWBus7a/kFh+bAwFX\nsjO4\r\n=nOWx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"de2f0be87aaadfa43212214d4f491d68930b2495","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.27","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.27"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.27_1570780446558_0.8920595808895426","host":"s3://npm-registry-packages"}},"3.0.0-beta.28":{"name":"@aofl/rotations","version":"3.0.0-beta.28","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.28","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"676f7d9e64a9690d171345d106054389bb104785","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.28.tgz","fileCount":12,"integrity":"sha512-sgcPJsx3DX7D8zf/rmHz63vDIoSdA2MFDo0+st30AGb4nka11qGg43ISZJN2iGME4Df9kbqgyGnG4SYms0/hBg==","signatures":[{"sig":"MEUCIQCty5rx6HqDMYIgJhdNtlVxbGF1AuKy15t+wmyKZ06eHQIgLiKKHt9nR1zxtkCL5x3Hg7LFsXdQn3ikCjLUS2qhO9w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":72541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoDbMCRA9TVsSAnZWagAAS6IQAI6TAlKlSCnL/O35pYC6\nRTgwHL9dtZGeTZ1mYcYyZ9jtiCnpV5slxntDBckEi8OJpmXiF2CyDLUpqPmn\nioqsnaZVH6xWyjiWc043vVKSyBY6hsP0F5lnbhfR9Qwnk0eti9tF3Bizs+dX\nPIgICbM2+pn95FyIuaBwrAOO3i8NiEAqPs0aqBJ+32wihWmYfq9Tx5dtuAhh\n0FRpDtjZorne4JVMHOdHw9WKbVYlg2U2kUDXO+gXpVU2d3sDZDCAI/mVMHcF\nDp+w9tic2AfpANlLOUrFIlh9sNUS59vUjH+wZAmTntuq7mXqmdpY47tiIdh/\n8RjFanG70yAyCGkcO/2/o3yhXwAcIxIIVlm7ElRtigIyYtCl7voej9SYS4op\n3jPHnKo+EOUPsU9dYgzaUwzfUwTWCM0PWcTyOQwfaruygnsFpw6uwMUD2NAg\ndyBPM5Uuzq9eVpAy2JHUti8EpwUj2ZrFfs8c0AlVWwBafnl3mM+mmOzlhV0d\nHjQdjjqm/kaCDnMKa6tub0jqHKx6H1Ew8fY4WMaBiXtzP6a1RfKOSD2f5c84\nVHqusLfcCvCw7wvjxNIbrCt3HaOszP3kYV67y4uQhfe4QgCheTujaKcv0XBm\nCrusur8iAWHbAsNYA4Oyx6TPHbGZULN8QcPuTlkh/t1QGbUHEXQQvXcKSV+e\nlGs+\r\n=MnRJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"dbd14b0bd931ea76999d514d051dcd0a3ef6a8c0","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.16.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.28","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.28"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.28_1570780875469_0.8073399738838343","host":"s3://npm-registry-packages"}},"3.0.0-beta.30":{"name":"@aofl/rotations","version":"3.0.0-beta.30","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.30","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d1366cf23851061801135dcada209cb21f88b53d","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.30.tgz","fileCount":12,"integrity":"sha512-BylYVnyxsap8DsNP+6PHgzAN6NdxAJoR8W31p1U4NAIGGpIsS090bdN/+R/Git3TjFL6qp4m1nz7uy6zOnaeBA==","signatures":[{"sig":"MEUCIHds0fN3DEhkYSIVm+HtPtJtodClX67ehCAMh6OSbyZpAiEAj4EXIXjrdY7TqF6YevnBZ0m8GZaIVU8tJsk/OBO09kY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoQkqCRA9TVsSAnZWagAAw0wQAJj6ZN3jPEqbNeHPllWE\nYDTcR02ryQ0zJQmacMgSra9BZCPZGG6B8yXk3fqMhUI1uLNDpYTPZp4dsGxT\nUaPSfibeJh/sLhKgMVGrVuenS6ltLlTAdm/icvNS8HIVpDA4mc5+nYIb7zbi\nniuYH4WOkth3JoFgI3e+wB/shcy3oZ8f+1OrHFd8C1JxE49KaWs3HeJULnPz\nI186yeU6omsvngtikV1gv5/7Br/BBKZyih4g3asl/URrGOhryZv9CqKibNcb\nLlSMF2Mi+adNuFLIlnHS+CGco1DAy4aSJ5ALzymNZlAzT8GA97VIAeCT2NIC\nD7F3C1R5rMjIEf/OMpdr/GGWJJzp0ifuCOXZBDPnVACnpCty2fk97pIMyiA7\ngo1OoG06fnNqftG0H8Bry04rj/hNsljaM6v92OwlSmrFpwgKrC3GGoLX3XCj\ncfff6YgOxwLIjSufnsaz/xzlkNv16LrxWBR/BMxIt6+mDydt8TmH5RL5LPb1\nCWw7NJznB7xyqrM5zBuaYq1hjrgWtx2oLQpE1pOidmja0MIkcyedZ0jFso+Z\nSjGB1xFfWYDKRbyNU9+Xc+ZBVr7+NWXO7BqBgyR0L+b/zi63t/ll99GknPDh\naGBMQn737VNfdb5RTA34KHUCAx3LpwJXkjvhZN9Zn+vWxcZnvbbsZnMcwWtA\nB4jS\r\n=iWOE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"7bb6b9b6e2c1d77cf7e65680aeb6a4c60e0300f4","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.17.0/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.30","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.30"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.30_1570834730308_0.9486681349978512","host":"s3://npm-registry-packages"}},"3.0.0-beta.32":{"name":"@aofl/rotations","version":"3.0.0-beta.32","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.32","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"1d301e8226d5d71cd2face000fbf6b3895094dbc","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.32.tgz","fileCount":11,"integrity":"sha512-r2YCrmOsHeKruv/jQ2HPjJJdi7dLxaVbe13G2dzn8KJNezIYyNpzWUUBHsARLzpLEbD+TB0JNRXyjFrfAZOViA==","signatures":[{"sig":"MEUCIEgq1UoB+ZOGEB+r/r8rEZCsMYT2wyrSfuA7sbIMZjarAiEA69F4JVQCNFRWuyBN/2Xo+V9F9l00hL7dQMWpt0/NxQc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":58119,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdo8q5CRA9TVsSAnZWagAAPu0P/RtIY8ar28ZsR8WUP/tU\nGl0iIpcnKl84Inc0YRm1XJ6/A69jvUTyV6cpYnntMXEWXim4EdCbACSWjjwD\nJ64Zf+loe1MoQUzk1cZch8XX6zZdsbBAXJmdKGWleRLqxpP3awlNOfhaw1vQ\ng/JUIVxK5uZeh9adrRY2mdsilw38I99+eziC/wZmGHG+qseYDWzXYLlgc4J+\nD00JfXrVOiWKBXKfoOH7p5vr6nYhd2q3hs4bXglPYwrZYZ0yiRheCf1KuHRT\nov3HukDzcGjBfdnjX1W5BZ9nCKlxMxOmUro3wIMjSl6T0UCgO0pwdTg1Nag3\nxBHjCgISQl2gwn4IMELBADgCrgctjQ+T0fqO2hNM5/hIvkg25+9e7m0oXUUA\nJJzmzPh5PLn56dmrQpF+ahORmO0CHK4cBY/sHwVM7jadT0sLqHw6k7XD+gvY\nZcxaN475WJ1zO4xLYFwoW9iNx56fnfmBarlUb/h9rcw2FtxfQ8l4DAa3pOVx\nMKn/gLo6zHKMoVzvNi8a7EfMHzD+gRu+o4pWsot/QA4hTljuhonHn3UYNDfk\nFMO3fPsTkwXEsVLJp94wjtuyoh+uFZlEZUpLf25UPsRNwpPDXmDRF64rJVrM\ngt8EqAgJzDgVvZfVuuhpCJeOPH5C7j6PmJIXMiFoJZ41T9AMzo4kAzyorf1p\nFSl1\r\n=j+7X\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.11.3","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.32","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.32"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.32_1571015353156_0.13223143226763012","host":"s3://npm-registry-packages"}},"3.0.0-beta.35":{"name":"@aofl/rotations","version":"3.0.0-beta.35","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.35","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c655321e82626024bada10fc3ddf62dca25c9e46","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.35.tgz","fileCount":12,"integrity":"sha512-1lwdPlPH42OinUr3NdujUmz7wSL2jggYYcdhPl1+pFGBlL9B2tRr0o0m8RRR2J7McIkx913yEixXibF0gt9jBw==","signatures":[{"sig":"MEUCIGticvqb5EI4bgKvPLfqKvgbFzyj360feKGu9eSx2NtxAiEA0g0mVG6Gcx2frxQa7f6G6j2P43UgSo7eRiIdBi/B09c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdqWLKCRA9TVsSAnZWagAA5BgP/1jcxA92BgC/rvyd97gX\nRXym8Rv7nHV/Qyb/aucl/kDAr1StJ13fHcUKOANldDnDVEoyPNgpuZ70XgJQ\nGjpAmOkMpgWlCYz4pZ+xONrbTQ8VgIBIeGzyoyF9dSAHooqE+Fzz9rRG2lpP\nKW4HLabRz+ClZGQTp2/9E6aWld4RW9S+HIDIRvO3sprXBmJ9GtUVpy7oRTK8\n+MEgoc/Dgcd2jrY9ewaqYzGLEVEdVYkY0Cu3CKlfVIfAeL46dju6HUfiUIEn\nTtLNX4fyCpoLikwfpEWCSsvJ5C/pjMQqPtusl5wVq45JJfTZD1Amn+psf17X\ncpot3pmAwPopzQG4gbMPnRSCt04Y4OCFAdnclGB6YwsUGtP7mf20s5NOOkNC\ncftcS6rVJSNHAKqA3WTqGBXoa+dttXba/G8OpCTv6Fp6ZuWXpeiB2tzrYP1I\nFFiASrKv5Cv6I5u4/DrJfMYwvlgRvkiDoZtodJ1MXeHobTGQw1iqUMpz2MLG\njYJ4f6PpwKVgmfh9grh6FVbtUC66MQUokW3tzV3HSRmUaRYv+4Zb15fisg5w\nZu5hZK5ulqverwN7S6D6fSZs9dazhYCNZ+AHlfRg6XyjJyb4eDInVlHYPEBa\n4kp2q9wdza65zM/0Hocu2R2iYj8n4eN9ppmqjRN+s7Mop4zZ81wx32O/h/8Y\neTA7\r\n=qYuX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"6506e91bedeb6cd9a30c22f437603e14e02a3ca3","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.1/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.35","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.35"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.35_1571381961473_0.023589472502094644","host":"s3://npm-registry-packages"}},"3.0.0-beta.36":{"name":"@aofl/rotations","version":"3.0.0-beta.36","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.36","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"300cb7797728881403e468b9c7457dd97c6c41a3","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.36.tgz","fileCount":12,"integrity":"sha512-ak+i5LSnTcY0XkRRGnDrg7P4aFMo0hV/EJigCxf2tacsH/mOG1YPS6rpr7vcXJu5HHst9V6b9judAGospvLqHg==","signatures":[{"sig":"MEYCIQDRZ86OD4vEGsV0TDVMH2S0quKqi0Ewa9ERIyDJjH8lrwIhAProNuB8AWcYqsh2az1wGDV22+2VlBuDlTyNGHPPcnBn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdqulmCRA9TVsSAnZWagAACRkP/RTCS/XmPfzy36msyFcZ\nEYyxjSSBPXAEARIEXRFUFxpLo73pNMq4nQ2vRFQkY2oNwFDSJW9c9YjvyLhv\nBRsCH26lrw3FHlmu4aA+B0kGE3rlZjJEdtIOAe5lvxt+cD172IYRY+yrzzvv\nLKy9akfjvCJCUs4kl/7PBx5pMSxIdT11divncB3BrWh7FQnBqojjIwfOwzZl\n90QGiZUJVe/kb5OjYvivgy9h5sCqxRVQBNj6r3uK0rC/S6DW1phyJLexz05b\nnDkIJuCjhErSYcwBxos3h0QLVcMij+EOzo20135Q+wcwiUrjNYwVd09peTjL\nwrqeCwss6KxQ7ssmh+441fjBidPTA+opy5XOMIT8651zsE9jreTFIu7Lu1cC\n1oF5NczjFPthutgSjopk7Rm6Do7gu8ThaxcT5A+qmJHi50CJCSgc1BGA14+y\ncX//RdmwAJ47QTnUbu9FtFmGb1M10NnfvJBzkoyW9ZXrxy4cxAil/+IJybBm\noAJfAdPWfiZBNmndCfSxD1iVo4cuKlYzO7aBLmDkBsaHIWfqZTz7aFVc/JtG\n9pRDNxnpJvK0VV9FbxA8n+G8Vic6j7nguQk0Ojlvv9ooXy0ohxPoipusx72l\ncIGa/RwLcIPJMOq14Ap2K4r0Q/0X0UmTNNOeKq/wnZ7HoMAovfroZLhDCqbP\n/ajB\r\n=uKqD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"9eae9fc87437b61f0019ffedccbc3df7c8e02a78","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.1/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.36","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.36"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.36_1571481958264_0.11090243564304991","host":"s3://npm-registry-packages"}},"3.0.0-beta.37":{"name":"@aofl/rotations","version":"3.0.0-beta.37","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.37","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"5fe89d2a91afb64f7414772ab940ecf0b7a04fd8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.37.tgz","fileCount":12,"integrity":"sha512-Imdk8A65tZne2jV+wdJNxS+qudnuR0cj3Nl6ZOQLXgf0l6h6RQaNrunYyTvRzPkR1Eop3hSIjuE1+/OnKHsajw==","signatures":[{"sig":"MEYCIQDKlhAKjJ8Sc139RgGB4UHGcost5COM3vVrwVrVohgO8gIhAMVFfqrBhvUTYecL/MyEl32Kp2DgIMqaYb14bmV9VCEO","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdsT/DCRA9TVsSAnZWagAAcxwP/2ey85yq5uK1TcnL9eIE\nDOs3HgdPCAYPEoTanNFp4ioKRSC2BYDv38yQeYvtSbRV1U2gXWz4ZMhntUGL\nX+OyF27nsjtHr1mE7blErWiA4WyAgVwEox1I05MTg6W6AsyIZHHsT4Xseq7d\nzRCsVpWWLJY2oTpMlEvT4i9ryee2STZV2aN61OWa6KxIsjetke7snS6Zhajc\nh4T/pSSpYADuH5qL5HZAhdbD0pB6ZlJSvgKu0IuKst9sID45zA7PAUEoGeUp\nQjOrPLqYIpaYoNa80GoiYbXJptAJdzCfJwhSfxG1VADTEr1CNVvjTlEplonH\nZU1DoE9OcYj3DiqhHviU59SyczlXiiJciw56rOT6x4YXVEhJ3Q7/Sq6M1H/i\nCXWqYZ28b8CD1BBXHuKc6t2HngwnHaE9op2tH+2+e/f+cHeFlzPmTna9eJX3\n+8U+frzAqVlNbO8n3wtN59a4xnf3tKp93lIkmGE4eGhfXA2D05NEc51IjqVD\ncSXIaPs2BOwn4dmdpbi19zImulXetklrw22UFjyXLiG0qYRnZkFv+z5rneMg\nsb+l1RqkRq6hkNU/U3EQs1r91UrN0h5+0pW8X1yur+w42hiWDeLLJyR9Qv0o\nvjvTAgKQtc7bJR3Kzj6oJJDCV4ej2V+02l/U0iV/C70uc6fy7Vq6knEHXzvn\nVmOw\r\n=JMhT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"90abdfa3f72b91bd0c98e09afbd59c21621fe846","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.17.0/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.37","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.37"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.37_1571897282558_0.5504481255689222","host":"s3://npm-registry-packages"}},"3.0.0-beta.38":{"name":"@aofl/rotations","version":"3.0.0-beta.38","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.38","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"9309a98fb1fada6fd082ab746a6ffc2822273f48","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.38.tgz","fileCount":12,"integrity":"sha512-YYMNQmYmFzf3WjpZDfROKuLrHQINNtwJ9RdCbK9W1VIsmekpWB/w/GXe5GT9mNcqM+uWNAlbLNVe0GV7+8QJXw==","signatures":[{"sig":"MEUCIQC+POB15ETrjMS4pXpKkQ2Ixu/C8128DDU2u3QoGPs11gIgKmaCYI0E4N1vFXeLNR8MgeV+kIkfr9m2wON0qPZ0Mcc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJduhQvCRA9TVsSAnZWagAAbjYP/jZSjQ3D6CixjqzWNMoB\nny5UKmM/yjt2K5CKCPJy3ZngRxTBxbhYwsm74QVP53mMkhz/DnY+uH7YrjJ5\neIl+rp5XBHKi2nc3k0MuFNpLuGW7sDT4f0bvs3uvk5hTjBN564IG4tFnhsL7\ncTK5V6uZaEFW+fg54XK906seS2licTJAJfrtBBMdTNaqFhK5LfOm9iITn8qd\nSsqHC7+lQrjzQtQRw6T2BIuR4SlcEs2eOFAM0EWzlAIpgd67h9Y/BUyMJgyS\nTAFl7zbDMNu4/y9WtMw5dZpJ67o6WrJUDBzjeR5bm5h+3nyCc9504B7MX+fN\n6HSiZG8/dow9Ecs/3uVNtZWuaXTESgNGk+4no5VxCD4oJLBKxZDujxjHuWUs\ndo1aEGXUtVyIP/wy1iVsdwXum3OBKELOS5FHQw5ki2NI1aIzkMdT5EPALnlp\nzc3/FBDYVIhclLVsKXCWLCa8qqBDqPiK7bUymMxuCDJhHncSRYZ9kxRZC550\njQO/xBjHileKSXUzxW7UHkrYkDim/vsqpzRGH7cddOjvOokzr4vV4Dm6yj8P\nL+UV/rsvp/CTdayxJga3HObHuaAdIWeMjEx9sFE+V0hpnYbFee5BiY6ySCcg\nEvCq7zwpfQKE9CYwlJjBpmvucbyexJzMJ7UEQwRDXLjluki3Yc+gdN3IrwyA\nd11Z\r\n=sDFW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"9fff03a99453d439b551d48a69e5d642b9957854","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.17.0/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.38","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.38"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.38_1572475951405_0.7948566368602481","host":"s3://npm-registry-packages"}},"3.0.0-alpha.12":{"name":"@aofl/rotations","version":"3.0.0-alpha.12","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-alpha.12","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"2dbfb43b8ec4d06e7abaaf2ec95f3fbf0903e005","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-alpha.12.tgz","fileCount":6,"integrity":"sha512-rP6VmaDuRQtqr+X2dHzT27ChydAPzjyFxDSxH4omPWAfW2YGDrso6h/NuDonk9rT6DD5q8vAsQe1G5BonYl7PQ==","signatures":[{"sig":"MEQCIFE/4Jlb7ct6ON96YTzJHO3UdAqEc8Wcu0jHMWS+CT5yAiBsHX/BbBpfgmHCt5QI0kDiYbvv4tNZQwlwEgHfCiP25w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26945,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvNfWCRA9TVsSAnZWagAAb1YP+QFRA+BRsoKrF++SDIc/\nJcvZYbvddvAB9n7VkKQmXmEs0tKOYBIQTWrRT2TmAXxq1jJ6j2hGgsOcKZJ8\nDZrJUQIVVGgRFf92djL2Kd1zCdjsnKSsvSlGIS259xmar5VWNyzN6MzGd+4C\nmiex6K7g1FSQVEZ9Z0frtk0muyIqpDgwb3bn7OcN3gxBIWEBabY/OoQsocrB\ntfhzRrsnOjyqPETyePacKPdidOQWm4mT5tQdooecwgwVvSd9TcUKhaDYF62e\nay2MwyWRGwxbvdZZ3eMm2So0dECb++fkDe9ubSw+uklrT5m/2o3tN8aa9Abd\nfpzWD4jsswlDrJfl7GUeNDp/VhwMMzOOxOxUfcolDwBbMVpOrU3x46ZKmw/A\nuWtYNoZ/tDo+pKR3iqgwhZ4cGU9bgePyLDSekll3Q2W7W1ZCLKTTHAx38Zpn\nJEyBDd5YAJ6kkJEs5+7g/qrY9h+BuZ1VH88N7jK2I7P2ZAVf/3UzlS8h1B9d\njD3Lo6PUGJBvsVOv+vhoVfHYRO7iQJHdc0wxp/AT+BO20FDmDxffFo6Wqr0N\n4TsixlglcxxeniyayPiFxo5qrR/nBdJm3z5K+uBg0aIpP1zvmSpgoxrDXFAl\nAbcQmZ5+kdVI1eXbTNy+e7xO/USMLU2PqhOJf2neAcVAy8tMH/kgFsRfVI4i\ngxA3\r\n=Zpi0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/master/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","gitHead":"e76c3cfc8d75ca087492088254c9ef0e4010c0c9","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.3/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","dependencies":{"@aofl/cache-manager":"^3.0.0-alpha.12"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-alpha.12_1572657110435_0.9531246553151795","host":"s3://npm-registry-packages"}},"3.0.0-beta.40":{"name":"@aofl/rotations","version":"3.0.0-beta.40","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.40","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a1dc53298a3fe0460b7624dc8cb691344aacf8f8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.40.tgz","fileCount":12,"integrity":"sha512-/AvHZcmbwsny+judDMbKujjuw8VdSn8XMi/WpsZEZNNHS7n4CgkbZN/F88sPw09JgGmzTKKZgKSQqYVxjCIHvA==","signatures":[{"sig":"MEUCIQD9oORh/b5z1qRlo9njqiuuaM/5xifnaqxemeHGJ9wiDQIgcdVe+0fBYxw+06QbJWA38p/fW+bS1uMd3iGsXvG+8xU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdyeE7CRA9TVsSAnZWagAA1jAP/RVqTlEUquGYjpf0kbBR\nT3riBW4KtDEEa8vgLrEmUvQVTKjdE0QEkEUVD/J9DliQyTV+6V/6MAxuVRKm\n+v1oU0MxBsKVgzhnMobybuKeIg5WTMEhQpiJVe6DNIN1+i8azCj0KQaOzdjZ\ntUu0vRUzsHMWbyj4rBsb/pPsXXoOF8+AoheLk19fsHLmf+bGI/u+sj5MLOEN\nCFib8Q9Q8ThRApTfqRBJ+8JAFUIRgL35CuIsK30RZHFCe30EA96EOQfSLaPk\nI99/8sS1+q83ebojdRLoV1DgCip0yu4xkUW+tLk/EfexRJeHySeVLJcEecc1\ndOODj8AUo9GN80LKo+MywGdy3OQWVUCFUZC1LBlFeLcVrG5/pLc5niQ9ZgnG\nTRQmEAJ/1BLFj8WTa8hzVX1d0ItqsGBjEQQ4Hqu258FkDDgAsGTr7HEpkHTj\nfMG3lC/DPGGVQ0fciv48ZoitPcWszL2odNA3xKIwNoZ5CWrL8bDzBMWmvhmr\nHgjMoa+vRaZS/SqvBd9jQSeZiEl94WLzdq9SP84vby+dWpaTFL8SVzU6MmDo\nXgPNqrYMZyh2mYcyfqKLq0FYNS92GuDpsLCqtLPnzYA6Kj9K9mWS6vQWB+qk\n59ovBMbmN+fTab8Thds15nht5YjkvF9H9eDGS2cRmjzoPsXhaZAXzFPWqwj8\nxEFz\r\n=roDi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"0bfdc05f0d4406219d0b432a55fe53ab1726f4c0","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.3/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.40","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.40"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.40_1573511483352_0.4924461415964294","host":"s3://npm-registry-packages"}},"3.0.0-beta.41":{"name":"@aofl/rotations","version":"3.0.0-beta.41","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.41","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"14969f9c2ceb05146c48ec13a41431f2a959c98f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.41.tgz","fileCount":12,"integrity":"sha512-m/85Xh3bVZPEYJ1KvPfkQ+YKq2vVApiGosrx7g8VXAwRlkGaVaf1WGzXwtfK7kopt39CwNE8d16es6ZYIvsqiw==","signatures":[{"sig":"MEQCICC2dtIWel9yrfbaHDvhdHi3HB0StZ0ceyvj/BbALwDxAiAbLXlFuK7Ec3buGR7FYH3tQx+BcZWFJYgxUswxcR0Dpg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":58191,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdyjtPCRA9TVsSAnZWagAAApQP/jxcpCeD9zGS8qljd+Mr\n9ZGB4qvoV1onheKPkmF6qq5jsP3mLP/AVs/qgxgBAFBGYvx2OE8FiOt3FJxF\nlA2zuDSzBE7iNKbfHewNoaEGOc9+asBXq9TFOqflzZYh0dJiwHJ2zIHXnLET\namUrX0zxSR09UIv8tiju+4hn3/IWMDYsmOsiad64rNCwecFGpiQLfk1WkiUk\n7qKosMRiBCTcPWo0Gb1swohGe7/Fis/hTFTH91zgcN6wBGU+Xjl5GJyjJ4ij\n/clSq0d70xsvIl1Yoqp+K9ekFpH2kzKQYH82z7BSWEqKZmgsS5zwb913VAD9\nCrBfOY8yIuIezjSq/69l+rTtW9sne9a+t20kWz+KyQUYOPRVAEIETsG+azCT\n+IaQb8JhhLoXPGpFU/uEQ50fJ+NNhUMMzrZy8gie1ySWbkr0bVB2JSPRpJE6\nuQH273E4fz4Mzx+3be07vuLtucPKceVjvSjW1NE3Euaob3FERfkUeOszQoci\nUevliNoxTvAz+QFcbUD8zAGiQ9jDZEZ2oOIjBgNBIClC9wSNdrtMqGRUAy8T\nW+6i1GyjnT6a/5YPqYIwuzZWrFN1NbogQZF9Q9xf/RGUGTwgeF5OeBKBV57f\nHiumxZ0uW4LP5bl5QBH8x+bjklQLXLsc/gZD+LP+QL59ez+sRXeP4QiUF6kA\nOR3N\r\n=o5vL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"212bc663acbda22a9679fadb2aa64484e35dc068","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.41","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.41"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.41_1573534543117_0.4926401852288498","host":"s3://npm-registry-packages"}},"3.0.0-beta.42":{"name":"@aofl/rotations","version":"3.0.0-beta.42","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.42","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"5650b54491dab53125319eeba57fc5430d651982","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.42.tgz","fileCount":12,"integrity":"sha512-RqSViusV2pSqEoLfqN7Hrw/Jc83sxKTN0hV+2OxUg9gEIIoJyTV5TC61RqGHh4j9aMlH0XMEDLqMbQ/71tRKyg==","signatures":[{"sig":"MEUCIQCsp5YtWEQyWTMB+qVWZdDEV/U2PQWYt5p7wI6zi1vTjwIgM1IU2hvT9blf3qSDu0XZfps9tVt8tK8GyTDZYRQiC6o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":58215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdykjwCRA9TVsSAnZWagAAc1wP/1Xm6SxXZby1eoTMzdv2\n1hwcnPdtvZIqFI9BTGpz6SYiUavdCvRO4o1DkwjzkqEqV2efmnowxqLVa9jx\n6IOXRJ+rEY9njq2umLUSlGD1kRvzFV+q3OaMR3gnylqXDE9RcXfqRtjqvlqD\n99gqSP1yAUt/F/u31dUgTuNL3h+0wqVt1zeG+mJdSDJ0ohPX4otTsbCIM53J\nvbk9OxHcxrHCo5ELdKAatUQLF31B6K37Drm8JMh/4sCExTCKUHfUzwgkUySw\nk1LywwfjpBOP0KG5gkLNe3RgZYFWOpTJd0IQ9qfpSgeefXuXLXcSCMTP0ZKy\nM+Llci0NNUbepwfvtMo8OAjEY1jMQjvTUbv/Fr9HqsoyDVZa4UVJswMyUF7q\n8Vm+oUTjaG2iIhkhsHDDyI5A2tJbLK0hndZv+UF2ims9PlcEZ0/WmRyBlF3y\n3+JNIQ59UmdzO0fG2vhQMqcK/19tUXODf6rdt5Wu+Sf4DqZHNnr5+tqPfRWD\nlKTjtVl3WzFU6139OiGjrLljah5dCrkEMBmvjRkPSrEsXVev78TjXZ7iD4wN\n3ayTI5dGGBdrvfog//Gw24EKHGLnxJuwVBHiguZchxnzlzPPwQLAMgiWKcF/\nJNKhF7MpK1b3EqNUg8Pm1+pPgRhC4PD8tFrM52BweZc74h5Ih88cCcU835Bt\nW+wA\r\n=2pM6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"699b13b7bf651fa15a25ee2873b72d9fa1ef14a1","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.42","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.42"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.42_1573538032475_0.961040695988804","host":"s3://npm-registry-packages"}},"3.0.0-beta.46":{"name":"@aofl/rotations","version":"3.0.0-beta.46","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.46","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"33ea81b7f9aff7db37f6969d00215cdde5820743","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.46.tgz","fileCount":12,"integrity":"sha512-ZAaFFwkBmQIEuKcIccYe2vLs5R259HM0POvjMXqplEn7luJGQYAEubk4wjkVZCbyrVjXk9h21jyPjm2bydd/kg==","signatures":[{"sig":"MEQCICXSkO48W/aDrvxoOhDi9uQwC/GIfmarBQAwQ5eu/zLVAiBwHiKG9m89ywdnGLneWPKfNkHM+zyeuiJula5MGhM/lg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":58215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzc3/CRA9TVsSAnZWagAAvrUP/0xwAzesJzyQje8rMN5H\nfQmd/iclz2eHBX49GaMKhtqAFuAOBPv+76pFMccOcBEccPbQ6ouHSWyx2p/t\nW9Q2eRo+mJXQDpEX1gC5wPtJMl4VzrLcqXUyY6ablGtzAl6PVEzJMW4eIqTF\nx+cSUIq0DpnVvnjzUxXvrgQY90ZwojxH2YLe0m8OVdbqCi+3T4994pp+ZwLl\n7yqLYF4DDiosthYbjh+0C1s2gOkhvMj8OPwriRIuhRMbYAC6gSyMLDJliqCH\nNWu6wRtyv7OyFsGeZOzl8WSciYFjf7T4jVmtUoEzq23vL3G+semJ2UUni6JH\naNDGDl0WBHUIY3kvt14luJ8t6Xm5mtS8vGFtUesgCVJb2aFega1IEcuK/Vug\n0J+6BR8w0RChPz2xhowaaAUv17kg79ijtPBKe9buXws9DvhLPD43/FBdwogj\nYnFpDE6KYXBR6macJW8BhExAPnAFA5zU85zDCHELj/6Pmgt4DYhwvrDtfUMs\nocgmLZVBDrgJh5pl3CaIItxpWYWpRSIBJuI21HicbEdNYNsznnp84ILnYG1V\nS/OaO9do/R57HmHXkOhPzW9b0gKpStHfMCYjDc4cktkC+hgTzfxUJo5pnthj\nvx97cR8Igjq46iw1OXXEWqFiv6j97/6Pt8dIW/+izcXlotove/0gSWeqjeYl\nqcd6\r\n=l4AZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"4d18597a6b3e63324cc8b2f401d986dff832a62f","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.46","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.46"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.46_1573768703522_0.5756117386310116","host":"s3://npm-registry-packages"}},"3.0.0-beta.47":{"name":"@aofl/rotations","version":"3.0.0-beta.47","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.47","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"80ee5a94d41373f7f2b56621102e50232636b68f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.47.tgz","fileCount":11,"integrity":"sha512-la35WXOwLsTKp3FzKSYeZdsAfgrwH5zvURHM/xgJ7X/7fEuQceQPH5THAdQUallGtle1jMPB8g+xPyGrIc1rnA==","signatures":[{"sig":"MEUCIGtZPazqaN0QFevSrhSg8D4ldEnRDZhD8Cly/7a/xfkGAiEAncqLXZB7Y/9eqHvZgNmjt3Yk7qJEw+O2JdUyXMwdDVE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43098,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzfX2CRA9TVsSAnZWagAA32IP/05P9SVtpYkARhzkbr0g\nLUNRto5xMFx6+b5DCfm6EpbnZKn/wXuPxjLx5MFgjEG3/VIcWFse9BlSJZN/\ncJ6XdwmsDrleFKg0sZkJ9K2tDWjyWS3EWqGk4+kAc098vEQ1D3V8deSD+V5h\ns7KgGCY5NQYrd2VxZTKKPYbpQKFVAQNp6s7d8xMZLNr4g/DjzdslFJirs+dC\n3EF6oi4X77jK+S/lN0E7HkDt20gghwdCfakrnnkpHtOrquz6A3+Q4cscoq5D\nM3ufkEPawCokgvfN/jHCO+/M0JJoy033JCTAciHLJPHUEper2pJJ4YQmeWvU\nkyYEoFSeymULby6eIZ4wJh6I7b9HSanz+t54cgyV5B5eHEN9SshOYExaKPDN\n2JYx3qk1Ixm8aNpa1lTf1mgKWC22GyEZb8ZUDOw/NmEAV9Xwe4cutDDkBCej\n4KE/pMPfk/QsxXNm/lYk0aVRxa05TfShy4p83vJ5OCb8pbKWkcCo68DoYL//\nSIvrzLhCKNsS2hEb8Rb2YissNlPd/gY+5poz3ykN4MCXuqHCOxizI07yf+8a\ngqUcGxM+5mgHx+U65Wd++gwLdUkHf8uYiSoJRyhchxsXSsIDAO/vlbMqmIQT\nv8baGjmlMkj1PXw+KYYjSHZbgHlWaRz3raz0tZIoyQ0h1x5kAhK3/GVvtKjq\nGrkW\r\n=9h9t\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"11344382e361206a6f67f05f4904149ead37c1ed","scripts":{"docs":"jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.46","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.47"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.47_1573778934243_0.6433350356141136","host":"s3://npm-registry-packages"}},"3.0.0-beta.48":{"name":"@aofl/rotations","version":"3.0.0-beta.48","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.48","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"f4348e7018d21abf3017c40668ea057494d87eb4","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.48.tgz","fileCount":11,"integrity":"sha512-MdJgIbtQydP+zbnNkVbWDyL6QY1vlI13heGnYC/Rum0U6ChVtkKMpbPuz84urCq/R8xnWg6YQGNhqanDjpcDhw==","signatures":[{"sig":"MEQCIBUQHNElkb4NSIXNgOJV5zRWUEDfS99ndmi6zBu8VZmbAiBpX9Vzn0WVPGv3P18apbENC36tCqt9bR8Sd/sEPQBtSw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43110,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0IfqCRA9TVsSAnZWagAA6KwP/0qQfBTo40a88dzlwCN2\nYQygcoph25bosb6AW4+SbDKWl9INOS4bpEjI8LpeT03OY1Cej39rAEUuZLoL\nAU38/o81gMwO7WHrgKv/YHu7Aa3ni2x+rimNBJvsv+/c3VGd0aPGwpO8WYmP\npe5wM7KlYyPlmzwWyWaI4srErPrbdV0LH3Bku4WPLKB/TvR930IMHdYv+FKJ\neHWCxhQrYdVDnbdowm1ZBT4bDfGvNtK6ldcXpwMDrLjQKp7e+Z2iKqMWUK8U\nQK/pzk45xRKCZF1AKangB3X7dlR5JdtR7M0F9RyPRtJ+eFQRRVtb6Z2bq1OZ\nNKPFwZY6H7aIss56Noagglynrwl6tBmlmptGtMZvOmT3CHp/Jc/q6JYOVyn8\nBPSEOT9/pvxf6NsFMx5DdJeucCBt16nKjK5vf9dHCPggVrOOquRSz2pM5u02\nIuk3UpsB1XNWBLSxFvDysyUReJJZs4xD0KkmSa7ghsQaz6/4uMVh+T51C22s\nY1o2pFAhGZUm7aRlNovftVtGMiIUW0aDkpt98ftB5Rn2xHOKCumIg6kUJboD\nxu6SsMsstJVhcw8zeCu4ITktP/kViD3qmTOqgSpNblZZ9yEG3saXiy63MEBp\nyMWP2V7UrBF7PYaPQP6NFjrjNU9ktpq6+LtRbSTTB2ODIS4o1MwQCj5RarSj\nCyWN\r\n=LC58\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"d77a51a21b591d1ac0032de47395878116e8566a","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.48","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","jsdoc-babel":"^0.5.0","@aofl/cache-manager":"^3.0.0-beta.48"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.48_1573947369300_0.14638737684800263","host":"s3://npm-registry-packages"}},"3.0.0-beta.49":{"name":"@aofl/rotations","version":"3.0.0-beta.49","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0-beta.49","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"489d146c0bf38ecc15c909ddfc1294322b053cea","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0-beta.49.tgz","fileCount":11,"integrity":"sha512-KiT4T+QLCywHBaa2EJ3W6ClsNedwTKBGZjDuursywBqnFLgYNha8czGmgFmKH7DswbW8JivTHK3gdnaYZqfJKA==","signatures":[{"sig":"MEUCIQCt52WdBVKItVIGPpkxxmSnhGWyzjdF7rlFXwoONFLyRQIgHD5LZNRbwLGBkh7DNI7NglmnD1PYZTMA97XINRfNTFI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0MCaCRA9TVsSAnZWagAAKAkP+QDaHYQhPO12uy8pZ6Hm\nWBpjvhEE3Oh8h9ugl0YdBQYKL1NnXxhDLiuEAKvL/2y84b3RLDzuKsskeB7V\nC7E2pKTWDxD7en7uNvvJII9qI2LPD1EWl99GZQVu7IDqU6inBAuHByNWXioX\nm3QSgROgoSEEtlo8zOOvOiUcPIDiX02MpMn0R/jNM+w4mZ1ewhOPxHdP1SmL\nQQJaFSnV3BGLMhte7cgFhLJEsnHexsN1dfgKDaGwht1l84Poycf4VLs4Yonn\nMlePuIc/ss1Yt0csEFFN/4YBk2o13Kaxdrjlpgo3Y0S8jyVFrBwoBhH//yf1\n6CuHr2qrd2ht0PsresQen4QmEpM0s6fjMp4RHJDQ5J8Pqq45qtbfZJgISNy0\n8apPvjS9Pzpf/gy32uONOycsVp3CsoQ19AjVv1Lev7bStAOzdPRFS16kq1dD\nJym+AlDrk+9qvZ28YhkngNBxd4jN/MtzqSHTzZf09geYWh70XECyue0xaCsP\nfOgoSHSTshLRL1czro1acdlDN+8aD+w5KUjQ/8k8/pmXoS+LD3Wawo406aZv\n76Dg/iW1PjPAE8ZAmQ3Jk5QQ5GuvgcnNjHp9GYQtz7K5WLEhjhAbuNWQXeKG\ng6Ca66hqBCGjRfH2dv8D3r+qi2ygFdLvFhvRXYt4WixKRD4mj8YS8q5u1cua\niIiJ\r\n=8U9G\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"a2642ff8dd100adac8db3d609f63e2bc6a2247f5","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0-beta.49","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.0.0-beta.49"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0-beta.49_1573961881836_0.6319329628648791","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"@aofl/rotations","version":"3.0.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.0.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d5e2dc0b3e2faf2212cf708309f7b52581b9f98f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.0.0.tgz","fileCount":11,"integrity":"sha512-k08cO+NRN8fbq3Dh5j91ZFNoqRvJf+CHWwwU2w+7I+JQAvvUaLLLMOa7wriU1GbWFtzeooE8BlWsebB09wnXuw==","signatures":[{"sig":"MEQCIGEaS0nd3pdvGKbxkgs0plnEVDq+TUL69SNUFRfIWV3GAiAdyd732JFFQs7GU9mZmBj8MUGNaVx8lywPht1XafH95A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd0PFnCRA9TVsSAnZWagAAYuMQAJFZJwRG6ygJVFoWjqiU\npsm0wt+8rBKl0AufygMKJsVLGGbN6VUmCUD65LdmzXKreQkevssolYgv/srS\nlaiSXTPTttBdoBc/kMRMk9vy4cOQ9Ahn6f60MUv/WVOwsvr7U89k78v6339Q\n5E0uye2SLd6Wkire3M2snSgdBHd2ljJvgLFT3g3QF00i0KgEtYKuh8ekpEEu\nTZ8Xe4jahNEgJuorllFBHupgVwC1q0p6y4WtdLU4pp7f/TTKM670xLmE2w9J\nAF+f2jUyBDez1BtWaEnZceF9PjzbuzbjPo/yYaYLTENu+dTWPRuT2TfM2AxX\nvDHd5r1lpK8PkKyeMiKnaIAUeJFSZYBj8xnq6QCUUQtL9A0PTpCk5XywOlI7\n89Ov3etCNNDYovLa0I3yrwiIpyFkWRm2ZCTcM2AjpQ6BHXPdo6KCb/MatHf+\nQgZMCxDR9scvvmDKBvmzGJW22fozr6UArFE0yoxDBDzoOiapJ99s5+kUQvjo\nz/s8Q6G16pW9pd/eWpUs0uP8KMjVUirKsq0xpBVATco3WciRyfxpc1jczOYp\n7r2WgGUCCkN7upOtdSESyanrwjq0e2dphH2Y5hv5kccSPLflQQgi7/lFSikx\nnj/uBbJfvpv6tO26ftaRoPQlhdqjeMAPWMn3OpFkUzJOujvq/IPHET7ovMte\n4UMC\r\n=6iUI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"bd783440a25a2c579fbb506b92d90bf4fb7e0289","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.3+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.3","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.0.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.0.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.0.0_1573974375393_0.8922088774988035","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"@aofl/rotations","version":"3.1.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.1.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"24bb314e52724923a4d3e6c16a448e0669df8377","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.1.0.tgz","fileCount":11,"integrity":"sha512-BNi8Ic+lDqydZTmjoYdgompHqUhS42LENa5Y5Q+tTNuz51Akw4I2qB4ZWpuQFj/s6jHU9LROUsE14/guHXfXHQ==","signatures":[{"sig":"MEQCIHvbMXqs4TJbPtO6Saor2SB8r/C/u8SC8DGgFtnDaiVrAiAwTu2L+D/k20rwA3XoCyyI8LjEwm2zfNe4Ud/XOfVbvg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd11XaCRA9TVsSAnZWagAA8V4P/1jBE2XjNfA1C0FZWTqr\ncWPOUa7pioi61WHlBqHWhWNpwBda3RlaZ3bTP0ahGydIsGDKVPWSBVwP4S6p\n3Vx0+F+PGTkaAI61BcJxex9MJvfwNHOj519qsAxkzWJ/xMNgV590eavx5qeQ\n05CQS556yeStp6zi2V4VSHrusOUvyi69/o1/BLYzQmXTfckI+tazEjPlvmC6\nTAEjn3mlSh5JJ4tjcpr7AqmQIHZVqUZslOwNymBUS5o8BGbTDVeHSBFW8ztF\nH3sCnHmbNiqwQCvWcm2hDvGWVlRIEmAws08ZUDExfHEztmq7Ji5URoZmMLHQ\nGbJS0Ir20/MSJ7wTl2/jj3UVAQbvvIjbxPEvXnq+KkxAh7MwXxxaBvMEchSI\nrtPv/5Qt/kBmGRIAuw0mFbWwrXF9PAm/dq/zrSxpc5m5OHn1vIYIci6oHCEx\npjiap/uxswapiGz6rebKLoUe/eJSyhX/sYsKwB9NRNV/6IXm64pckrrDoxAc\nnvk/d++4PlZF7Kyij+5iWuSGtxMTImIV0GJQaogxAm7TiAy9CQYgZznCT/Jx\nmWfYRYncXWN754GrtZS5ZaDQx/IchGicoeAovszy8OLozmjF/kS3O0rYmaG+\nv6VcM3c8fEO1DMyLcHewz+KoUH32qOE2jdsqk4gjI5teQDBAbfV3NXl/LjyK\nmbIo\r\n=uX60\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"cb7c610ce117e6fe41168dcb3e2758d12900b277","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.1.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.1.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.1.0_1574393305626_0.40352819882653734","host":"s3://npm-registry-packages"}},"3.2.0":{"name":"@aofl/rotations","version":"3.2.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.2.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"066de74c8bb2646edad68413fc9249177d101b29","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.2.0.tgz","fileCount":11,"integrity":"sha512-ikY3MsRB2QagZsH51XfSDVylfCWQ0Rewdkr1rvlQHITCC/icV+4wAela9gLHeSj/3vjB3/I/mMvpf0eqEA4eJw==","signatures":[{"sig":"MEQCIFNKPogT6ZK+kG+o09mGjVsD4ktORvsY24WmXlUpF/cGAiBio/LUH+vhMIo4E5Tl5aE9hoUWx6IGmQhjHSqCAaXd6w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2jKlCRA9TVsSAnZWagAAnwsP/iHI0zX+yQKG1VA+ozs5\nBeKIWtzSNtCpTrG6KfrRzt96YRXSVWi9e0a+7tHv1yfWKS+aM7ZjKZC96EBI\nN439BAa/IVVh/zCa0v2tX0wRFNdOM49PP3wuxx5p+tl2uODb6BA0icB7cWsX\nTxvufEI5uQ7/IyvRchZlUbgzNNAR5dgnn+Sd03zN+9OQx1qr6Fkqh8mmmMzP\ns4BwJZ71zp6GLf9hLDPyaYzzdZJAr1j0lzUn52F0ykZiR5Vjhag/teWtnjkH\n8vqILi87zGUdJ+8Kucmw3j/d6uJKcibsuiR6gytLcg7mIHncft41JztE0M9Z\ncC1iY+85cPCfR1MJMfitO0LGP+F1ZWPb2EcnBOWVuOJMVAEQvATVz9jPBr5T\nTjhLYYYjq7e6i0V4cwHhgFlHM0r7uzsp+5W/9/5Z4/mIibZ8R/g5VoMaHxyT\nxUwZZzt0dSB6qRie0fBoL/y4pwrK88xLfgHo83dkxQhhhWPLlXPDdPkaOeVY\nd8kQeLoYnZQ3puxwNRHw77/dkcN7Rp4cnxRM0+ruhItTBd8341oUigfMd5fd\n2ZAOnYkvr5dZHlDbmPRLS99LSS2APneU/xdpLNNcy4yOxh1ouK3WVJ0a/VUQ\nbZUWcK7uQUP/pJ2VjnMtl+XWz7PFp1eE/99cA9u+y/Awr3cZCVy90KL4NdGq\n90I2\r\n=RuyD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"8275111725390a8f797467a12e045c905a78623b","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.2.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.2.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.2.0_1574580900933_0.7448914902830408","host":"s3://npm-registry-packages"}},"3.2.1":{"name":"@aofl/rotations","version":"3.2.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.2.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a45055c2d2d0e51d4b9bd0b3a41bcc578fbd3688","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.2.1.tgz","fileCount":11,"integrity":"sha512-NgUchTEGBkVobJNS2QCYulXMlkYtCsIJtN4Spyzx01AGSTMnFTa301U3FwVYchmeUkCS79LzrK4SHllHWeTORw==","signatures":[{"sig":"MEYCIQCqkaUf5nlQqZBs0QSUGDeaWdks2rsAkfOS757MQewwDwIhAMgfFDE90sqoWLjUF2+4EXPOoB3oPseAnENDsCNdwOUb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2jlsCRA9TVsSAnZWagAAl60P/2ArgGA6BlVLUumr9Vjc\n5/nfumpt+dkjrDDvl4dGRWK8UT56rZ3eOzbXmA/xy1Nj4/A+PTj+YugbODuG\nP+uHEDsvdO1unJDvCuwGLGBmDc3biOxvgiWomXhPjn+rVf6WYi0ZhhtettS/\nSI4vFcaUMsv+iOw74iO0F74HiIPYc6Zo8xAj7spTYHIV6cHPr3g8nAgLd3MZ\nXRModB9NGOQlNa/yCdRjQsGOB5BlNUX1bvU0L+nH8HINWmjY1EZGG6ls2kuW\ndgDS46qxV/71ixzxIvQB+F0sBerIZVHGcH/rJ6IucBGyqurGg11fYoBaM5bh\npeto91quqlqyOtu+gwf2LOQOj9T3MvD/95VeyRByaoji+AJ/Sc6up2qnnRRT\nerDV4fIWOfjwS8jk4/sCGuw/VOkrGl45/+Q/XnqPn+2ifGuQZ6mYSdsWfe7Y\ncsOD+c8wttkJ+WvWToafAgoBH0dnhMYBE6wOjEv+XGgJxvYgUbqJf5fNEzKn\n5AQHVZqV/AJHYauoIk30MFRq2aYcI1ZN1k2rlNSpqMR1Z7xmYJULK+5KgT4J\nO7ETkhR/bEAPod4EYuoJL7myv9fUhDmfJh57Pl5iwJEID1eLC1P8+yBsVXR4\nW4lwgrI0y/DziN33G7+Gd8CqKnwoxNL4I+D7ve4MKMeVhVutqFrdqQBjonxE\nCQPF\r\n=pP+l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"a3a91753b98e4423d9fa5bc05d8cc8f8754fd040","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.18.4/node@v10.16.0+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"10.16.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.2.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.2.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.2.1_1574582635590_0.6622474172840749","host":"s3://npm-registry-packages"}},"3.2.2-alpha.2":{"name":"@aofl/rotations","version":"3.2.2-alpha.2","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.2.2-alpha.2","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"19b8dbcfa8e8d89c4a43646e8035e30aa2318154","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.2.2-alpha.2.tgz","fileCount":10,"integrity":"sha512-lbcmgVUvm30AFaKrmNOyti7GpveMFgiBzbD9eERv9pzBIq2kg364XVxKgEX/1mL8Skia7XjlQui5qwvgmFwxhA==","signatures":[{"sig":"MEUCIB53wgS5H7XA1BDLYLHcELusxtXiS9SOs5RBrjWbo/1+AiEA0CJR9a6urLKrT/WxXaj1FtEEjJvECcly1qCZuRegQLY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43077,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHiQ7CRA9TVsSAnZWagAAWQ4P/Rq0JbS570ZJd1+hqMoo\nV7RfMbgObszv+IYq7/KzIzfRBRXQnHo9ogr2Zt3U7XrvZPz5AqE/MeR2Mz4R\n/60i9Wuv6v3coHqzNTKKGEdrfPSY1hlKYkwNOONfhYUueU7TY4rzSh74Hswa\ny9P7K33Lw9N5CGbv/d2+k/gGxBPs8EklYXAaREdrAuGocPK7bjlZhoDRLOmh\nTFjKJcBtqu/K5/S/ldPgz6bTEf1FJe5DdWvRIGFlYWJB4ifk0Mj+OhI245jH\nvMZmENcDe5wLqRJk0/y4S7PUs7qtBBQCK2N06+lECfm6MRpUDR2oeV+mrs2N\nCb24fpugun6P7F+so2g7YWWFZiWz0GyVEiXjpV0VLY42RztlSvOMgt5f/IAI\nEjZ3rGe0rb+FPey4FOOd033tUvHNxVwrfi4GaDGazNzodstcpmCeMriSErqc\n988zPccmE4SOuKabhEupJj6z9M7cvzmbxJ6F7AjGO3VImVKZN7HMkmOykLU7\nwlWsHiel6icCThYmGw5SxNxRgQdjWg2QwiwT+uvRc16uSoWtzadR1rjnHrjW\nd/gOqBcvRBdhnSTRXHRV9GwGBbuP1D6D3iVguaCkF8EJhICdypWcli0rGI1F\nH2MxD4wfiVPhgIRi+aE3zRbHEZY42YK+Kl9VqZie5UXHtGNy/FVuQuudSB2b\nIYgo\r\n=o9MR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.2.2-alpha.2","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.2.2-alpha.2"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.2.2-alpha.2_1579033658720_0.7860761108711276","host":"s3://npm-registry-packages"}},"3.2.2-alpha.3":{"name":"@aofl/rotations","version":"3.2.2-alpha.3","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.2.2-alpha.3","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"04e661f1ee7a1ec837d77e6cc9fa9b7e6a7838fd","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.2.2-alpha.3.tgz","fileCount":10,"integrity":"sha512-TH/t0sfuOnWYkYPUWRa16tMwmVxUzWzjJfRydoIjcH5GeBL/XqzeeUpTg8aQ5eUHHbpogw/qe4qBrv+Va4veMA==","signatures":[{"sig":"MEQCIHFWZch8LdViwd1cGiTDyz3uX9LoFBW00pnw+2CEwSlEAiBH9Rsy9utRzyu2eXMgRRGzP2w8Tdjt9Drf4ZjzBpFriQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43077,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHi7aCRA9TVsSAnZWagAAbK8P/1QTmJO1vRAzns3yPAN0\nMsFs7AQ2TAk6LmnbqBZj6kQpvqUJM2LK5BS9OvGUbBoxFxwWRO+V6W6kkhko\njl+Brb+h0F6PxIr6EbzNUCsjU0YGvmhURUChOtGx/xmkrMoG7FBVadjbUOgQ\n0neeiIgW5AgMUoYX8bUe2kWXt3d4dVig45YGKEH2DC25XwlMhv34xdR7pY5Y\n0XB7K5rJsN8Ix+Qglpw31Ao8mft4KyO8LBiA5NyplDfd7OfaVBktWNCs+Pd8\nCS3v6BvVJnHrsh9GmRtv+A8vyT/aibjGcvfTPEu9Rr1VI/BEN3c3b0prIVe6\nBzh1X6i916ocFPRJK6+SzdVu3CWMmpShc3+RT+c/ClzCLT0OzumhZJP9ymLv\nijcpN6ogEQD3jxWPT86o/ld55+QFlKa+DmWGhzQe5CWzJ1JFaadx+w9w3lZZ\nrLyRQ2xIZmbJPnOAe49ns3UDLPfiOf4p1zqKFeB+RPDnft4UN2abfzfjjUym\nYy82AT1LPadaYy9FIx2xRcpFrFF8sjmO8SBzqsYqE+hD58VluXGVx/MR51zy\ntM8pnvOhfRVzJ/FJr4OC6u7JmFpti0EyFSG4ZzYQGvCDcq4rmggCaOoFwg0a\nPfksuFEhdxPpk5zaSdF+/BwmehT4pv6UejZeqpD7DvEvOmDN5dD3Ul4j+f5d\nURId\r\n=sXeC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.2.2-alpha.3","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.2.2-alpha.3"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.2.2-alpha.3_1579036378597_0.12080363511959247","host":"s3://npm-registry-packages"}},"3.3.0":{"name":"@aofl/rotations","version":"3.3.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.3.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d43b996d225bc72413a87799b82ff38cc7d2fa52","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.3.0.tgz","fileCount":10,"integrity":"sha512-hzs93d2B8xse+7QQI7pUdggR7Hn3L+xyh4mZxJCcRqBBGRLQ0UaV6wHSIhlrVTMgHZOJAHvP5cUI6LcZpL53Ig==","signatures":[{"sig":"MEUCIQCEQHi1l/Se+UTpyLtZmjSDKPwSDo4M0oZzXtpzaoa4RQIgZfbOsT7nY8LngbiFLyittYk3tbBiIBTRHSN8psADtuc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43053,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKNtICRA9TVsSAnZWagAA8ugP/iU0Ol1keSZQJHgFv13C\nYjes6LiEWQ1kTNxiXoVx0t0PfQHoA70Kx3mVK8RAvMosrkdeHYI4NL7sEugE\nEiR1KBJYsFcFpL4Onn1ZK7xOKZFbqRnDt7jfg4jzjXfG7K/VhUNRTU64mTdL\ng+5LWoup12222CQ8N+I45fbsnyiCMOKzgy/T88CC13sQXUvf8yZXg4XI9Cc9\ndYo3basdivpYN5alIC6JoSvDcbsFGRtkIny9j85zecagJLvoGWf92n2pV96Z\nTViqQULcMS6mQYdz7lQ5/JOEat5WwDYFRjJqx+rFbGvYgexG6nebhZDijaeg\nEUPAROM61n6u4KwuEammD1QAnkmUEjnl8V3wyIoz9lMTl8Oo9YP8A/COB03n\nlTovPEkXA/DTwRXPWmJ41d/6QzS2b8eIpGM2Dq1jq14N19XObg+mQyuoERJp\nQUHydWrzPgjegxoMogKgT48wcDgUV/pDRLTVK+zXrXxGeIe6r/T8wKMqsn4D\nWEKIMXsowzFarxTrYAZNbV7hgeZxHloq+H0yb3pinj1ftIn+9gcbUAr+gc7u\nrBhkr2P1biMSt9zI7NWq1LOtxq3dEW/IjORUi3951AzBpLILnGtlU7vti6CE\nvUEIDi8473pQH51ZaVKamXxvmbwaw0ZsGtLL9K9IfinPcmAS4oy1GSY9LIlT\nzXP1\r\n=7NbK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.3.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.3.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.3.0_1579735879776_0.1029606676472723","host":"s3://npm-registry-packages"}},"3.5.0-beta.1":{"name":"@aofl/rotations","version":"3.5.0-beta.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"dfae1436c2670b34f63b3c5ddd5daf90d3141f21","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.1.tgz","fileCount":7,"integrity":"sha512-onolCXav1CN/k1zGsPZ2gyiL8oc46AhX0yBceWBcNdt5MQfDoJAAfpSDJNA2RqyUi+KOQ1GDLPJTag0jAgB5WA==","signatures":[{"sig":"MEQCIEqhh6SPSnL8r8Rv9dpdHFnQpVUkYSemoJTF8mpmiUmGAiBAEYrasvW3koDtoeRrqhIOlr/vpNejS58ODzunQPoR0Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUbixCRA9TVsSAnZWagAANK4P/iPAALlBaOpEBVeBfbli\nc0Iwmcyse2t2mNRVav3zDf2xFue5MmDocsj6he6wpaYEYuNyiAity38UcIja\n5RCfCK4Pp3OtdXUiT4Ea1d9MzFV80P+XzCf9WaS9VfC73EySQv19SsQUCNYZ\nAdk/t+gTRjYPtAWuk2ctmxnk8RvLUFGu6iACt85dmqRRGHlAT1SdcjA66L2b\noIICrUjYiVmKzQqPsVDQBonSoHgWfhPl3/Ygvv5qOn2OgbThM4h68Ae/wK93\nXYmj/aURxaEpnNqIkL3z7WL/e/KMi1ykAe1XI14GoMHUFphqL3A317/DCef8\nty9edw6XWzdPHTfgetXRHtNNXTzusN81Y8jLq4f5phmnT9vNhEvxU3kwiPw3\nDHxsFOUr+ayh/Am/FT6dTLDWINuC6NccXIlmAvq8mAeVMsKVL7BGh07Qg5Yd\nTyA9r17GY0lXo8krEkeomyRTMQRLg65/ctJGcaC1YNxCPnNKCjNk7eWZ/Pm6\nxF8APftUD425x6yc6+fNA5RTE+1/sJPZp6lqR1Dra5syjrDcAL/f4R7J5vAR\nmqmmEpAYUePSuOcWS6w+oVPr9ywDt8P3lm60ZpuUOAU9v1OJXCA7p2VPHzyN\ntpgc6Os+dCVjDs4X0UiGCZR+HKCTKjjkh5jlo+z40CNERqrMX8yPBPgSvliK\n6tdf\r\n=L8CW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.1_1582414000896_0.9883474202697633","host":"s3://npm-registry-packages"}},"3.5.0-beta.2":{"name":"@aofl/rotations","version":"3.5.0-beta.2","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.2","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"e015daefc14f743edff4a5fbf17eff6b1fa571eb","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.2.tgz","fileCount":7,"integrity":"sha512-dF2LDkTt8PnZn9eTKmXS1QBAl5jJNn8GGurMbmQM9W1FeGPRWY95RSdrKiEq2UmNbBj3weqKwSxLVp6V1D8urA==","signatures":[{"sig":"MEUCIBIvNUK02fvPCn+vgKMSzx25ADpM4NY6gEexAUFCxVB3AiEA46VxVnYh42usPYQTRlbhHTA1OArTWVbFriWFPr/eq9g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUb7KCRA9TVsSAnZWagAAjUsP/27KXDbC+muhJZcZCmrz\nvQZXDgWX1NLjereLTCzeOeC7gtY9gJQJW+uPIK7Rb6MGaxFQ3A0tMrzfiux8\ncg4+H0+NgyOZD5sxDoRFXbt2QCELZYRDGrx8r4B1l/oStF4FzfAELLhbVlxe\n8QtozpXdKKJLck1Mw+4qO0SZDnBOhTBBxIuTqemPUraFYRHIKJgZMBShxGBF\n0YyOQ9OCq9omW6wJqRR0g1x70rGpUZii2qi/ex/f0XcWSqg+pHPABmiEwQPz\n168HVkPhornhcp+5tL4OVFZv6uYlwIEuC4HM9nJZ2QTJHhZlgMCswGKsrUht\nQ5d2sF4Fll4PV1VSQ9fnr6slYTJ05wOaP1eDyjBcgUa0HJm908pFrPPKnor3\nBitBiqkKfROFX7NeXtiFaP0Fl4ZXKXareCuhdwmiZgwGFVt6/wrsa9GVnIKz\npplTlm0NGU/wG9/hYjXevXYFDjLbePM4Cdcn0yuC0AuGaeFITmIXWAcQmCPr\nbVjBzQ5rGV6A4rsCEd0R54XL84wpbVoerDY9VQ7FxBmbc57AiJhFbpO7v4/V\nP8S0+EkGZT4NjK3KDJesQJ31Z81hxkZGSZqFwozjZxhwc0U4mrj1DuYyh4G0\nsNjYFvtBbzFJ6tEKxyAe7rAr8VnXGpC3xtG/8Fla8rqJWnQbqW6lDX97zbtb\nPwDy\r\n=eYF6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.2","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.2"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.2_1582415562176_0.5708777879522378","host":"s3://npm-registry-packages"}},"3.5.0-beta.3":{"name":"@aofl/rotations","version":"3.5.0-beta.3","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.3","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"eeed2f0765cf485c3b7832a2ebd9038cbf8c82f3","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.3.tgz","fileCount":7,"integrity":"sha512-veX3uhGpf2JX5dkZM9Q5+cyulizCTkkj3iC1EfA7NR9zvFrs7xS6WT2XBGaOolmDqRblWIhKPTQ6bVcZ6s/Ixg==","signatures":[{"sig":"MEQCIGmmXu+fRIQG+7/HMydo2BP9h2D0JjAW/l17EyM/tBHFAiAerUPwuYadzBHmUwv4fIQfrYkijawdbeyU4r5PCHyt5g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUcI+CRA9TVsSAnZWagAAzTsP/RujTZQAAmQz1Y3wKolr\nX4aSmmLpPNq7afiRD0kgcERVfSb7O76GzudJ3ogeqtXT4KjUCmtZVRjy6N/b\nzF+VKjY6wo24wSBUh9hche0x1hxbauvgWmsPk/PjuvAyJCDWjGRIbvJ3euET\njWpZWrHsWa3QKz+FPmDYQedWLeuGlnJPE4qi0eVMdtAHs2EmvILp9cxD7llM\n+nRCZ31cDMTXIGtIO5oZOVesDm6bH/Duv93EfHUn1h9n2IEmybBVgis95FZ8\nz735tOb5SJgDQBOG4AcV6xmE0u5WFPuX/ymTQwSaANmagBUbPbiHUJhfVg1R\ndmNPGa1L/0fGnciiAQxcyFWQMLYf5nli2qcVjBsPfcHXo8/pPjsr9Jke36vU\nCkr4mlF6lWA67XJ2SwW72RsLHmu/XgCtEKQWkLJrxcvRx84tZXz2Bwqa1Oo7\n9z9qxhexke+IxXuIPp3B7+/QsLjJ85fzFxwbz6iLdVVJZGTSAaPSUra/rmjD\n+4qoUUUS9AVdL2l1Clkeus2CBfm3VW0A5oP6hBWvTxZnGDQ6xi+4bv3IUb/T\nquOOcn8iKZeNnvGJAhcRVJe+SWT3kn4gbFhHzRav1EwG744K3lXg1p6PwLn2\n34m5sj7Qo9lFmtTfclWvR65VPFZ9GkuO5QymJOcN4K3ocs0wo3ov5OYb702f\n47fc\r\n=JbPn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.3","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.3"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.3_1582416445807_0.8683266388595305","host":"s3://npm-registry-packages"}},"3.5.0-beta.4":{"name":"@aofl/rotations","version":"3.5.0-beta.4","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.4","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"b693ad04ccd2e138bc5a1b193568564ecd6afbe3","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.4.tgz","fileCount":7,"integrity":"sha512-5I3697F9f9+8FhjHpYkCY4ry4P3Fjc5z7Cs1Cl/r1EirOHjZAGBJj7OPaLTjpZc0D7PPp8M8sTb5FHLDkZNO9g==","signatures":[{"sig":"MEUCIEg0d1k1QI1P+n1ARTSdud3AL9dlB8PPGMAdAKxPFilAAiEA4YR3i4oRd/zLrtKfZ6u3NdZAsHUrrqVt5w/o7NMKQX0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUdwLCRA9TVsSAnZWagAAB8EQAKGy48SdFruVRvJkW42b\nFEzI3Xk+QoNrnEv2S3YEZWeAWbJRN8Ajsg9rQHhm+S1jO4+Cv6CbbRcoH6lI\nXFlyWd8pJQWE4fdXIahoOaaCnFpoidDEbPoZjfQCoD5YhjRuDk/XA8xZZBA6\nCMFi0rayvedDzG0H50D2rIJkbVq1dW2dEX9MX9jBVkRkQsbpruLcjw+5N+M/\nxUwG/I7DExqtOVPFXnhzBAQ5RNCs7RFTy+pzXeiAuThx+pcGTJFFd80asyZ6\nIw9OMajbXjcRdPE5wKiDxYHo7qVfbdgFMSpZ3yMyHx7Hvr3Oqwy8FBZk0U5V\nX5gkq2ms9Bfbr1FWVAIBbQ2i9/434oqSjRpJd4nxA+w01t/TKKpEyws7dH2Y\nDYQQRQx+cm2ZYzhh+S/EOjsGw3hfD+5d7kx/uoyBIxw6HBV6YvanHmsj9F7J\nzU+VeFnJIPYfpnhbEqO2x35q/x2O18MC7Xqzp5+COxeTqiqrpatMiFLhsvb1\nQ0LV5RxETMqLncm4VhPF+W6X40vO2dJR8sD+8SCd9+E8eNa6JHKtcNNrOgUl\n3NQQKTj6dV82hGGDR+dDKDYR3+MfDsg99Hk+eJXkUQCcI+rgMEwUEWr88O0z\n55EKhrxb7lgLUzyzJMdWyVfhayNuRxFCEodZxZuNdjg7QLl0JC8qo+OfHwg/\nl8w5\r\n=Mg+7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.4","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.4"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.4_1582423050559_0.20894816533793414","host":"s3://npm-registry-packages"}},"3.5.0-beta.5":{"name":"@aofl/rotations","version":"3.5.0-beta.5","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.5","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"7ed78918594fc970eec3d2fe201eeaa406fe9855","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.5.tgz","fileCount":7,"integrity":"sha512-/JMka7KPLQDeO5NL5lXxahYBgfZo05kKvBUUhoNd5FyTeShKYa0KjYgfkDABK9qGKtMb/HecshXo81NiMShbqA==","signatures":[{"sig":"MEUCIQDGG7OqW9dqvGnMP113RNf57WGWZrKRvcTdirr2P4RIjgIgMHwDhRRtZElycbkYNRQEbz1FK/C1IKPbisrajr+Xm8I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUe0QCRA9TVsSAnZWagAAVgYP/2ZlgUK33uA5hhzRKlq0\nmR2WUR754l35r3sEnaE/ncOTdI5CmNgcsVk7nEUH8GgT8mqJVaWT2J3qAxuS\nu2l8x7XbYP2yPZkOEysqe7/HMILsSvI0gcLEDsSvqemNJ/vao6mrDdPqR8bv\nr4smCWJDxHO0gSo7wHsf9yJz7LJBv0h/5zwSdEnce37jr45Imy2efW7QYC3V\nfJmUvex7I8YXWkY3ZEd6e9mmw6NaV9M1Zznyri74ynjAdTMOKLt72H4p1PEx\n4w01Tj6tovioVJmt5L5TYFgsr05eR0vkXygr7l0o7H6Sz4nRDsQsN08hieuW\nsa236LaMPYyxIJ0lptXUV3k2HA61uiH09LN+JZ2HUk5u9DMdibfbc6Z0/ZHz\nzRmVMO+svH6qtOgLtDs835rrx33tBjjjJODRZr+3BEa3A6reFs4XJru232T8\nZn2eSV8qyXsAGL2RRKu9lDh3PQ9Kcp4Lk52t+mAYYPNkOfju6kR81sghqUwY\nYXZpoylgNdnqrWrCrOKANKFwBNNpMolKOdJd5+sfggygmblARSynu7NSc9bO\nEeiTbegbpCb5EdwN3oS5y7Q08fFmrDEfCBpoAKoklAxoVI2vpftRwgL7mddO\niuTvsACZ+weyt4FZPtrjD3d+HzEVzT5v0no9Kor3zyL0cpU2rI4+Sz1PeQ5X\nW0Q1\r\n=/Ld2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.5","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.5"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.5_1582427408038_0.22991569352960406","host":"s3://npm-registry-packages"}},"3.5.0-beta.6":{"name":"@aofl/rotations","version":"3.5.0-beta.6","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.6","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"7ba4fd68648e64bfec0747ff05bdea191367fcc5","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.6.tgz","fileCount":7,"integrity":"sha512-iarMtY0tZyM052/mEwGjHOMFLB4T+nw/cYSQlL55VjLv5+/jhPZ8AdKO/eVcqaCuduPDD8oZY9KLqJ3oPiqxrw==","signatures":[{"sig":"MEYCIQD4ZRL5QYl18+ngx0aWwewIqz/CyxtUBbvOK4bUWAqFSQIhAOPx1ku/Bd1eWO85cIZ3epdotNAoBbFPvjqWxoipMmSt","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUe7dCRA9TVsSAnZWagAAszwP/2AAePxmbjcTIWbLwA5u\nNUb5NjmgbOeWW27molnFF30Xk3/aU55pQq2lanwleS68YTB2SpI68WJ8Ip9w\n2MoV5YG+wYPiQNSTdD4lyuhA34Ghu2pp+U5LBMX7DmCh6RfElnIGj84N8Rqt\nm9GuOZD3RRSeYrEDtC5Tp6YiZwA0mkMo6BQLuKgKUDvV/ik9w8JWREHoCR/l\nEtoi66KKhK+KfT0B1VnUNuchC0Q7UShhzbtCs1MOfn/IhsUEw8XgC6/ozdlH\nkyeToLEu6SHclC8ioNr6Eqko2JaaKco4kQJbMNYrrayzLpcDxGrrUGZ265PH\nCseeiblqEgsmlqR7vrx9s2Td2zuuP91k/VjQC88F5ZnpbLue6vNhEEzHHRMB\nY/MqPcUU8UduJkRKaGA99q309efbbY0DAf1N4I3EpjwxlJDnjqmlnT40YFEF\nJhljiAwQK7VdroFxHn0/eKfNA9tAMob5PgEqIcclaWhPKZ9tEM1W/MA6bc8K\n7Q+9OQtygDZieIa1Yl8MGIS6mZpRclXj93IKnK42BQvFFFJWgFUBJ/TlEVyD\nGbUnmlCV8q2DnVBW42vdtLHQv82p+pA+OcAmd2mCE1BDAGsDaJV6E6vkVlnP\n08znqH2AjxwLvu4vKtphPF6GPS/xFpbgEhvw+W+9lg+duRrTx6vXgl8KDmxP\nuJtM\r\n=fXdH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.6","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.6"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.6_1582427869183_0.02105605854157999","host":"s3://npm-registry-packages"}},"3.5.0-beta.7":{"name":"@aofl/rotations","version":"3.5.0-beta.7","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.7","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"24367d5d077449996ac7bc342ec967f7ef317b96","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.7.tgz","fileCount":7,"integrity":"sha512-opKWPR1ZnfHDENj4w5An2G+cUTcyyWZMkCEBcpe5D8zzP44Vn+M7ekWp73EqnftcNNuI+hnPh585jrMqNo/0SQ==","signatures":[{"sig":"MEYCIQC/4EuXJbsAknMOjejmFkPO3Oh+MCydaV9eclRqjV11oQIhAJ43dQ8I+gXpLBIPYD1+He7ThK/WN7CMfQoF9RAG9IjF","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUgghCRA9TVsSAnZWagAAVoMP/AkgJdakMfiGN002JN0V\nusMVIY5NYHMxWtK8f2UI8TRBNzVROFk3pV9TxVqZRNPShXTq2VqI9ibMrIpB\n/trIpBWeSJ5Xk3VKLy4CNfuPzmzdgYhHuwQM+gEtg4NTGh9cdYQ9YWnfST+X\n8zFvUE6kKfLoMHvB0ZipAj5Dv0vaiPMgJ34a4ossls1UbWCIxi+kf5nacvQq\nKdk3NSY0f5CqpS6q28EwnJK0LxVTqTFIHFy8Fb3CiHx6CEKJvd8wNeOjLqeG\nyd0JSjULP38bmir/TExrddVQc85Ek/qHQFRZwjUPRbKgET39kbzC63eH0aDB\nNWtKEqunQc70pzY1W3Z77EweGZeI09wFl6BmfzeCvJVUpbKzOtlPdLJ4fDD5\nuLiBQl1xrfyIOx82M1K15UR8jAj8hsDZ1+pAgaWiDw7NT2lVtCQ/2onXhp//\nkCgQznNR8UuR1cfYgCyJwxLqsJJRDpWpRKoKsuCY9vYZR9vRnXm/okcwa6pm\ntRfxCqJO8Vfcw0Ddu18EU3MOLnPqTYXqqpNelNlfbdVSB1i8WSL50YdwV+kD\nV2XHEi9vLzatMDj7wVgPCLxp3F7bI9CZFVQrmXSu5ze5Aob897OVbUnJi/cU\n4hRRCFQzYcBDRz3qJt1KMCuG8X2V80WgAfs9AoOWeAWMHfdA7MHoLjsw1Nsa\nP6nH\r\n=fn+w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.7","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.7"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.7_1582434337308_0.3638332268426894","host":"s3://npm-registry-packages"}},"3.5.0-beta.8":{"name":"@aofl/rotations","version":"3.5.0-beta.8","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.8","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fb2663cc4f3362c89cc4db25dc4883b4bbc1b916","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.8.tgz","fileCount":7,"integrity":"sha512-gGkBcO6LWbvleNSq2AbMZaFaE/uOsAvFIDkO4oXRRIcsMjLv5pof6g6eIms4iU3zNnbvZltoaH7+9SETp3kniQ==","signatures":[{"sig":"MEQCIDKVOgUp3ZJECu3nnQQb+50vIJZFjGaCZcW+TJCgGFz6AiA9m/p+8RsqvRJWFKSfQSnaBLxB48MJpP+NhCgViiHa+Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":41961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUgjaCRA9TVsSAnZWagAAevoQAKMv+RpxZxs3iCmyBoTZ\nXjmDIIZYZ1CQq1YPW5UOOVwm8xlc7f6Md8bcwHzJd5cwwuUSAjP7hbUMrMy0\nIPWF7/jqqVI0xmu0udC95fjFUukJAG/l6Wrtfc+oZTV+t4QTEIaREUrkxiiw\nmbardPOemYeQ7hPNcAXcP4Yu4KLIMOSMrXwjJTvgdg2ytlXFQBtkaS9PGq0D\nyA807OzgRbt0BohwdKwepa+b759VeE2o04+bipGjCYcm6nk23GTHg4MsQ8rU\n/i6x+Ufe/g2n14ZZ3y7fR9JE5LhrSaFXZ3yv9u0xwk5sO3ufc2Yl7HWzEHy9\njwBEP1mN9MiS+dz5RcuyBsfNktxATt1oOhpvKbbBVlLlRrnAHw7qFgH3q0Lc\nxo+dZt9gEGe/I1HsznCvmYU0Zxp2v1xJZbfjc6qXvQx7/XS+msRz358zT17z\nFoSKpDbxHzca7HpVQCBnJ4Mqi0kX/p9Cu/cE5Dafyxd3RA4KMAYFL+ex68lo\nR186mFtSxRyxzyE70DbJx4Res0fQn+bhkPVv1rMevpzZ5OMi84QnvzcDQkRy\nLVRu+DK5hdeweYu5jnXosx6McZqvxhWXIp5nKsPP1OP0bhxz++9kaGeF/kAd\nt+owBerG+y55X6ymXwVFly0JoZZUIxE83v78KlGqAGMuJbF5Nq/qKuE0Pdi2\nQERk\r\n=Z5mW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.8","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.8"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.8_1582434521634_0.22807239200883878","host":"s3://npm-registry-packages"}},"3.5.0-beta.9":{"name":"@aofl/rotations","version":"3.5.0-beta.9","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.9","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"badb425c9a36bbd348954b9933a4e168a18df4da","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.9.tgz","fileCount":7,"integrity":"sha512-fW3M8XXWm++dJ/Etv2tZAWqO+axMKHW0ZSTkb90wg7BsJEK7TFXSQG728e1MNn24eEBfXoNqEm41glXL37i4DQ==","signatures":[{"sig":"MEUCIB5qFmXjCT+/c7bYOr5xWu/5g8G7EUR/LPRUEQ8/G5xlAiEA28Eyv2fjcmNkL1B8ovZ27gCRP7Y4f9PO8AQsys7QP1Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUg6UCRA9TVsSAnZWagAAj1UP/RJ+sxIMy9LtMG53Ji3Y\nmn18uaIotmiVZqfdQ3X1pY0YyucUqO0ftUErn+UVzfuQWeiuWGNVy4wjduCe\nTPZT2ZtFuI2PB8d+TSj1yP+nCW7tNLTJZFth47bCCUjFoFW7uN5yArqKsIAZ\nZOjejRpBErLSULRvzrBGWt6c5TXLY3/5fvdagjKq/jtbBEBICyK5K3znUbb1\nRL8ZB6unuceihFdhcFwt0CKhbxWOFrk+GJaC477ZsDpeYLdJUsvmG7+/rA4Z\nuNhS2Wxbyb5raQ0rYang++Gb23CbIs3V7Yr0cS0MgDZnwSlPBMPGs6084uEc\nuh6h1Z8TvsC+dD+0dgfsN1zsKSZUO6dTWtRNk9K2NqHvOQkyIBIkXCB7c/mB\nFPt2l6fKTAtLXepwbCyYf6MwAqSQ+NDiSkETUg0tYZQLYwvey+s9AD5ZZA5I\n3uHdid2YiLVYZLDYurTCfiz/6xJiBM/cqXhGttD3QbwOhLEpWWJ2LYspRUW4\nh0fgPE33HVnJ3l3YBV40viadtSGEaSZ+lenU0e0Whp0F3iiVpLsZNL8gRmWT\nCTrATmi01bCCJun67csu4JDow3yYbD3Nu5DpmYH3tsIZidiSz9JbxcBkT1ED\nNICmBdCFMBO0fcjJohyJ+qvNbJ/VVDBqr0D9NgEXqZ60OAipZFGxKZ2EyT6Z\no+g4\r\n=Wrdx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.9","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.9"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.9_1582435988432_0.9320873437515869","host":"s3://npm-registry-packages"}},"3.5.0-beta.10":{"name":"@aofl/rotations","version":"3.5.0-beta.10","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.10","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"8088fb24662a884db725b978daf2509205741466","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.10.tgz","fileCount":7,"integrity":"sha512-Rvl9xgkZ0+k3vr91ePkpP1JFzPCMmQUOTJum/rcA4cugTYPA96y2SJcvr2I34EynApXo82Rk8w+M6mYIl0lO1Q==","signatures":[{"sig":"MEQCIBaMtKXh7ei9pEvDs99dz3Oy+WEXG3CUy+aGh60FAY/TAiBdhg22oI6F8wKIlcbM3v5T02sSN/UVAhR2Zl6Ipfw1mw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUhKmCRA9TVsSAnZWagAAqDAQAJdUdWBU93wXgceJ6NYS\ntcxMBsZt6leBC1fyRbdgl/cRz2KZGFZfUeZXNfKqc7Hmy5cEVMWENlJxXylo\nD08SGKfF/ZxsnW0JS5gWGYZhd4IfsW5ua/apMq+RvYwlrUULogCZSgASzBdj\n2aCYx4SqakLTOOJAt6cYy0Run1zHNqOM1D2DQ1MMAH9tiKkD2Xdne7Y94VLK\nPGR/jn4fa0In4Jws+EzILPfu0mlSTBf4Ri9dlaH0OUUqhcAuYsLCWz5PAQYz\nM5r4FwCn3kKsgFzZLc7tQw0Wdg/H9FMkhZ1q9ttgYsPmqTDrAASN3oc3/GOn\nR/AF4g4INo/03U8kcHV/IXT+FQmSYlkg7C1zNtQK0C+++tEcZ7fS/+mXLYyW\nQfICXtTo3LGc2ROimZCXoOVc8KU1Im2ca5Qy7jYF7Em6LjDD0lz0ByW6S+S9\nBYY4wb9QPEItR9Ii1jdu85aPrFptYryPzs1Kq7rhAx8oSd+rvC1/FBIYTSF3\n4ktGRqbr7V4b+AIBPlnEwEgoC1KXXh/ri8p6WF8owzHIyqajpTp360u5A/uQ\nj7OLJvChyERgEI6ujIaY7AvnutD4Buvv3AJA6BlZdLXUGCpNP/YIW2ptQjvH\n+8+qjfLuhbGMGfTxQH7eBbh+6gRce4z0DvlNRXB/D0atUDt3K3oL8IzJFPWs\nDcvx\r\n=qyuz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.10","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.10"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.10_1582437029838_0.11768961024646396","host":"s3://npm-registry-packages"}},"3.5.0-beta.11":{"name":"@aofl/rotations","version":"3.5.0-beta.11","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.11","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"df8b596c3bcd08157391a977196fb5c5730e2bd8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.11.tgz","fileCount":7,"integrity":"sha512-2jNL+nEik248v8QsBFwcEcHpNcd09pF3vJR+Je23mu8/ZimG7zFekHVkyddS37rQOHxJpSX5t9B4V72sW1wmhQ==","signatures":[{"sig":"MEYCIQCzMhT8UEhYmF2+UGBCbCad6JhJEpD2JbCEZZgSO3IE6gIhAJ6KVHliEmDdfpLFXntDRODfnfvZldzehpOijAPKpRNg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUiuuCRA9TVsSAnZWagAAWwAP/3bbdmddG+hS0IJOz2/k\nkbX+vyMHicHJg15K/8Y+afgHtcf9u8YRKnE09lhf+I/KQQA5P39Tr4z0K49/\nzK374LLvadX6UfBQd425FFFuHtHjtxjRfIIR3GBo2UaYwAj1/6tDlpH0py/+\nPtvmn12ix3VA4OtZ9vF8omUzw58OxI7UR/EZJch/e59GCCvUNLcrMJcomwXB\n+Bb+Aid6ytbiNj29HVk4va+OQafILEBFsSyGgo0mvuVY79bADeDvf8GcdLPU\nQ40rA3BC35+i+5AnzQ6J75zaaORw4Suev21nGIvTEOBQb1kCsUd1jRGkIlFN\n6ePFRk+U91+0tW8Ksok2C5k3YRhOo8TLjppHobTgeo9PBpFdfopPkHPVWu9N\nNRcg2MSEzSRoRBj26Oy21CbkajYm6LFQlfUWze41aYGZDAk1fvEp8dp3ba8j\nrYr7Lao1I1FpUU2gymbCrMFdWXR5+jU8QL20BEv4yBZGT5YgWyIciodLhK1z\nApr+Jr9JOZCXWP7JyTSdZfw9V7tQDfOv2jlQpfk/4mMdEJKlyF1yRzfZt+rv\nc0ce4UJoiAl1H2s/RWNSq/4M7iQ/jt1Kez0Vi0H0khje5fLFt89yXG/Kj3HU\nAfmeh5c7ZSd/cMRvdvgcXsXEKdb1KEf+Sy5AUBnpsexeC1xYeWkkzG8599Km\nX69O\r\n=8gqJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.11","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.11"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.11_1582443437703_0.45420218360186304","host":"s3://npm-registry-packages"}},"3.5.0-beta.12":{"name":"@aofl/rotations","version":"3.5.0-beta.12","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.12","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fe3885af51f79d2c2520d57a93b1f4e7ee38d528","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.12.tgz","fileCount":7,"integrity":"sha512-TxBwqjD0Gv6ewj0YHaWiMD18fnlxx126yF0TP6qQfPZJ7rRs0mNtmYXHZFWC5Hi8BrO7Rn9zwDcIiYP6n2eumg==","signatures":[{"sig":"MEUCIBRyU5Lz6C7SMIu5dPe9fBfYbbr0h5+CoFTlrwflfki3AiEArrNFhJmGzfO5rX8h10Epb0acZkIDsBq1gKWFTzT/HhU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUj8dCRA9TVsSAnZWagAAu4IP/2ojdFjFtcwEiOE3+QLU\nJTDIJ9/wHBaMFEyhhkBYtOugsbJMOedK1YJzsotoFCfEg2EXQSQxK3jSG0XI\nBOSxVesaQS9Qstp22KzMORbWN+4WHCXqDnB3L72oq+izhZyOsiBUj71ag4ej\nSFnH+4q2v/GiLBkzerHVZFo3t5/mpmSy7I1GZYWzfArS0jSN9VB+2qd6dq19\n3MpMyV5FqhWPKjvqLZ76EMqIEY+6E+e7/3XSihXmY42d/I/kTO/+6HBxWpxG\njJYLVajNLJpWXmITM4/FqVPPZT5sQE76WZuR0FSIrh7B5bQFU/OVq5kxG3zb\nmgvuMdAxie3FEZi9F1YpFcOiRybKkBDrCuC/t7TlFI0L6LyRucRIoa2N90ZQ\n4Ju3mAQD0qRmlagRuQubWKF7nAnOuKihfNNx5G3FwdTS3rO8vSSY0eq0vqEH\nolIryiAL+/ET8pH11AN4gKSXsLBDhBQjyCSxL96l6pSnPvXruS/ZdZ402HyQ\n4OB/ZNAeyFQursbQMu/gq7oF1SXThr5R60XS2u75rVfjOcgWvj+eClRGAWTA\nJyhFET4LhpTZd5VjVuwpwxw0ZNNSGJariJ95G7eR+Iic+dQ9j2T+9wJFDw7y\nA7dAIMdMcbriLs9u+VpjPltHffumABXHd0D4IkpTovqbvOi6CzwUxHY7ffDP\n0+KL\r\n=WGOu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.12","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.12"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.12_1582448413406_0.5171461152885208","host":"s3://npm-registry-packages"}},"3.5.0-beta.13":{"name":"@aofl/rotations","version":"3.5.0-beta.13","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.13","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"e022072326ef3f4ffac35905b3335769488baf36","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.13.tgz","fileCount":7,"integrity":"sha512-OZuBHJRksPyzAN1sU2NZ62aLYSwiAFxRNx/ilA5Yt29kXaEbBSWi7syi1VfMyEGDYm9BB9c3Rle5akRrjRporw==","signatures":[{"sig":"MEUCIQDy2Eqlim9WNoFP/rWL6l/qS39cB6KAd1uUCeHioyQRZgIgXgD+s5zY6AXCsVEKhqbPLaw4lnvWG1McQBhLNjeIn14=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUj+VCRA9TVsSAnZWagAAWOEQAJsCpD776DZJwFRT5syy\ne3uuI3PT41/dzijQaVGwvquvgV9ww9Wi7ITAR6/GnoP5WhYun1RDZCtFgb5U\nN+upeZYQr2L0/udJK48wCx6uE1EJ6lcLZt9JLbwAa9GncgeifwJ29shSagiM\ndQM9Rop+E1Fjci5XQNhaowUzPHFU91ehUh+S+8Osf69S++h+JT9Q0fKUCYhF\nDEF7C1ID40vTJ/fly+7OPaaV+G3jZNB6l9woOguNOtO1gqG6swIpO2xWB4/N\nzDR5hqBfXHbg8SP5h+mzWXv4kyLV33MR8NItv28xSD088xSj8t5jb7le9Qs+\nRFONQLrB9XI56+Cy127qG0G43030ES69C/x9u+AaskdDer+QwVT3L61kQY2W\nOc+T4mxwI81ayPXQDHmm0fVW1L2bh7v7jUn0p8iSI2iyXZL3XMpgr5risYe5\nOw7aakumqX2LRA2RB5yqysyhVGWRO7pS31YfHUxWbVvgZVoToF0hWGkugPNI\nr65n10mvgXsqWXQ2f52BoEq7C0ggT4abX0x7EhoS4AeabKN6NmTLXfqsXBRM\nt0gOGzf3hmMAwnBdKjX+HhcHOlluT1savPA5/RGdzSqUJr+09fBpG3zEvz1N\nYByMYUmUj+tNl0rsxRxKtj0gVRbonOpdi9TsErlyAaPlzYfWhePER0i91esX\nqSJv\r\n=HTin\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.13","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.13"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.13_1582448532966_0.4800156187392912","host":"s3://npm-registry-packages"}},"3.5.0-beta.14":{"name":"@aofl/rotations","version":"3.5.0-beta.14","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.14","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d2a425f4de3c93dab4a82040aaf791d58bb36621","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.14.tgz","fileCount":7,"integrity":"sha512-K0OoFnelWORM9PvptDU7vfeGZFQbEqShTtPCVPXKUPl5+E0KIbQnv9Y3capsQhz9K4bXuFtDpqV8glvAd4lX8A==","signatures":[{"sig":"MEUCIQC/RcApilWtGw/+n74HGM3+HAEWDjxm5wgj9azNSZQvTQIgFVOu3P+m7XTsrGq1Qy8UGi6mmurXt2DukG5Ry3CrNls=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUk0tCRA9TVsSAnZWagAAwjoQAJy6p70Nhft8WnWFA7jv\nCo2hTC9elzcuTmBCPUKfjdnPYqSA0M2O9vVAnM8tkRFKFty0J0jN4MI7TO4/\nJFG0QZ6XCyg8FqSTU3cNntBdJJFC/zYEeTOPqR7mrgY+HnhrtHEyM4P5Ls8k\nqtmk6bz7TcQl7P+8urrBm9PCUoaJr1rfa+LbfSGhma0VV2YXmBMek1o6/ei2\n4l1Elme81vccaywvigbcp+8Cy9TmA6NaaZ24aNGen4VruhT4STxytbcaH20s\nZY7LgEuelyhaIYG6tLgzO92gnCuXxNn++nKimkHcjb4GXkOEXmK/3AF9XJS+\nmQDW4Mr9diVfTRabi5Dh7voTQAnJTE6xExuq+6na1ftQoCblzrE5bWQU9cnk\n7MfCoJTNvnGruJvB4QhOiCqpqwFIKEcFF7SHb3OALTd00hGOTlV3HdkvpDDp\nBowkeACpEB778rtBTQGi8pYVhYTfmgtje+P3TVdXl+oMqYD/YzTioLYR0EmG\nfwyPm6gfdssQPmwVinJIRxP63uqbiED34xbvjWitajLvelpALGDtJr5aLxAC\nW+Y6Q2YpKRxe9rscwWTB/4Q3Fqj+aHZJ5SCALFqfEZZ27XIuVpc8lS4vv4uS\nyU45fjylyjteZx+oGzAPyGmwA835xVTEJY9fKbgD6XQghnRIW5Fcq//dUf/I\nSxFu\r\n=tblu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.14","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.14"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.14_1582452012899_0.9227287986839314","host":"s3://npm-registry-packages"}},"3.5.0-beta.15":{"name":"@aofl/rotations","version":"3.5.0-beta.15","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.15","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a3d21e4e477b70598c4d291bb1d0866639e1c7c6","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.15.tgz","fileCount":7,"integrity":"sha512-QpQIQ3TiLLOoxDh5Qgke3cALr+t6ZzLfqtpoBx4MdhBH/GE5BiHoJSCjcukXPiv3jyiOunVD/YH3CCVQZ5705Q==","signatures":[{"sig":"MEUCIFJuJDlOD8tO4fclMQ1SlLDvOGr+Y4WBIX0SlTpqweEdAiEAiUFQLorPi6a6gFdgBV7CNJEmUVbmuuwO5uGmK68lsn4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUma+CRA9TVsSAnZWagAAl2wP/iyONLbEonHIg20ezXhR\nbg+mt6dVmcnRXEuXXvPtZYcoPvKyfcZ4b50dTt/3lqTz2pURmg+YQfBS75xW\n5GkXqee8Zz9xjPVElXLNArDLtMQXC+Ww4SOLZi7eQ6Fcv4vWjdXslPZZxJUL\nSzS6gwvMUwXJRsPH8jgzkfXn/6BbJ8g4KbF3GzTav/GB+6C2xrarjCfQ+hJg\nOC5F6Ze1DlFSg4gGZFW4eGvkOqM3Ul3kKjGaH64P5mwRmFSwInjglRGaHqEj\ngEMD0XCyBTX1pjRfig1beEmX2c7VIloZrhea4dl8irZ+4GKGd73vkCE4cLmV\nIbDZbzUX2UB5Y8bYVk9HKH/l/Pl2cDB0G18C9Dh9mfpf31VV5aGDjLk6AXzs\ns8k9sptioT679jzmaJ1ods9hl1X1tdAuCqk4EhicZrTzh87p+iiZ6F9SEZO7\nsMa7H13b2Ak5R/lKbUdlALrWp9OWgPXiPctX4t/5uQzTUuuDmIcedvp8zP1q\nwSzyymO9l2sJvDxH5lvB5EJu+jfbxw8Hmx5sYoEiPgrpTWbphWrhbV4lLXj1\nDmwTCZIrBl1strdFKeiTRkhWInNOEYYOhFOfBPl6fXoQ+y5gtOSZi2RAUHNZ\nQNqeKCDdCAveUsVIM1msL05hvdJk++/3CYF1v7g/4+oongCqkzLXa/ACkaX7\nZCl0\r\n=6CQ1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.15","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.15"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.15_1582458558280_0.9634087509891831","host":"s3://npm-registry-packages"}},"3.5.0-beta.16":{"name":"@aofl/rotations","version":"3.5.0-beta.16","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.16","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"e0651e015b5b4374512b49fd14afcfa6ded1fac6","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.16.tgz","fileCount":7,"integrity":"sha512-zmSidcflsbOMDDtV8ghrhNEtdCUITQADnPjQ/psJVUfyiKf3tTAknnxv2C3MzzzwlPPqfGHJhxYF6r5L8un04g==","signatures":[{"sig":"MEQCIHxJtgCLkqaun5kxM5BTT8ZbWrRYgiGiXaf8DFWiEorlAiAJAAkBgQkYzQsErl5Z7bg9pGLHl/yFvO3czb+kP8VwZw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUmjxCRA9TVsSAnZWagAAxE4P/ipa1zIUrOuk75qHJSSI\nD9WuQ7hMFwmzeZ9roE9QYrglIPiwGKCsOZUiNVE+DoI7LwEm5+z0ebcx9anq\nBxJvbFm5yIZqQlh/JN8VCx8crvkqi3smR55j6cT13JnJe36FbHj6rFwOCLm5\nB038xRkSJj4yH6Nm0nr0iM3CfhF0muYS4w6EhXxDm2XyR94JkIZmAbzBl0Vh\netBtBO0TgkjZjQTes4d0PiwAANlQMflxylnGFii2tc7tYm1cGgfVMYTXM6M/\nxryelp8/Mj0oOBjtXxQQkPb64Z4saJdKVOAjQXKJhniaOziUe4bLlk+axejf\nfGHDVnzRC7ta0IcBHKOj+6hOnU/WR0K/7au1H4nihxL1/uJRQjFKIa3ExRRa\n41pGgwy/PBgDmYPFaqUwBRaLtRYnlzxQRRJe3bTV5o4uvtVQRYdV51KzttFn\nFejgzzqiMOmo4wqzP+jk0h8zPuBrBDM14nYo78nN3IXMbKqvZVlYpTwOWP1j\nG/Us22kDXi+sxKf1xgeyHeJKSHiO9NqoydgoLdgjnnIRdXPahArjp9+rUyVw\nIi6/3B6l6zpocBID0pwgg8j5xNYhXQaKrfV2raKQBo6ht5N7s/Gl5Al6HBxt\nRXwNHmUi8lUiy/YIO6bCwiu1ajn5qP9LheI9kBOpXc+MnWFaASi9lAOQjxZK\nWFBF\r\n=Ys6A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.16","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.16"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.16_1582459121167_0.6464427684583849","host":"s3://npm-registry-packages"}},"3.5.0-beta.17":{"name":"@aofl/rotations","version":"3.5.0-beta.17","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.17","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"4e23347d820f3733d57ea0061b0c0ad4a8cb17af","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.17.tgz","fileCount":7,"integrity":"sha512-YFnssOUtO8KLDDs7TyhNJ2n9gbiXDxb8K9hi0U8bfEBk95pLccunKq6wk0TRnqFfscsgvg7xKBbo9BWdbQtxtg==","signatures":[{"sig":"MEQCIBTUigAAER52nBfTE76RUkYVQQNIvxrhw95xpPjaDpj3AiBRWiDwY7ec1F0lm3O4fW31ndI2JLEVYdCTJb7LoIu79A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUmymCRA9TVsSAnZWagAADDkP/j59pImmYhuSXky1OVEq\n6MHPbFhem6SHrvOvYL+tJpeM43bCOHJyY99o2jzU9h+aMByFPpMm1GE2qsFI\nDmZFI3bUL6zbwqtFDl1vGeSh69N+wPpwK2frQN/VZi/XP3UAfx+tbX7pvgi9\nsUva7XFkRs10KdsU4MnM78of8VyZJ/r8HOy3QekelSXZslHOXevbCrD/niVS\nNaEvkZJS6QaOOoPmfMkaBHuiXjY9gAnLlM5D6tJXgi8oLSogPXyMzfaBXX9N\ny1YpDtKyKUiOtep3HiTH2eHbadl8K7DnY5sPjF2SgLyLQjRM92nkV4MHg4jJ\nz2X9txMDnZLRDmru2MgPPNmH+VacqeFcnB5141OD2Vq1G6/dQhSNI4DmFJps\nqyxsIrmTg0XijNMzrn197wxgijKGPZIDCaGyIYeLmweLLBxuvXqqIwdw6Zkc\nSk1kXACs3lGU4CcqItReGix40+DwQr4t4t4vbntEU330ap0JyhpIoXSkMG4q\niP9An4UD12TneslC3vv79cZNJnVT3mTiklpPhBd7mnDZNcWEFluJkIkdD+x7\n7db7RKTKEHgzyCUsvpqs5JCbdK8AdBFzAXMrK6TkEAdAIl5XCvBusRqVdNnj\nQe1gtOZRNBI6jOEA3mcizlfOVpWB62ljy1/jNVSUMDf5ZryGLD0qPMU1mXDt\nolTq\r\n=/nUe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.17","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.17"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.17_1582460069879_0.44528494918542183","host":"s3://npm-registry-packages"}},"3.5.0-beta.18":{"name":"@aofl/rotations","version":"3.5.0-beta.18","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.18","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"edaea67390c3dd0d63e8d7af9348268e44ac7ae5","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.18.tgz","fileCount":7,"integrity":"sha512-dCy4JW4RId+wG3e/LVJDgW4cyL2d+H54I1rZe+Ps8aYUlxQIh/xjlOyvI15okUX1Ns/yoNOcXjL8izAAqQYcwg==","signatures":[{"sig":"MEYCIQCp+qdIIQM6xf89OEO314pUAxz6HxvUlWiBxxqm7OHlcQIhAON/ExvKSl4LABTW2LLVhapqGNzar7Ep4lS05Fodq/mx","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVJupCRA9TVsSAnZWagAAdJ8P/3JQ9S/E6PQHolv+9AAC\nGDioRZsf46k8MKUtJW4ybouE/rng/JA9yE55ZSZ2wLVecONty5OKo6x2s9L5\n9ZhsAV6M6wcEKO/MmvM5zmZHquC5vX8ddJZgcnUK4fM3pyZ0mwDSj48bNMu1\n3GlLTKD7MO/yWUFSpsIi2OTvsfJ9gMQPKd0Qo4Ox8b084OhTSk5ZHFuVnXl1\nU+sLGdygaKLWtCCtdJkfp8tTexfGwmdQMQLrDsw1sM8gUSWijIlGQXnG0Bib\nlfl+GuoaFBXMUFMVZ75ByJnaCKDkj6KKKKT8pK96wvFmE2D7fy4YwRXU06R/\nlEQzcBGB59M37HcgUcbjmOt+FqavpNvYDVWWGHRUpNzQLbP6lexlrggrAsaO\npiF7voQ/G8Te8TPQV7AAYN5GJuIfl9a0jjTLNx95IGhjseGiNeVB5rfyf/F+\noKMa1THA2G/7A/uCy17BlryMCdjmVwIKI8DS7lRpR/9luyP5BOZXkVKeoY+N\n/s1wtOTDO5b+nj1DLhfF8mVKEXupU0YFaz7U/OUuOIuOx70Gng8OHgjCxTAw\nQXUEvyw9WMi6M4iiO6aa3I3hDwBFv2Fj1LZiUHlz31tXb5aQnO+lYcnyUd0N\nfw6fPQV8XUQQc+v1B9yeQShfWDcn1b6rJYbXGbtk66vcb3vqFdG2nvWebvV8\n7ood\r\n=0kdr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.18","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.18"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.18_1582603176820_0.10361989019570528","host":"s3://npm-registry-packages"}},"3.5.0-beta.19":{"name":"@aofl/rotations","version":"3.5.0-beta.19","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.19","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d522d5a47b3794939ee00bdff131c4eb090095d2","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.19.tgz","fileCount":7,"integrity":"sha512-ioGyKP+zm+BNUY045VIT+A1jhjkxCb9UuRO7kc6bnyOBQX9MXubZGa6BiTrEr2KpqCd8ZH+sqK+YHCR4j2CHrQ==","signatures":[{"sig":"MEYCIQDx7aV6FLNh+CTTINOo7XJxhq59tFYZKuYnVizSsaRjJgIhAOrF9CAHKWcGG6FCkhdTWhS92By++I5kDL7lUTujdTcH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVbRXCRA9TVsSAnZWagAACoMP/iYkYdNNFjIWo7lxxD+6\nqnkOo/r/pacudx8v5Zij/5Haa/4yiboJwJ1dZOQ/QVpWNCt66MmcjcJRMAjx\nnb1DPqPM+SganeUkewt5yo7CurijDI4jgPrVvgvFYVzWwiE086NvJNH/p452\nis+n+tgfOxdpQUZ3rW7Yw2wh8nA0hKDmcKRMZZN5x1Rq9hT061UlEBnMzGc4\nEuqeDnEhvD8E90a47ded/z2P27i1kxhMXL0gPcyOUqM/WTRXigcu8F0x3EGo\nnW9tDsum18HtqSx3c6F84pcGB7uGr5s31gmX89puRPyYNorbR71SF9KdrVUH\n29S9MMd5zzrb4MaGkY5HaBnywhqlyBU4cRwSNbBtVatXhNzOIuqS4J0uKJC5\nJAWd396SI+2UzVxWHWrAckHnPoP/Qar0Hgh3NHF/mkluYWfy6NuFscwoGrYh\nCwpIzPs3NAr0OEsw6TYWZ/Sj7dmW1JrvQ+J8dyaOFDdrhvKIfsCkW4ZFvV3+\nMB13KggdRD/3RXkPDvXkK/XD6BEpyjbQBVsGJPjIzZS30LdapwBRN5vdKoc+\nwj+Ph8fdiZv1PalXeGryhWMMesWY4NlM8J2QYnQkDwg+7U1IMw1OulnCKNr4\nNNKR6e2AFyNF4wNEgF8HQe0Q13ULEj7MmigXY6BLNo2Ro411zwZ3g9gWsR32\nsrRu\r\n=9zbT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.19","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.19"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.19_1582675031340_0.04050566880091733","host":"s3://npm-registry-packages"}},"3.5.0-beta.20":{"name":"@aofl/rotations","version":"3.5.0-beta.20","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.20","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a6c5a6367489676e1751babe0322288b7e973154","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.20.tgz","fileCount":7,"integrity":"sha512-k7FS0sQZnK0W46hcOnUSyFPUWqWUCrZvfdRRS/w9Pg2C+V3lop7tcPYX59MvGCQ+lKOpREjHZfHCOWgM7b+ZrQ==","signatures":[{"sig":"MEYCIQCvhcRh2QJ7GGL2xETpuerZeLRo7STltiy+Xdp2itF8VAIhAJsmgF/qSJAXs0RmcJDHujO974SOcAjGaYQyHB+oeZ2v","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXZVECRA9TVsSAnZWagAAZ28QAJd0FtrsUpacCLnL6wJ/\nwqBDUBrlaiM88LyUfmcm4GzneIBs4BX3A8gPoC7wLV6WLvYANmXLPgMmtas4\nQSnSJNHD2jmZ86rEEQO0Ui1BMc7F8C7oaa6f/VWHFMiH2AgKZAZY3k8VHZkH\nqghcPJBKCI0zBjX4YpIX2meW1hXLitm4E10/Ft+UBRbOpNeNFWqKdeebasH6\nrnNYhVVtajov6QTB0N0LRgziPOtA8cHdYIrXAfTD7uTiPp3znR2S3lSh3B+X\n0p9fslJqrxpxwh7ifZqp2m2AL1iB/q8IA6GmzYw0xdOhteHwlbV2Njv3FKJV\n3aBxP7zXtFInLkcp4tOsw9DB6LncRc8ZeSMS/rQMUoC1kt6iXVZhXkg4vzLM\nD1yDD5SNvX/eUgUezrgXv1soeMhxWsXVFYEQfLIgSqFppKJXV/nlK3I06CUv\nYjfTbXfV3UyGGnDIfqBpf6lGQ2vH4AdPZbJ5rxCcACKtv+7muNNvgrNie7Fs\nNVIcHOnjcciJktbJ0l5Zbn0sBlY6LRR+2NBjqcoI7iw6dy8B/lFxhI818ZLo\nYIazBIfzturVQ6DmgVglJp+RmGDf9lc+INN5AdWr2Nk8Wl5pRcd+vDD2qDPb\nftfwHJz8xh4lSWboiuIGt68GuCC9gc2Utr4ZJmTiMFv99wpToPqOIFkwF/er\nnK9d\r\n=zZD+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.20","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.20"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.20_1583191364324_0.7644162275426118","host":"s3://npm-registry-packages"}},"3.5.0-beta.21":{"name":"@aofl/rotations","version":"3.5.0-beta.21","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.21","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"ee47a446d285ce1eff80beb8bccb9250c888aafb","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.21.tgz","fileCount":7,"integrity":"sha512-+ZqOKyXi5PRst8JPctx6ntO6x13W6G5i9VDnrMKvu55TkQeUdGFOVEVvrnVAZ/bNRjl5t6pqbS90x2Y7RNhdfA==","signatures":[{"sig":"MEUCIQCwjVBWZysIrN/d1mjbHplqSihTA/ZjejN1VyIyD7wgwgIgGblipiLOXdSNUZX7wmGTiBKHKP0CbTMbRqTvUWN+4Pw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXZZJCRA9TVsSAnZWagAAK4gQAKMBe10lUFS9v80qilRX\naOoLNSJj6tC35UShaRyWxMhTqchz5aiJsRR53019Xvc5Iqlv+zNm39cioTa+\nireS0PIKBEzRoC9T05Q/4pTHBQ6RsFxJ68et+YJg8FCJJxFM2R/az9m0VvPb\nRl9+0UjH2ledDeH+tGOFCkWzpWOwAl84e/98A0fCUNLJa7OQAt2tIqwNSig7\nQYcfa3MWtYpBih8LikW+lwlYY/z9vbN7mpXZy2RpIWjTh47TbjZkW2piUpAm\nSDPxnsaYzoJ+d5t9y68Q7MU45mC5JBrMaV/wkfWO2VVc9mtU6OKQxb1VTL0S\nxUfNs4+ZlZkpps0H9KZ/4NZGxhZm15jj6iSBw+XdfSGc+peKYIiT6g8ABpkh\nwUW5UYpKMnvQi6rNawiyNDsRIcUlouhDV5YN19mjFyFc7WG1NViualmqBna4\nT2fberevhSlPI5emJLLGiXjVoWTiepQZI0ASazQGldchuMzPnbegxfHLG1kQ\nERm/07LFy/m3ZytECpBSlKleb9hqfxdgvevXksaWi/IKb2HTVfV/VRTa4p9K\nVgBDPPA7sqK/NWjI3CzsEWsl44zepyQR8MPPEZ7cgWThNB8sbv5UW0LLGdut\nlYkWGqlGtuqkVRXD5Yp/t9E7jlOSO65FlmTgZInXl4YqyajKSLo+Fs5Xvq0Y\n7Qa3\r\n=Aa2e\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.21","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.21"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.21_1583191625418_0.6643562159144336","host":"s3://npm-registry-packages"}},"3.5.0-beta.22":{"name":"@aofl/rotations","version":"3.5.0-beta.22","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0-beta.22","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"855c9fd2025620de30ee1307e797420b9b225772","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0-beta.22.tgz","fileCount":7,"integrity":"sha512-wGDGVpE6qqjgYw+CUcBRnwsuSAM2O+O6y/vQCzxQbkQVLr+SlfAtCo9IWmL0m2x9Z55mBYyOMfRgayD5II4s/Q==","signatures":[{"sig":"MEUCIQDVB41sFVZMm3ZZgDo1uDM0sJeshnfSBlOtNK8+GUgQ7QIgASWT+scdJErKuUaFeXD4fB22HKhd2bD4S+V/HHKuhwg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXZnaCRA9TVsSAnZWagAAhn4P/RWmnPNFlR7l7cUZcxse\nI2JvUI9G4Nj+z3I/kMyR+Co+4l9I9vC210Yj25zGw1KPih9vSofcHQh17U/k\nxX/IMEktfcswrP0tXVDbSay3qsLP0bd+m7G0ZtWcQAnPAJqTubTn4ZxbRUDH\nOuno7uQGURpp+EQ8jLZO99BhLusAoQXMaKt72OZw6fNO5B1DRDIse6T1t6Hr\n/Ys/6PrS5IBOxeZ9ojcx/3SwzZmpSk144ai2p7ePLcrfESS3Qd/ZzKkn37z9\n1V+42f6T1R3WQDvyEXcJxnYO3oVnx0dPW7tJZ/K5ZfFytNBjKQtWWl7Ir63Y\n0fyoKV92CZPo7dooPIjcmLTxgteCzfDUkrp1+pYazcf4KBPo6DQ7E+M+O3mh\ndk2wlka7FkqcKzxLKS586/9D2aaMKziWKcuV+W5m+dekoS61KznmxT2EsvfH\n4uVgqLCP7pCyhre7mh25fxtiOg7zdS+txpNwHhOfbfxAfssjDFGBYabLdmpH\nIDdKGt3zhkkhHQQyl/eyQTcWuNbAcLw7w0+AN1mE7TCOz7jR4Vy/TkHz3abl\nOjEonpQbVL2e7vD9vF7LE6I1UjsLTDZTHSfRs7GoOM3iUUjFMnx9y+Uo8QJf\n6faEvE8hRuh1SsXS+bmVATFeF0ChdkFU3rlEnQ+/rkecyYu9rn+FtnB9qqt0\ndRfy\r\n=51Ix\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0-beta.22","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0-beta.22"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0-beta.22_1583192538071_0.5279022767784232","host":"s3://npm-registry-packages"}},"3.5.0":{"name":"@aofl/rotations","version":"3.5.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.5.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"db35430c0930890be2b9b770cca05ef83780fbea","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.5.0.tgz","fileCount":7,"integrity":"sha512-lgWNq1LIQT+JES+NERlI/A8lc/nez8vQsihup7Oy6QTxZrJQh3goSbwIQ/axwxWtOlVX7flDKBJhzEcEUPtl5A==","signatures":[{"sig":"MEUCIQCwi9sSyN4Kr/9QU/r3YkoQLNHXavwTz6js1CuhGfElXgIgKbmRAVIH6+mR+QcalLUuIifBg5597Wm9rBO6YLLToyg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXZ62CRA9TVsSAnZWagAAoncQAIekbELrw0RhXmj+IeSY\nLa0PcaFuqcHp4YsP2B7kHVQJ2GWBNyg+Z69YQJ2hzVJgrDX/8PzB2RmjMCdr\nNRZYqme8Ex8MQNbh5gRClsWFDg9uY/DCifi71yG426LVYlJe6onSsuW6VZa8\nE6QQL7NmWRspzEXWzEJh4nXaxAP0iSNB4s4izW28uKqefy0R1S+8CAt2ok+C\ngjCQOfwuiGkzyhDR0I0t2Tth4/lKagtWRi0zOdPNG4uK509BbF/GtkFRAxmb\npvSbS9n0oNoZ4ViKgHGXqkUfIOBFZuYjSj/PUHWGSRus2+N8IUBJDImGVs3E\n7zKa9tt3l0aHXbOi715QmM2hAE2ocQXGtcscv6tYtr/JWfyK6Q83tRoio5//\nDBfEgAAgsP+dgoyfvxOw9m0taisaSbjrcbzg7LSuwkqZTUW/6dLMi43y7Rdr\nfmIx6AOUOriBdtQ1NZ3EOrCb7sLNgNDbud38d158J3DQv6ar8JyzHDOhZo4/\nbhSnIynL3rTE18wpaIKwz/6z8SQt4sTceCrAo+o1RnYjk4AlG2xyrs2xhzol\nPUtlKtaB8HTf+CP3PAlJgBDR4w45izaUy5ONzsWdyOxvAa1ZLFUJdJPXJMQV\no62QXVEhp8NUxeNCo6g8lOZJpiOUdthHVTlsi1CI8WaasXwQsSpwswuE7Pqk\n3/m5\r\n=adG2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.5.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.5.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.5.0_1583193782346_0.07344494406451263","host":"s3://npm-registry-packages"}},"3.6.1":{"name":"@aofl/rotations","version":"3.6.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.6.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"ab942495cb444c3c2b1b6db11b90b9edd07dad43","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.6.1.tgz","fileCount":7,"integrity":"sha512-eSlmiN4u3c0EBULXAFKHSLEz/ebd50c8nDj7UHJ9gDsckkRJzfQtF6e2fIPhucPP9X4D/scsPtw1WSt/LkArPg==","signatures":[{"sig":"MEQCIAeRZ1tN8qNLR7oR39ySc0m7uk1O3OMTi038hVdQlPtMAiAl53bIMcGZCt152nJXwiQeBlNU8IzPG/BjdbQicVweBQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZ9+xCRA9TVsSAnZWagAA6REQAKPFWb8yX3WAsk5yo0im\nQsJwsQAtyQr9bEa1tWiu1JMTWYIE9HdQ2XXZiBeDGt4SMmU0YjwfkLyOrOd/\n4scW9G/P6AYYilGtswoG5Ebdlk+d5Qfpp7c72LyCcQFykrQwnXpjvngceaOr\nGJYy2uNCCkuD4BqfgKd8UAxAkvT0PxvtzlIJkTXXB07FxjC2Cn64MoJvvWzG\n+eflJFFEGyyqMwA3kYzSfSSNLlmldhy21X2LVfBOfxotv50PKpRKkwCaYIl5\nhlmz9OWBpby8w3duAPi0NC/LyL0+ow5/kXnvoxsypgGTOk+MK4LOZKv4XNtZ\nOgeu/lPvsO4GHgNb2L15uWpa2AIjbbhwoN8hdK2tNvEaYcrbuyjYLg8DVaxw\n00bA/uKxo6KpAGc5r1TDDYNaQBw5MbEAyRlTx1rayO5Fg8sKoaOx7MMWc7lh\nd2qZw3HktTnVrYMMWtBXoWurbLloT0ESRUes776ErjpYi5mKouSLMTS+FPQF\nFInmPuu0rTNedbacoKmczH41n4E+KZYlsn379tvgpVoFiLzDt1EeQ2f0jFTo\nYpKshnSGwFgAsL6yLrAP8MQRnjmErCFfNIqXtOH9Ip2yYv7D7/LQB19/Nhc/\n0Ag6QSVikhONzRNwBR9EJAnpjnAy5ZfOHiUUYaqvZlllIhVqu+bSF21fRvqI\nJ8C3\r\n=HF1D\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.12.1","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.13.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.6.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.6.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.6.1_1583865777401_0.31825571564200383","host":"s3://npm-registry-packages"}},"3.8.0":{"name":"@aofl/rotations","version":"3.8.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.8.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"e11aa9c8df6a8ea72538e539fae22e7c45f99e0b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.8.0.tgz","fileCount":7,"integrity":"sha512-aQMbnaZSjvqOb5Fk9pUtwHscjr/Tam6Bf+JnL5UWhQB2iQONNpdQ18BHZTYEl9GK1af4Sr4QdEYco6AtGqyc1A==","signatures":[{"sig":"MEYCIQCbN0kBHMO89zRR1YInlYoN6sm8OEHVgIjz2vdm+ubB8AIhAL6qhgIUKYMZJGTnI8Tr4Wqzm1xzCOtE7wIOAVQQJq1B","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuvbECRA9TVsSAnZWagAArI8P/2U02947QGWf5pzhp0Vx\nezyAzGu0TTZWdM+MR+Wxn1/7L3QASEUtW33JDz3ixiIuzQO8Van0EIrgYqcL\nyqA0vbPyX/UmrkKH+OiRTMjNt6sv3csmMSzSlotI9/GcedJsfdsYCT/aS6CU\nK7nVzRRlZfUE3Gv1ASvxdc0kiEk6tIUkX98uIWlNngpaRMFA7uMRyuSLiYKE\n1EicGJtbZw8cgTif6Tq5kcvVQT1ngkIwz+5lfJz6Kh54cc3pm25rBWpehUAi\n1zrWprLEfIzVreAy4nzTaAt/GRSp+ij3qcUkouHmVnhKlPEaESIPbPQDDpxR\noUv04iTVr2QKv5+k4P6cyH/9nm1YeRTvVLGbUN60me4JBZcpKvX2U8n3vbEO\nll7/VxQTglMFDCoqZXDil38xEoEi/aM6vhL/S1Q+V9NUZbKibWOTRzJ6X0oh\nJYnfFjP01YpUyBcWCtnpCzLZFhCL9caIEs1Vp7U+9qbR3qDck1bp8T4Rd0PL\nFCxxTcH9yvmeAHFY04jtJ0OIW9VNp66EhOnk+PmUmq7PtKrg8H434KNz4lLO\nTUvlr0gPp0NkPdKmxpKmkiE6QXzc7gFTBHitQy55Bjfinv4XA3qCh0jfPuNz\njKgUior97ELdwyL9TWGuuqVkHK2i2bjQJv8HAYxsxCH9MAfzGQigcmyV3r1p\nX2XJ\r\n=dmNz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.5","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.8.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.8.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.8.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.8.0_1589311172347_0.21084428429302604","host":"s3://npm-registry-packages"}},"3.9.0-alpha.0":{"name":"@aofl/rotations","version":"3.9.0-alpha.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.9.0-alpha.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"f3a3b9994857c03ff458ef2a50fc6bc146efe2db","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.9.0-alpha.0.tgz","fileCount":7,"integrity":"sha512-0ysDLgss/Vl+rBx2O2g/hBxPbr/cBnVhiDWKUQ92ZMd19s4vis0mj2Q5GIERkhiJ9HSVA0QKiFI4cTAdW4AJMA==","signatures":[{"sig":"MEUCIQCKeQU5el4GbY1kQ5wZV17iW+Y7rTsZl6fnJfiD68XYsQIgUXj591cq2EIIVnTv3tlyctzN29G+79G2LcCc02lFua4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35313,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuvk3CRA9TVsSAnZWagAAaNIP/1XA0VRKpaAr+eP9K5/4\nv8pr3doBFS8bBM7dGIpvjrK4OnT/Bqdgs0YhRQsShxB/f05rHs97vtjYUfrD\ntEwRKCSHpK2LBU32syYP3r8SWAUylDLZX+TMm+TUEKcyrKUXYdLID5Vnapn0\nAm+YY0PsdS3aH/MBcilGV7qaCy3DuSx1wHeJhIZXnfA7yT8ech3RR+QjT5b6\nAbSGp9RpMPjNBhuYfJUZquvpdB8EnuDa2qq0itgLmvN556N8L8JSbEjGV0lJ\nUAQCAdZ1lf1fnKSIOlbNyaJ0i1zyFACPsXLXwulJH513P5AqcQkVdjklR2PQ\n5LXUeC7FOmayV+NpnWljEAXoTTXWBlaIZMFle/MVDCAlgNiUiupTNQymeYnx\nM7uud5Ufy5eQaYAsBmQU/2+raPRHIjSA6JNSBywcoaAPumyjpsv5axXWZdIB\nPLrFqAY26jA1duTNvkKFX2rVUtMPqeOgV69OMwiAS3SUAyFcPlq76WOzeo21\nPPkrjgR76kom/LKLZipiBvwuK2m+jcZRw7LVSJF+NMntbFI3sgzALjtmKQhs\nGev05IbASz85KUIIfnPC7ezoT+Vv7hCG4Y/oEdVpd7FjdspRdE4DfnrvEfcT\nAO35N7vhuykIae9L2KuW0n4YVcZlAQpckPvmGQW3+89NDNbv3BWMh0gsgp4H\nVeFm\r\n=Vpr1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.5","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.8.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.9.0-alpha.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.9.0-alpha.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.9.0-alpha.0_1589311798771_0.3402186617591756","host":"s3://npm-registry-packages"}},"3.8.1":{"name":"@aofl/rotations","version":"3.8.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.8.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"0fcfbc06543c75101f001319386ca59c2aeb9028","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.8.1.tgz","fileCount":7,"integrity":"sha512-WbGtVFfCL/lm2bwQVaxC/qAnPECahjxu5r2QqnLp3qyGmjJQN3EG69BdQD5kOw7mzakf4oR60+jS4y4PVEmosw==","signatures":[{"sig":"MEYCIQCbcHd/3MyztkfXriE3bmWB9XSfHieh7gUfCajhZBxRqQIhALi09b/ZUCdaIEr/NvxeUU5m4es1Q5k9RPSxw0ByvP36","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuvu+CRA9TVsSAnZWagAAC7AP/0WCdbtpWLxd5cIJfnV1\nmoNQpxckaxWkYTrhe+b+jkp+zXtgq338JzXPT4OeErZI99tl69SiE69MaeDq\npksoQw9GEIEVRB6g7z4LLFrySd5regsTreVF8t8slWdvm9admc9aiwxbRBfZ\nSKzRIxn+7OC9bY34dOjjbTAZ/F5FqlEcUPbXt7t/2iQnIBYGc3ql7VwZGx9F\nNAPZq1csWf7YIaP+DJopNPBX4o1P1NXneoH2Rmu4UD5bd19ObZj7yT4Hf7y1\nPHTEdcPxjDJqVuBemzYX/MsUSIsmvDAC5u84pNuiXXSfIPRfOTi3ZRBl0/Lg\ndv6ZaLH9roCQt3AFjC/QPu3Ev/ddZWs0prfuUTuXFhuL649hqzzbhtOG8Ldg\nVVtVLXGomjv7v+0eI+AMqJAQdpqnV2F9ws2kp2WnhGaw3rOTvOpKia8vo1fF\nlj8EYPwE+aBq/wqKyzbqQmNIwFpCujZILQ8mNr8o8L2N+cJp3ezMSMI4MHhe\nchiIK117VKfHEYjUvkROLFosxgCarEjZzaWdfKOS482Gbc0bXAo39G2QvcFC\nFR/PW2VpC4+qvHtMJcuVvS53GfmHtLXmuLGoDWQw8T5nK5OCfkGsGMzI5Vuj\na0dStvr6PDKpC/H8h23Xy9qd2NWNpvNqg9eGIPMreIzOqKy6Re/iLJ2VdIMd\neyBK\r\n=MDEt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.5","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.8.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.8.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.8.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.8.1_1589312446396_0.31550327281144375","host":"s3://npm-registry-packages"}},"3.9.0":{"name":"@aofl/rotations","version":"3.9.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.9.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"9bab609604199c702ebdcb3f54130ae263652099","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.9.0.tgz","fileCount":7,"integrity":"sha512-wEFQkZas2on7bOjDXWk4up4yqysGSnKG6O8jN0+QuurDkR24hgwjmkpKXSgIzxV5Og4QAxFbxQnR/NiWyVv6rg==","signatures":[{"sig":"MEQCID9qxk6RnIF2Fve50WpR4g+/KkUjwh1llX4bclgSGpjqAiAvsZzfcUX6kOWv1qRop4qs4e5gbMwbIekv1NkxPXZeQw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevtgzCRA9TVsSAnZWagAAGZoQAITkFc45/Qx4K5gwvYL9\nmOve97RLVcL7/g68CBOjpwZDHIprTE+Ugp3f0E5ZqSnDuJgRDeUsfaKQ7k8/\nkG0FLG5MsDiqaaHRox3wUF0SP6h1iY7gmbhRMQyOwSBJutrRfC0FMoYKvNfj\nPsXgEMrcDOc08sDWcPAF+fQnRRhMhCeF5wfFPrFbHWqxFeiCHlclnoon1wKC\nacYjLD0yC++ddNqAlHmHWwwnMdCC/F9X5sSRugUqKRhsNXcN7mvR10pw0T/I\nBHW34tb5UHgq1nLvjCMulT9qubFvrfddsyShuPDOenYTa900fzd0G1JplBx/\nORCJiTdx8J2nT9dCp1BTvLJfPfe700XaGeI1pSuCKBHNYoJFlYsaEHGpf3Li\ni3oOAdVvq/MvlqzrTArT1W7Lthjycw8qX+bPHl/qz/fPyHm779y+zwhkCjKj\nsr8ZFbvPYqHy++WD8p7dpin9uODoU1MBPqh9CXFueyq4n1EtMrSFYyTTYvDh\n3gsMFyiBTIEN6MiN0osl/su1O2howN+sOzne0ciBlLJb6boBiZCDQ82VDbJ0\nMIKktAgiqLUWAKq9oeotNWkwsbKaNC1awznMQAVli5HOnh2/lT4yArUJOBkD\n5Xar8cCuXKukh8bWezCcjZAAV0FCJr4FqbAZHiytZHCm0X1rSaJivjKt19rC\nxWX9\r\n=WAez\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.5","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.8.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.9.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.9.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.9.0_1589565491571_0.2634652772511712","host":"s3://npm-registry-packages"}},"3.10.0":{"name":"@aofl/rotations","version":"3.10.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.10.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"9eea47179cbc5d57cabe1f6937d1049771a2e785","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.10.0.tgz","fileCount":7,"integrity":"sha512-t6MCcnJhr1inMdHUnB0cqPjJtJ8oq8Z62jyS0+UIxVgZLSpOQJwFm9CcTogfSfYpFU+MGbLdUsWWuvRX5D2haQ==","signatures":[{"sig":"MEUCIQDOOdfwHCXBHkuopGIoAkBnX0KUx63PLcs7ek5eQmN1AwIgGFdr0W7oIgtndB3oi7xKF2w0CIAA4KEP2SwoLMzb/eE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevwZvCRA9TVsSAnZWagAAkawP/Rup+CcQcSrnL0tOOY4a\nMi0FbcJ9GEiR2LI89XXwpPu8O/g8IPJjHMNT+2HamdFhFCDXuIs0r2OGj/YM\nMm5amQwp4XZdmKgYHzTBpdsQuKdTLQa+TXLNeO5KJjVCu2Ijx4E2hdV9nbKq\nPjlu2wYa5QjVAgvwT9Yqzsj8DdmCxeD2tRKxAlknABvSNMaiIbh+YTZIiDdv\n63dR1gEkrepRMwu1Wu+VEXqK9WkLIUMiK/6Bx7oUOQ0OURL4c9mKwnBlhq+u\nQJsccokzJMnj+mGv/dwnsHBUIMKnC/u1h7HAZ20RcQB8vU2AHC4ClB5UC0c+\nQw1J4R6wnMp2Q6J+GY0lcPgU6G2eV/95wlueei3sIWGhD+0Jd5OXlNiuXoWU\n3hE4KVDpTph36Y2wPMLUEg7CdSdd2voHQsY623UrCUxf6IJNQJuxRnYKAx+9\nUd4SF2z3FvVIqf2RI8GDYJLobCL9plgt8h9JTESBE2ZwdSCRENRJ2Ws2LLka\n9+QmP86BON3W106++nnum7Sj0vNxLvoLN1FQFndpRJ4eQt9RLPOpdmCCC5lu\nMCivHf6C+Plr7iwC6N7/GJCr5H1JNwkI3Xd9e9EIvKAmq/MqtcgXK/pHtwgG\n9qwWYkhjjq09RUubtJFIJedRyfatvd73L8WVBtryaGAudo/ga/iRadK0rxGC\ngjjF\r\n=DcWR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.5","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.8.0","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.10.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.10.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.10.0_1589577327341_0.5564968794916232","host":"s3://npm-registry-packages"}},"3.12.0":{"name":"@aofl/rotations","version":"3.12.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.12.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"a56c82ef2e0f662b9e8507a5f4ce71e70d2631ba","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.12.0.tgz","fileCount":7,"integrity":"sha512-lfcGxXoDouGWax8lmCfU1WjgbTQePc5+Omis026vtYrQOmiRv7vvnhJRoV4/1TV21cR90hVmxRwOq8JCz6VigQ==","signatures":[{"sig":"MEQCIFsMBWIdL5X6tcf6ut8X6zA8D1DnfeALsJzsU2z0UVg3AiBxSZXAmCPc+Bn2cOZ26kdAzP5D+gaXc30QQN1153eIKA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgB3LqCRA9TVsSAnZWagAAbiwQAIf9p8R1be9dW4V5Qk03\nszTe90KKFG97U1qxjPJUuhFjsGX/xbeRvT1eEce+LqR4UktSxIlbu+q6+zHa\nr4Km3xD3qV/H8ybRsS0rx9oeDJqlOvplgwGenmlJYPSv6qlbyMn0uU83IOcC\nsm03iMiMYjtPz7msQ/PKETt1kYbQPYWhb9CMrhzJ49FMO2P9psDFNTy9hGqD\n/TPix1VfqBbo34gUxH7crrwjg3bj4R2pVmbThnvc9ZMDRvf+9EAusie3K+Kk\neQS4bdMPbKMrPJZzGuAK4MHiBKfemfH+0OW5lBPjxJhEzJZ5GvhG/J6uQR32\nSS+6am+UGmvSupznaQPfxiUorNx78S6w5HfuqAoqQNQfVBFBlie+rS1Afl/o\nkBvS7rqzlqBCjvELWmfTLA62j0QJLTld2fjk2wM3eGARCagFS7yN67zJ0rlr\nc5kiH/dhu26S18vYls2CfU0g1pX2s8VGuIJ+Kcy/tPDYHHbGygTYnA0uSfh/\nNHhNqngQ9lbUQ96ZiraEeF95byREkThcFkSklY6M04/joPap1WlHn7T30Qla\nTzXNR38E37LtHv0UTCGtCRA86BYdOxd9ZjiG+v1V27DQ8SdWTZUW9FSQWbZ2\n8+x6Cxz+rOyE3HiGsrXrRMKPpNbMI+eYjtbUn9OC7kraUNcSheMDgNI5wl/3\nvw0X\r\n=Oenw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.4","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.16.3","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.12.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.12.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.12.0_1611100906367_0.7558747811080349","host":"s3://npm-registry-packages"}},"3.12.1":{"name":"@aofl/rotations","version":"3.12.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.12.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"57a07e647e290e19b94383a06964ee1f8637e6c6","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.12.1.tgz","fileCount":7,"integrity":"sha512-uHX1xSX4rPyO1TpwQy9b5LJVMCI/R/6gXUUIQulZBWwMiVc8MPqkeUP8qYTSrlqLLgOV4h3SH3r1yLVZND5HRg==","signatures":[{"sig":"MEQCIEOEhKRBr1tJ5Fazg3zbtClz5SHF3FBvVN4jtxRmdGlUAiAVGLx0/8/WJyjUGDHRWEoHBYRN+oxKFWvmJfHiQAlPaw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgB3V9CRA9TVsSAnZWagAAbnMP/RorWAc3iD6XU1jQtx/N\nIEFUuiRu52T2j4xQ3cR2iCN6Zr4v68VTN+kGYOjnwAtxKJNM372b2hIm8nx9\ncYq+2nmJh8f39eu6NtZ7IN/fPT/wjv8K737au4jct7Hj03n+vFOBTOLh9/N3\nKdG00dpsSu74IpOrviSyWdEDZJB6nnD7oQEzFqovnDxp2ybBZGZ2lVtXWBSk\ny19+nkB4kFrVnQhdR+8rKmpf01Jz2ccAL4GCwNW8L1tZX+Rt0AzKxxVSf7YL\nN4+rXIGEFNgLu3F/vI8ABT0IBZ7bRnkjgJKTdEc7wsAcHFhspqrTw/IIPaJI\nrqk+UMF3HE5D7mVNcfKwqZqAOslX35rVk46AcYe/lagDg6m5o3TtaHZm2hJV\ntAEKjBByNVMa+4tah9i/J6wV1rAzMxORGYmhE946tgWJI+2SEM0DU03HbSgi\nen4m6Gl9mBuoGc+NylBY/eqUueoXmVcU3JbLTa3OOSIoBw7jc2DpPwAued+n\n0ZePAaKI/uCp2C2ax1oJN07yG7GgSrPjmUkk/K7LPDV49erUR9O+ST+UDvrr\nlhc6IwxOwloqYZoiFinfUH3e/GxFNvN/VYW4Fw2TcEm7kyp5wZLwqwAkcVRJ\ntwhqIA7xTjLsctSNDk99FJDMbgssTa0O/xXSgawaxt1g/4XzVjeNzVy3Gj9g\nzprG\r\n=hiwr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.4","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.16.3","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.12.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.12.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.12.1_1611101564651_0.7992509771825993","host":"s3://npm-registry-packages"}},"4.0.0-alpha.9":{"name":"@aofl/rotations","version":"4.0.0-alpha.9","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.9","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"9d64c132370aa4452e47720dbac8eeebdb17aecc","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.9.tgz","fileCount":7,"integrity":"sha512-vTxkagSSROITWGOg7i9ps2KWiRjZUeZCqyZ8WQr4U0NIdOTJGvHUiQ3RLRWp/wusNGA/wbTOtEl6ML/tHaRn6g==","signatures":[{"sig":"MEUCIQDeG//kWyR99kDDJ+upP/PwGzlKd6nvYEcsqniC70+EoAIgbg1bqxI1oqHt+1aDxpCPx8bavj7M2D1Ehkax/CP0Hjc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33331,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGgDWCRA9TVsSAnZWagAAQSoQAI4ahqyOaa2r37YtCTo2\n85oJi3AxLrAFvo2d5vxOcV7GTyJBU55Xh48nklwYi7hmMX4NoFMrDxOXwz2E\n1J2A7TwbaTLd29Ex3eqQ4xwTJsK/G/WF8nAavyI+hEgsj5sunAcIuRpNbElE\npUvVH7Edg9Vti91OgAak743f3VKvXggOQxPuckQMjLEHv+P0h15pkst7icif\nJJR9PgEAvSc4n+e36JiuAWEKZ9KSnJlxCezMqpVtcl2jMowC3FqRcTj5YWE0\npFBRfJVmHfq66t1szORKvzjsDdPXbawi0nsh2eYx7VndM655OSsPIhSVVhzo\nkE1QZKHXq3uyz2cnWt3/Wsrb+9I16CeTpOr8Q+T2QCzBBIJuh0CG2SJXj7Ba\nXEydVTjA+lPPG5f1ijE4N1mH3XVgehq94oCaQ0/0IvAEKSTcP4L8skawtukV\n/mOyUimZEkNH+shk/6zVB0BG75Rie9DozH90yNJUDRrqLvG8N8JafBY6Swir\nRGq0e8woZ0kWEWIntT1/iwK4EfMN4mlDS2H0ouG/A7GltLOpAGfnwPric5mQ\nDLivkLOqYSyx3UKzxbWH/CuUToJaX1//HwiNpfgeqdErNhzNV+y7EYh9zLJs\nyUbTe9/Zpesn4SpATsrMr61yCA5z/ahTgMqS0QWMXWZXWz4GxkNPFKjPhF6l\nayiF\r\n=9JcP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx @aofl/cli build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx @aofl/cli build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.5.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.15.4","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.9","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.9"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.9_1612316886410_0.03602307469717836","host":"s3://npm-registry-packages"}},"4.0.0-alpha.10":{"name":"@aofl/rotations","version":"4.0.0-alpha.10","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.10","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"1f74fc922099b86d3de5b8304689bab6be8b1ba4","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.10.tgz","fileCount":7,"integrity":"sha512-6BbFFpXDqEE/Kgablx8iQ7KFOUtacmPHAH7mz/ikOekWza8J21+917XY7nYcIywFAC+5w5qoXxdUt1EVT/lq+g==","signatures":[{"sig":"MEUCIHWuu8ZDu90ZS6YhjVldSV/j7KZfBPYqos/F1jXVxyivAiEA+aKo6LHp+AjjTVsLoQkyuDuV4379FSYP3lrhGuS6oHs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGgK9CRA9TVsSAnZWagAAodIP/AzHRXDF//7JAoZ2PDqf\nUobCy2Xr0pBAsSfoZXkPSeoGFHocrwAsh+SM17sImLSwlbnThxJbdDaWmwoS\ngcsMKfMbzg4RCCLA/m+0eD4HSL6tgjQQbNZpYvIfRw5Tia+SOCImRCkTlmEo\ngMkMO0wTzO9AJUwJnNmsSEpa16kVrYeyroMABoOpMvmRjNcKrVMCD2guxAXd\nBtat/9Tczc9aKbV71TNNYGshSQF8iSJbgucJkj+khk00iRs2686Z8owZ5d3M\n8Z4m6QlEr/EWOVaUS0Gk267wSQNvTPgPboXC72TkaElUQ0e2vBvaZExkBxiC\nTnPl3txNHSlEufg2mV6XpQq3Hy+UQwk9GQMsb52cMM9a8uwMEHbn6FAaAjGb\noD8aFNFtmE9s0z1m3kAbFwSaEkkeEY5Fjypixb7SppPET1voRa1fpksuznSa\nIa4H9MHORHRSSk2X7SEc4PS1PN1bGXDpGRwRypHqMMS2Ky/aOlL/v4hSSIgw\nPleYphreqFltrNEH43862JLX6ASwI6m9X6XGC5NEOatthAVnGJvig9i+b/kY\n+R86r+hTyhdcveSU4t4sB+n6uxzr7ks1hL56R7tcK29jPC24TjuHpNnAtipz\nVEVRmwr4Nj2cihjDP/LVOfq9Ve7VgxgNM/9TkckVqa2YJcAdH5wxfb8C4CDG\nfrSH\r\n=hsKG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx @aofl/cli build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx @aofl/cli build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.5.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.15.4","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.10","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.10"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.10_1612317372548_0.8564972675821885","host":"s3://npm-registry-packages"}},"4.0.0-alpha.11":{"name":"@aofl/rotations","version":"4.0.0-alpha.11","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.11","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"2083b99e6570fb72396cc1a8a76801f994720833","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.11.tgz","fileCount":7,"integrity":"sha512-9Q8iCwq902Lbn+ZQNwCaqkWcqXRUk4F6WO9PqQW9UrocO1f4pTTSRLxNLEwNpB4u+PGmw8NoiU7fUwCTHr1xmA==","signatures":[{"sig":"MEYCIQCIcYo5np83LmEt1cqT4HtGrN3EGrTsXmzMTDJ39jhYVAIhANKVEdvuNsL0FYYQH1OCyX7mZNvUpsbq/yv36+U5ULjJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGglQCRA9TVsSAnZWagAAlToP/RI2+pE+kNdaouHwNkNH\ntTnoijB5Bj+ES/NioWdSOmav3qrkUPehFK0ZwHPuxEAnjw51TzxK5EyGaJro\nOBiIKIZTrGMu/SqgqHXWGORD6SNzgHbMTuo0Grl4lrhMoWa1srL8oi6T2dEJ\nu7DNplYc8xK9aMNUrhy2LGJ+zwt4WcU/moymiPJecqh0L0IV61P3mmQs/K1f\nIxVONAcZPn0XQM2juG0qwzBIIuBCGhHzE8jqAqFe5EkFLP+L/fRUvLg8Scss\n02HUybcKzoLXnGxqkg1eh5Okt4z1I4S9EETt9+r0jPJeaveOiCMDNP3I8E0y\nxNJoGwja4uuA1/aQlxWzCf2EHUdbUdLq6reLjooklk4w2MM152w8I2JPE3GE\nEx6rhpZqPHDdUdCCi4MA/vAoN6GWGu+gEmXXcnZDDbs2nyDwvmqJv2V0JpOq\niuib2VMnyYAsplgikZkywdesFmDhqglhpEwBg5I6+pLdLAN5v4t9B6WYFXFS\ngBSLuFKh+W1mMpJiQFH2DKnQLDpHq2Tcd8PiTfkpOj8gqN7Aw+uyz+NW/JpD\nX/PkWWQIy+jAHZrx3fPbEHUgxZbdQpDFwHS0KX3H41UgGTMxQkY/lh3jHCdG\nL0j71P+f+be/wN9YJlBk5y0DAD1j22V7gw/qGGgllSkMmvJ8DfglZZgQZNR/\nF/g9\r\n=YjyJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx @aofl/cli build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx @aofl/cli build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.5.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.15.4","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.11","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.11"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.11_1612319056265_0.06633158322799737","host":"s3://npm-registry-packages"}},"3.13.0":{"name":"@aofl/rotations","version":"3.13.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.13.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"efe2fbe44004a38212dc0f23c284d80b5c94b65f","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.13.0.tgz","fileCount":7,"integrity":"sha512-sQLpTTkNpZ1iHtYrcHCW3a9JmyUuM9ArWsK1m3tP/HapDXjx+876SWpGCg5kHUjQQ+urln63GcZMtIja4bqCQA==","signatures":[{"sig":"MEYCIQCAHY5ZZXTI5uiyL0DJq505732tGpEU2ltdp6RJH7xpOQIhAMEJwQ7jqgeTmbe2WU47lpo1AGujr5CJ/bUG9TezObtC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35141,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgODYkCRA9TVsSAnZWagAA+0oQAKRBh6dLC6auFuBNnn2t\nE+e3rxf4PaADYn7/KOiY+w/bF9m0NzrtRfBXyOW1fzJgoI5FBU87rCu9BWF7\nFUAj04Hve4kP0g5noBV45j1o9MInoi6DGyp6d3fASx2Hpqt0em5TIG+7d6N0\n6cXqy2ja/YJr3xjOqfJNrGrtbXqYF5GsDnPbuabdv05hmE7FKYsjZQj5dCG/\nINXiRxj7Ort/1/fLwXVLfu0HnvLI04htUCFA7kvTR6AXJ2OxrhdqNJwgIDos\nt1mEVj28HY4IArTMqmLvaO33FxLrR7KfVPBF+h29n0pcktz/vglgPcnDtUaR\nRuzRNaCiUf3Cot8TqHwLaaXhrIscjolEu8D4YHg0nBZ6l9HLC+K6Ag0whQCj\n1/vQYGTQTHujhQuXEiwJV/gvFBa+Tozj8c4i6MA8qTxiUesY1IrV50VUIhWg\noSzi3ORNb+LCs3oH8wJ1HqvCEoM8sn8fou4C7G0Zj8dZSmUBBY02Ks92yhTA\nUvK40Q5KhVkVe5L+wujA0aO20XnEeWQoK0uwiv1ZFYv0TCB6HhIVtDR4zkfk\ng9Lh7CDCYAIqpGC9wu7QsFTstK3vtaRi+7uML773LxmPsj62O+mE49LOPuCK\nBLVPKj5Ktyyoa/AJSuC41fWda9XAPh2GGpFxGRwIhkBzg5oci3kY6K60hNu0\n8kMX\r\n=nkHd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.11","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.13.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.13.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.13.0_1614296612400_0.7372422732560187","host":"s3://npm-registry-packages"}},"3.13.1":{"name":"@aofl/rotations","version":"3.13.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.13.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"392ec31c51c5979a5f56f2e0c1bcbb05aecf16ae","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.13.1.tgz","fileCount":7,"integrity":"sha512-8US+b2z7BUiJgBre41WuQShe4Zdwim3SkkhyF+7dPSsr7YhyVXgPfZK2/GzJMLMGTv03MMVPV1J5M8s75/GJrA==","signatures":[{"sig":"MEQCIFfI4vpmq/vI2pmhy3sT52R8xV5Ri+49hNe5Acnl6FDzAiAbA52hOaA5v9G69wQJZueXV4hodo1q2CalVwtHgbMAYQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35141,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh11q2CRA9TVsSAnZWagAAB1wP/j0cegho/5CywaOf3LVa\nu3oat4O2IhAfq2mNlpDjfUFH0FQG/l0HhzxLrm7/MUuRNe8sQ1jfcvKSPeGB\nsn73eY2ub+OrjUhWK5F01ZPLIGDPA0+eowCOLmgxqRQwGKaDmIRCTx2esDmM\nqxC9TgWjnW9bKe6K+ltI3kQeBHZrYdvFPXcORpFz8Lgoji0NbnQI5+zv68HM\n0ycoxbPMPzqFkP+VxHsXn+2JXopRprivvQ/9pWFTxoTLXQ5ef0HfJgKsP7N7\nsVZwF10BUhpedb+pyv1h60J3E7s7D3r1A9BcWlYMQec+/WCq/w4opdlUMF4V\ndyMKSiGCXW9gYfJvnvSXmt8ExI2osqwQRORAkRbbTP3xFZFy8GlBK0wEDVMe\nnDeOXfCk2WwaLQd0YWpdFHFks3zyA5AWoH5Vao079fwQpVJkh/fD039EHGqS\nVM5Nxzi5XSS5uP8Gh9phukwdl6qV6HOHkhwZw0CZNDFrfSKycl3LGxYvsCli\nTONdBNprPWDWruAzIFIK+hwbXLHKvDjE7F0IE1DAGCMmq0V5NpHTbIgLY8jt\nJPjPGscQVlwY2EjahSeL5sn0IaSrt7GlGHDjNWYJ8azPCUmqVs2T72auCr2g\nt7SpxIBOOQNHu8F/fOPaVhIH+E+MDPs1zeh3ljL5HM/E0nr5lzBwkPYMG0NB\nvXhl\r\n=UI2O\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.11","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.13.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.13.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.13.1_1623800926592_0.6110991444418461","host":"s3://npm-registry-packages"}},"4.0.0-alpha.13":{"name":"@aofl/rotations","version":"4.0.0-alpha.13","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.13","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"5d141012da618ec004ff983d91a7a8ddf4b5c228","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.13.tgz","fileCount":7,"integrity":"sha512-8mpDAjroAJr80749fb//jFRpuiirFa0hmZZhV2wVPW8CZZfgl6PBvnuGNstRKOtV5pBdK8FHKbowUgjHBsHeZg==","signatures":[{"sig":"MEQCIAn/ooRyJI6QkGkaU/2XU4PPcq/ue4G8tPEYAcz2qEN1AiBgiWWi3t336Fu+PGRSAbrAv+h3uR1fPcRJGpbOsLtajA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32337},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.15","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.13","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.13"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.13_1632439929898_0.8246056433585558","host":"s3://npm-registry-packages"}},"4.0.0-alpha.15":{"name":"@aofl/rotations","version":"4.0.0-alpha.15","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.15","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"79d2729c97501c24926fbe7d23e5f431a33f7adc","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.15.tgz","fileCount":7,"integrity":"sha512-lyRINyAkUFB0Kp3wsYzPPNrypWjFbm4w1Na86C3KEPqMYA0AWUOU3F/CaZKyWNXJeaY2glO3qDwdLOadPDykeg==","signatures":[{"sig":"MEYCIQDFjQ0YMbBHLkJUTeXD2NtuV9yO0JNleVi60ViY7TeJHQIhAOgS5g4QW3vEO/vW+jHwmgKiJIXgWeaCfb4hIvDnsHP4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31990},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"7b448cf64b30502883b3422662a9480ea25f2d60","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.15","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.15"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.15_1633539833261_0.9483682498022681","host":"s3://npm-registry-packages"}},"4.0.0-alpha.16":{"name":"@aofl/rotations","version":"4.0.0-alpha.16","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.16","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"638a1a046226592b956b0e532b176400db173a64","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.16.tgz","fileCount":7,"integrity":"sha512-byc0t7PVmMeDF3KBbXzMFBoEBIEMtUErEsksZiDl9ZREnHt7zk/G85LtA/u1FmCcvZduXQNQEfZsSco9dEIieA==","signatures":[{"sig":"MEQCIEDv7e9y5QCCoekR27H+Knu5s2nphXUDISvWfBYCvtkiAiASbhZF6ubzGNRR+0qexxMSwQQDVol6YOPcb8xHZTaywQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"7b448cf64b30502883b3422662a9480ea25f2d60","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.16","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.16"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.16_1633539908689_0.1660456426966348","host":"s3://npm-registry-packages"}},"4.0.0-alpha.17":{"name":"@aofl/rotations","version":"4.0.0-alpha.17","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.17","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"3cd1135836ebf7c71dfad94de9e383efa1258ffc","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.17.tgz","fileCount":7,"integrity":"sha512-RjAsrhnbZPUzdfZxx3DdWBNs9OLM0PC+HKdlrfhvjrUtfBtkJQ8C3enNrZQOcvw2GMqSi42q8AozuVp0ZIvS8g==","signatures":[{"sig":"MEUCIBurgaWzwimquVfvklopYBCaYfdi2p7x1q4QFXZaBuvBAiEAiWCHt4vbjMVmorvCwzoF9ls0+ZeinhCRHaHUt9YI9bc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"c7b3ad6feb17eaf3721a5528e86a31ddfb350ef3","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.17","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.17"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.17_1633546051500_0.12308683046937663","host":"s3://npm-registry-packages"}},"4.0.0-alpha.18":{"name":"@aofl/rotations","version":"4.0.0-alpha.18","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.18","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fe2a187dc3a03f0a9f3500ca7e427b33cfe92ae8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.18.tgz","fileCount":7,"integrity":"sha512-G2AoUhSlYeVMXl1ft/Z6vaibS+nE+v/f2gtkdJLGf+B0byq6a5xnNISJly9+hGNdS0zA9QXvlj+5aD4ZnSlI5w==","signatures":[{"sig":"MEUCIQDgic8HsmN4rax/Jo1xvR/3Q9ELP2MjFqlx/aFPjg84BgIgIyMBBF8N4XqMV17Zx2RV6MiaFxptHpbCYDJUWErynOM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"3971875a8be8fc1e4ed7f6c737cc9aa1653e049b","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.18","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.18"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.18_1633563633408_0.8974866235056203","host":"s3://npm-registry-packages"}},"4.0.0-alpha.19":{"name":"@aofl/rotations","version":"4.0.0-alpha.19","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.19","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"b50afe405c6bcceab832c531310753f9f0003693","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.19.tgz","fileCount":7,"integrity":"sha512-WvbiAqcMGLFQJ7DwRgpm69kd8+dRVUsJxju/nGjds7xHHomB3KdRkJSpCVX6JWiYocGxs2JbnyJvihnMFTuXbw==","signatures":[{"sig":"MEUCIEkk9BkDrHbDoDoSfR44HmpaeSL15c3HJOeb0p1L280rAiEA+FZ5CFYq4RVrAbAu7zYJ6De1Ewg/LHLyWOlCefbHnjM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"79369e766cd4fe78098059b93d1cbd7bb5dd8830","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.19","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.19"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.19_1633564049267_0.25002658023998703","host":"s3://npm-registry-packages"}},"4.0.0-alpha.20":{"name":"@aofl/rotations","version":"4.0.0-alpha.20","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.20","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"02ddccc3bf1bcf1a9210f9f84349bba1cfc464ea","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.20.tgz","fileCount":7,"integrity":"sha512-Hu29v4s9sTYcWcgDTdj1ZB5Sh6VpyPeK9BC+6LfvOWCAl1nEK/tyRp7aXFYQUKyiN6e4WpaZM/qa4AyNP4t6Fg==","signatures":[{"sig":"MEYCIQDcxapZjaXrs0yM/NeamSYrUmAYELY6WNJAq7CJDkMNKwIhAICqhmC3IF01s+PYRjVDS4JA5avfu8Cql7BnDnMLrYFx","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"398f195bda4d61023d6d7889598f5688c276f1bf","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.20","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.20"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.20_1633564496806_0.7803798016823382","host":"s3://npm-registry-packages"}},"4.0.0-alpha.21":{"name":"@aofl/rotations","version":"4.0.0-alpha.21","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.21","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"408dccf86a58fd0239da6d23a6910a4cbf4cadce","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.21.tgz","fileCount":7,"integrity":"sha512-Pk/IdlAWsYM4b+Jyfy1V4xRAqY9ZosAKhGpPymNmaB85ezIMcDZIm0WeXlE+pQXh6HcghBjsE6Xj4qLqzx4lpg==","signatures":[{"sig":"MEUCIQCoX1xbx1xSJPdBOoA53wnf/suHt0Goei5HiE7KD/DlqAIgYmDsYAgVkh4Uk22I5boo8/PqJx6T/gCPnWdE1+9gxQA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31987},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"398f195bda4d61023d6d7889598f5688c276f1bf","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","@aofl/cli":"^4.0.0-alpha.21","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.21"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.21_1633712760491_0.39016231553450464","host":"s3://npm-registry-packages"}},"4.0.0-alpha.22":{"name":"@aofl/rotations","version":"4.0.0-alpha.22","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.22","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"25ae942b1556685091a4dce47877be1025fe960c","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.22.tgz","fileCount":7,"integrity":"sha512-xW2yS36H5Ii31gecrWsc+3BsQJ7kLfG5R+yC6wxuE9/X19O85QWc0ckHZ6T+sTraQY6qDwslu/fAzxbmh4dXZw==","signatures":[{"sig":"MEQCIGOSJkDQqPHfN2HkJLMLBs0U9mSr1yknp8B0y4oMd4IUAiAsLAgr/c4WNaaKypWvK1IcejNbaEMLlpP7m9RCKyf7Iw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"289b7f60d1cd721d68cff783afc623c3f51cc2cf","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.22"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.22_1633984765021_0.029338659888106022","host":"s3://npm-registry-packages"}},"4.0.0-alpha.23":{"name":"@aofl/rotations","version":"4.0.0-alpha.23","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.23","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"02764477a3a42f7c3b7b917fecd226cad96a63d7","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.23.tgz","fileCount":7,"integrity":"sha512-h9b46uqp2JLVv9K/oIj0IhrK/7EjCZ1yxwpppTS98XmWjj9iDRzGyGAO4S3IGrysGRlj91/JqKKrKH4Bff1xSw==","signatures":[{"sig":"MEUCIAHOyzGmg2PqOaR05Tzo1DSlWpptmDv/DItvbLg6XmSCAiEA2EMURoWVbLP7dz24CZ+CzZCdFDt/xcbBuTsWMeCbxk0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"a2829d023883e5cc51126ee549f70629ceae8e8d","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.23"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.23_1633986442226_0.72727531028314","host":"s3://npm-registry-packages"}},"4.0.0-alpha.24":{"name":"@aofl/rotations","version":"4.0.0-alpha.24","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.24","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"59fbf75b8eadd566a1eff8a096017279832a8e90","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.24.tgz","fileCount":7,"integrity":"sha512-yFLezLFn7UlCuHTps6wACk2pZYMU6tJvxZZLkcGbdzE8kc0YcS8Uq4VDMk1dMnlsV5XCqNu+YT26dobbTI04Jg==","signatures":[{"sig":"MEYCIQCnuqMcotHc7yl4097nb0ulY4BqYcbfBCTwPDA9KJrdowIhAKdsQUI/MRiIYF/XvAaDg1CSe0rZzeD8ZjJ3q4+NTMme","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"a2829d023883e5cc51126ee549f70629ceae8e8d","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.24"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.24_1633988814241_0.24464718589788892","host":"s3://npm-registry-packages"}},"4.0.0-alpha.25":{"name":"@aofl/rotations","version":"4.0.0-alpha.25","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.25","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"ed7cd0743b40d8c52e8ea6eb0fc62b96e452a85a","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.25.tgz","fileCount":7,"integrity":"sha512-DCso2Rad1u7hfBhmkLn5PZoJAO6N0fvIoW5fXp0Q9mw1VoBX5swbQi2uRLPCv2dS0+HWYqdftkOuP+jeB3ShVg==","signatures":[{"sig":"MEUCIQDeVYV/y43J+zNib9D2zHHxROwVGzxZYR7erkVZgXwnUQIgTcIREYrlMNqwbLVi/Yd5rldkkxzJOHl1Mg9s+vnsirA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"8e4d611be609be11acccb9135091aadd10134e8a","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.25"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.25_1634001642335_0.06414732556677194","host":"s3://npm-registry-packages"}},"4.0.0-alpha.26":{"name":"@aofl/rotations","version":"4.0.0-alpha.26","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.26","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"bc8468a39b52a331c1c37da9304d53522e665f64","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.26.tgz","fileCount":7,"integrity":"sha512-UJAId73ea4XKI5pgLoj+O1gRw4pkTiGm5VrH9VNT/aEIvoqzjiQDUDjsSPOIg0Pfvsvp9HhGgQu6H4S97F9Aqw==","signatures":[{"sig":"MEYCIQCySZPMt1TGSIcjo3iOdpEegXKBtuQhWEZ/8DeRp5j/gQIhAMx9OkpV8/KTrJC7u6KOVj6xlfONW1M62iI5/8R/frfs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"bdd06521b3653befa1b4c07318cc120a700672b2","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.26"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.26_1634002471639_0.2871004598359106","host":"s3://npm-registry-packages"}},"4.0.0-alpha.27":{"name":"@aofl/rotations","version":"4.0.0-alpha.27","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.27","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"6ba661076555286293fde49fb77d1b97ec19452e","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.27.tgz","fileCount":7,"integrity":"sha512-nMk7LYQ8uGqp8590SYjWm0h8i6ANxsz8+xX4qC1EhP7KeeHvFkRD9DMruyT9itB1QJ+5S5lZ++7fSqZYsV6JGA==","signatures":[{"sig":"MEYCIQDGIb6VsdY0bq+0AK1ZIBGFkgo/BS/iUKbMTHCgLbgy+AIhAIh8fBkqSbuzhI6dWHnQmoGebemlJMhOq6o8QFYpPY7u","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"bc755f21b39459dc3a8b57ab25075a22313bc107","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.27"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.27_1634151990688_0.5277347604763063","host":"s3://npm-registry-packages"}},"4.0.0-alpha.28":{"name":"@aofl/rotations","version":"4.0.0-alpha.28","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.28","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"b12afaf18c45b9566ff29050937c2ed5f2e3faf4","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.28.tgz","fileCount":7,"integrity":"sha512-Br4cRuHgrncqLoH7XiootK1MTA8MrlOCVZin3C1mSWwLFugrIDwPW7RZvCHbK+qdU9mBUniApbJGGOm8TQiy5g==","signatures":[{"sig":"MEUCIQDDL9ANxqMMbAEs86omx2N7BguDC+aoIU4ORX3W92AmdAIgeq69BBToRgUTtaRFIqp2fZ5Kuz3qByHB7nOohgpSjME=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"7dceb248f691c3214f73ba1d048f26b2653bcac1","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.28"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.28_1634163502106_0.45342245114185276","host":"s3://npm-registry-packages"}},"4.0.0-alpha.29":{"name":"@aofl/rotations","version":"4.0.0-alpha.29","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.29","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"e749277ad4dc8c0d1bd8db623c9f8dcbea179abb","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.29.tgz","fileCount":7,"integrity":"sha512-zuFZNZ0PJrl+QySm5Hcxc5sd+jryyG+8cfufxgd81DdqKGUJdQ8AF9VKEPLcAClYaiLYPI/DVdy2n5Rt6VU9ag==","signatures":[{"sig":"MEYCIQDy7OaBFqyMvlSGmQpmQRGHEJ7KPOCAwgsRbJlmFwOwNgIhAPTe9r2b7kdqIHpRZVZGxYgiXED6uJDJeEyS+bg9mCa/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.11","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.29"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.29_1634319353879_0.726065576119757","host":"s3://npm-registry-packages"}},"4.0.0-alpha.30":{"name":"@aofl/rotations","version":"4.0.0-alpha.30","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.30","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"c1b89b57868a333c640e6f9c5063e58e339fa0c7","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.30.tgz","fileCount":7,"integrity":"sha512-+ZKK5xU1hGxo3WEt84NEZaTFLvdvby+Xq/X0KNoN8ttPu3dvIAPzZYQzKHwsCM1XAxTQl0HUL8dqBuSofMiiyw==","signatures":[{"sig":"MEUCIEkZdhig/Uz6UmPBhQIZjqj4p+Hs+avdnTKKY2LpNlDrAiEA3sZWiXwPvMe2jnkgjKY8Ak07TqGWM7Gmzh9KoKN5g8k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"13ed83fe4429533b22fd669328dd6c8829dffec0","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.30"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.30_1634323861045_0.6467068565642196","host":"s3://npm-registry-packages"}},"4.0.0-alpha.31":{"name":"@aofl/rotations","version":"4.0.0-alpha.31","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.31","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"f64ff9e6f2c937b8e6cbc3e267de5a96dfa9adb0","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.31.tgz","fileCount":7,"integrity":"sha512-94x2/XPnPVRMn223ZIwonaJYy+iLqKz72CSrfJdeCO3sj+wNNTUkBvoWYnxGF6h40sGfIhjeSlAO0BAh9MIpHg==","signatures":[{"sig":"MEUCIQC2mMiYDjJ7inP0+vuaG8Lp9J0NZWCsO7zNT0r+XVqXewIgEutuvOB2GAkfkQ3VTPIBj5IJ2ocjZ4wTgbl8Eo0uki8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"5bc1713dfbc60e5029713b6ad88a4a9fd46d3413","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.31"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.31_1634324123640_0.45009492245648963","host":"s3://npm-registry-packages"}},"4.0.0-alpha.32":{"name":"@aofl/rotations","version":"4.0.0-alpha.32","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.32","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"333922a32ee8b364ca77387708985b02f1a3af38","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.32.tgz","fileCount":7,"integrity":"sha512-tee7T6KS0moB/q+IxIOP2pFIZbLFbfjZCjnE1qijWF9rr+0jUstllyPlJTewq4NZjQYYjm2Wy/CiTeld3DVSRw==","signatures":[{"sig":"MEQCIEw45/rrctOKa4MctVn9DYuEClmHxWnAQ10rVCtM3LEyAiACSs1hxzXN5okKYJtb/h6/HkW0mAoUNb8etODKu8Jk9w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"77786a7e5219aff408e59d051e8380ca1a63021d","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.32"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.32_1634326785940_0.8558476562505306","host":"s3://npm-registry-packages"}},"4.0.0-alpha.33":{"name":"@aofl/rotations","version":"4.0.0-alpha.33","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.33","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"fd1063c510f1794aed5cf48f38fb6d812611bcdd","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.33.tgz","fileCount":7,"integrity":"sha512-rXIXn1uXLPQxFDZI3hoBiDisO5JdCo0mIy2qtKuDg7XCzaay4eFIDsrbP7UUlY53d+Qj7DQ5bxUIMGjf0BoXxA==","signatures":[{"sig":"MEUCIQCTLjH3cWJMLwRlVVwXsYugqoODw2mFy11dLrGfPPWSdwIgJEjILSg2V0p8H+a54O4rDIB5kAzTUAtLGGqdIcn4uVc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"41b432602965620ce989f21e02748f53f69f7ea5","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.33"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.33_1634326985786_0.48700413249104857","host":"s3://npm-registry-packages"}},"4.0.0-alpha.34":{"name":"@aofl/rotations","version":"4.0.0-alpha.34","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.34","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"280e1574bf18ba092991f9055341bbaeb034dea3","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.34.tgz","fileCount":7,"integrity":"sha512-9dpxAePvuSZku+88qyMckVv811eIrmyibw0AECJrXhbtVN//XhYvd07xswo6s2LGUOTURmrBc0Bp+4CQQylfRw==","signatures":[{"sig":"MEYCIQDfiH796Bw7T25xL1gQ5XGSJCUwHuV6SvhG5vPv2tcuGQIhAMoUO0uETSVRhOg3m2ocfgnQOmI7D+PbF8fzt8bGUhQc","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"1b993e65b04444692f40eaecfc3dfbb29d50d98b","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.34"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.34_1634327591714_0.48016448277724","host":"s3://npm-registry-packages"}},"4.0.0-alpha.35":{"name":"@aofl/rotations","version":"4.0.0-alpha.35","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.35","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d8abff15f11750b4e6f9833e205c108f0ccb1748","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.35.tgz","fileCount":7,"integrity":"sha512-xQlUALGeYL5ykcwVHurnGdNQmP7th7kwFTzEn8swKbKnJneyWHCtk543AVOgLeIQeCBJunWFKOZFw8khRqfGKg==","signatures":[{"sig":"MEUCIQCioPWSmQeVyeLSn1+WoVsu7rmG9onlXQ3bnE8Lh9Mf2wIgWLu+WUabYT+TkO8m5E8gTtnBDx2DmHc3FRiWYPf43Fc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"5a6a7f303fc21acc73b55413f38f534ed4bfb714","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.35"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.35_1634328015320_0.09981530035991448","host":"s3://npm-registry-packages"}},"4.0.0-alpha.36":{"name":"@aofl/rotations","version":"4.0.0-alpha.36","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.36","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"d56a9bd4408c37f5b7cdf699d1a1516827a7264b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.36.tgz","fileCount":7,"integrity":"sha512-ERNYSQtPUFX7upfmivEzyTio6sJqvcVcOx0SHyfGRGFco9apabuz9VApdyhtZm7Lx4VuvpdjzxNnqh2YgsiqfQ==","signatures":[{"sig":"MEQCICzcpkwMHCOo66tmLuyI7um/Rnx6BwuB+bq4gbuxB9aIAiBDJCa4D4dWQHZQ7yt+gZ6Wg8Y+2PaBecxDURk8CSJr0g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"24aeaf86244b6f9f352b26d04fd9976f9430bfe7","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.36"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.36_1634328222355_0.9685010306010318","host":"s3://npm-registry-packages"}},"4.0.0-alpha.37":{"name":"@aofl/rotations","version":"4.0.0-alpha.37","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.37","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"2b9305ad05dac2ad76e0df8a722f295f8a2e4e5d","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.37.tgz","fileCount":7,"integrity":"sha512-1VWLzO6syJKNrePPAhtdIcJhs9VOb87UvR1QjScdVSwlxOeAi5dSBcTjqg6p9jRli1Ln0DKw439ziQJOoY+YaQ==","signatures":[{"sig":"MEUCIQDSu8NOuCyuOk1qNvGcX/h860nrwinuJyQFXIFwAVNKAQIgI36Ov5vsp4tuq7VUydW2vIepks0McJY1BKYO96YJOyQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"d5e9c5a7ef77e315b759fb5bee226aa3bd3aaffb","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.37"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.37_1634328389864_0.6656583466505475","host":"s3://npm-registry-packages"}},"4.0.0-alpha.38":{"name":"@aofl/rotations","version":"4.0.0-alpha.38","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.38","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"b2a2a3ba7867103d3b74e4a78dc617f03ee821a7","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.38.tgz","fileCount":7,"integrity":"sha512-GtfIJoAaaAOX8/T0D0xm/8eQyAQbQjtrXX+Tb51fCKJgoueA4Fg4jYlsFT7kcXr8Ppih/FyuqsDIHNeAHKXmQQ==","signatures":[{"sig":"MEYCIQD0lgq2ubYz/L2/jz6HeFshomUz0ilkyACs+JMLkOxaGAIhAJdAtuyt9jiZCaB9CLSGzTgXspniuY07iiFOGcOPuU2X","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"91457836070b2b300b852a461787c56ec880a85d","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.38"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.38_1634330767047_0.30195427233450634","host":"s3://npm-registry-packages"}},"4.0.0-alpha.39":{"name":"@aofl/rotations","version":"4.0.0-alpha.39","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.39","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"4e1c5b46aa01038785cbba6f70fd836fdcad7533","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.39.tgz","fileCount":7,"integrity":"sha512-E6Ofux0wevnHUwru8D9ktRKhfSYZApYvOptRRdTQyEgkcmsbdZ9rU+v89oeKObvO/R+RkgzRXRKMFiq/0bpqfg==","signatures":[{"sig":"MEQCIBGBjppEqyInWkJzooIv62JQMIN+Hp6SB7Gr4+gv0iAmAiAVgGSvncL+hWNeC/rYtoIz6ddAhkECxMESu98bfWM85g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"f4c22e986eb7eb2e564e469dedb36c65858bf5cc","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.39"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.39_1634332204119_0.3451077559323208","host":"s3://npm-registry-packages"}},"4.0.0-alpha.40":{"name":"@aofl/rotations","version":"4.0.0-alpha.40","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.40","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"7f0f840a8a06f45d4be4493d5a8740de290a9645","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.40.tgz","fileCount":7,"integrity":"sha512-krkQ1UTu9R0zQe2osa4P5m2J7zm1OB1QJ3TDo6TfmsZDkyv7sW9RncT16/aP2k/QAadoO8Y7GE9uU25xILlOvw==","signatures":[{"sig":"MEYCIQC+4+SVcF/u76jvjluySozQMg3s3RlFXk3cHZVYN1NjvAIhAJCqmJUxMg3oDrldqE4tO9qrGaAiZhH/ILcJU5h3uwai","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"e93b1f585c2cd94383438abd74737a856ca68a77","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.40"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.40_1634332799173_0.6625619602835822","host":"s3://npm-registry-packages"}},"4.0.0-alpha.41":{"name":"@aofl/rotations","version":"4.0.0-alpha.41","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.41","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"710f6609f662c50327d3a54edbabc9dd18a60472","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.41.tgz","fileCount":7,"integrity":"sha512-QO1QfPMiDyHETtTWy4xviQw1lL5+WXQfzEy+ZHVFAppq1HmQ6Jjq8mFNMU/jvavfayl9pPveYucik8yWAHbTnA==","signatures":[{"sig":"MEYCIQDtBI225Or2LjD7SjZR98LtOmQmw5rKl+MGYtYxF/NT/AIhANW0EPGnae29G+MY9kfDsNqXrDEbkdPlobaGZcLHQWKP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"cbd55bfa3cf5e87bf7b5f27b3d9b6efb34e3ad85","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.41"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.41_1634582065652_0.4225022581034321","host":"s3://npm-registry-packages"}},"4.0.0-alpha.42":{"name":"@aofl/rotations","version":"4.0.0-alpha.42","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.42","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"f3f78c565d1f0183b0668490473a8f2ace80e6d0","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.42.tgz","fileCount":7,"integrity":"sha512-qO6ce40Slr/0zvWl+i3Mg32QFv+3EhDNZld4RPtj2fvq2b3l4lLwl4/9DQhZxBfdPPhvCb56fjbdEKFSG/lD2w==","signatures":[{"sig":"MEUCIQDFIyO35z2fgk+b5y5CS87MuGOi+w3Fp9UL3r0wvWGt4QIgJa//beZyxxCnWHEomhSccH4oogfUtE0wsIRZVzLSohI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"f64d10ec558694ce4c2d4e8b0562d4167f8e28d5","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.42"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.42_1634586030807_0.5293066916471225","host":"s3://npm-registry-packages"}},"4.0.0-alpha.43":{"name":"@aofl/rotations","version":"4.0.0-alpha.43","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.43","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"07396bad191989bdeb67bccfddb44f8d8f58bdbb","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.43.tgz","fileCount":7,"integrity":"sha512-5G/eSQyEoecdHyDJ6Hn6v23PnyIgr+IXvFiLI+Z4Dith4goAsn7QaCD7zmGkE1rynq1jygRPcPgpbOcnQ690DA==","signatures":[{"sig":"MEUCIGWEt2KBNsB+/J4otgX+J5q1Ll7XProOlkYS9tUvcmZrAiEAkefQc1X5li0WN6MHVLfSrA4y4z9wuVQ2DkUDxyevWQE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","gitHead":"6763365b38cb5be764e669a3b568be9f1cc4cfed","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"7.24.2","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"14.17.6","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.43"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.43_1634586286298_0.03260645083436309","host":"s3://npm-registry-packages"}},"4.0.0-alpha.44":{"name":"@aofl/rotations","version":"4.0.0-alpha.44","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.44","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"3fc06402c503cda5d51406f9d5f2171c33da67f8","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.44.tgz","fileCount":7,"integrity":"sha512-PsCZxVvnqBSJWKNwDxqopSyZOwy5SQ+KIAGF2pZwIkFk5lO0sJ9W/3TNaOWSrUeNwjZlWjSt53GZMtDcvbLCkg==","signatures":[{"sig":"MEUCICtcVymSOFhDi7XZRiC3Cdcksl9OSQyXmeD5+HehqHs8AiEA4GwnrYK05UGduadGyMrvnQcPH3BD9TOpO5C59OFlnuQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.11","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.44"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.44_1635874772416_0.825225855268805","host":"s3://npm-registry-packages"}},"4.0.0-alpha.45":{"name":"@aofl/rotations","version":"4.0.0-alpha.45","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@4.0.0-alpha.45","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"cc7ddf77735d7781d0064a3812535715bb7c297c","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-4.0.0-alpha.45.tgz","fileCount":7,"integrity":"sha512-JUQl30unKjHa4qwiQIUjmi3igkgzOB54WPEOkyBa/dbjkbAKGOcGoDpPpdk3YnTyaG6RU4upLhEA7RZ0gGVWnQ==","signatures":[{"sig":"MEQCIEbL9qfMa180PmySr+nCoWrCpFJ8kN2+MO4AzV51CB1VAiBb3rUoXRwK8zSuP4afSNpe5lYwFfzXzekQXhfegkxI1Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31951},"main":"index.js","module":"index.js","readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","browser":"dist/index.js","scripts":{},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"6.14.11","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^3.6.6","cross-env":"^7.0.3","tsd-jsdoc":"^2.5.0","@aofl/cache-manager":"^4.0.0-alpha.45"},"peerDependencies":{"@aofl/cache-manager":"^4.0.0-alpha.9"},"_npmOperationalInternal":{"tmp":"tmp/rotations_4.0.0-alpha.45_1635876952329_0.8092462731683849","host":"s3://npm-registry-packages"}},"3.14.0":{"name":"@aofl/rotations","version":"3.14.0","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.14.0","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"6e9d4775399a21663d5918791f726b582ddbefd0","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.14.0.tgz","fileCount":8,"integrity":"sha512-MxtVYypA1pq3F8CpyFjCjaVQ1cNPpUfh8FZNQDcsTytfZnlT2PpmDHlFEACvreSSrzdjaDXErZZ7+BTe75erJw==","signatures":[{"sig":"MEUCIQCaqiGBSpiePQUEaNUFBfV9A67Qr2l+w9hF2B8nXPwMlAIgJoJlUbAu/9ajTLguXFiJzkaPh0HXQOjW+F7KZjCsa8E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiM8/gACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmox1xAAhU8SJ5lVx78dgPhRVmI9JrFGG2vVwdYorWsUkKM/fA8mhw+O\r\nW6F/nxRvxkb0dl5kyO0bZXm1vhM8mMn2cS/Ikp1+HSsmq8xUOSKy4MYt6wGO\r\niDP6ULXh2bggvefxxYlxLSGObP4vUNoUBcmxQDiuRVZ9pjTJlwmtCIMru5qu\r\nJej9nOiKO2DvjDjv6nybwUUxL3D/SQRoTsUP8uB2bpkGzpfJ0LCu5wh189rS\r\nVBLKqn5UW/I0U2B92wsui+EIKA1veEyioiNrhI1bS15htSMFc04xM+g2lNCD\r\nDE1V1LpYR815VT04wvv1NkYy31RxFy5Z4bSL3nGg8awQH0cxj6Y+f+3jVGzc\r\nVZO4Y4WvXeJ0lgd9rxspSg6Hcgf02W0DApQeaVYQOH++23MkzJk3i7w+CgHk\r\nBDI/rbK+4kjY0DpWeqk7JVc/elOjRoOO2UJ8i+m1f9PcXD4Qd9M8S+Tdpn0M\r\nvT+8egaXXYuz7tZRbJOYk5G3NivaZscyTdz80rmFlMUV6GZ3K2Y3G9rlUBFf\r\nGri3Xnxis2dEHTxSR7nMtseo7BPqYlohIdp56fdX8MEoE3Pf3/5CK9KoDU34\r\nJ04ksT+oD9m1z83AtLvp5IzWR986URLgF94OvGhwXjIP9LxDqoFOygbJ6pVL\r\ngPDeC0Hdj9f7YEd4Zm7T9vsCoYreGyqnh3Y=\r\n=4OK0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"01a200342c31c108d1ab1039ee4c972f2ee63fa9","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.22.1/node@v12.20.1+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.14.0","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.14.0"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.14.0_1647562718898_0.6653449101314994","host":"s3://npm-registry-packages"}},"3.14.1":{"name":"@aofl/rotations","version":"3.14.1","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","_id":"@aofl/rotations@3.14.1","maintainers":[{"name":"alexdinari","email":"alexdinari@me.com"},{"name":"ariankhosravi","email":"arian@arin.io"}],"contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"homepage":"https://github.com/AgeOfLearning/aofl#readme","bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"dist":{"shasum":"1a41419b94e973c01ed4bc1ae3dfe95cbd2ad64b","tarball":"https://registry.npmjs.org/@aofl/rotations/-/rotations-3.14.1.tgz","fileCount":8,"integrity":"sha512-mzkJUj5j1Wz0CXFLRTCPo+BuH6qyIVsZTIKkDQdgy2EYzJhauWhMiXR7wqp8IOnXX8NUB6aMK20l27FGS7LMng==","signatures":[{"sig":"MEUCIQDsOnDToPEAt96M+93NUxqfPHnmJv0ElSbKHQVJG3sfBgIgJm3Fwr4lNTe9+WcJ8TDutjO1z17SetnXC9VJL0MvwBM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiM9bTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCzw//RSxrLhfyzO8hzDPotYuEpi3ZKffn2KWAYDvsP81TeXXbhX6F\r\nEALMNd5S30hHuY++ipM/SJKOdOgA1a6GZNr9aQzJVKeZIPoeHV2lPgWQwLRB\r\nB7cmW/Lvnx27oNCDEBLgMxZwnprnYcoF6zB6cTaN3/d//Xw7muwFYEtmpeEb\r\nZELw6lM/nF4kHnkSxcB/wVYpvRQgjx1QLyvQoIdpURhMVqemBxsGp1tD82yI\r\n+GK36O1u/bHZbhjVZur4Gt7IBSNaTLVYl9OInsTeBo378u4igV9yPBU1eMCV\r\n/kg3NJRACm8MTaqJBb2JrQjAIG96cgy/sxYhB3JXrWQCrQI9jGhw6CUfe94r\r\n7r5Ol/0MXG8NAUA/Eg5MOAG7h4XZqEWHqL0tGHmUGmq8G7+wltRHWCbXLGvN\r\nw6AzClk4x7x6K+aWSjJ4YOmOWJhgT3zbtQwGSbOWNHShOJnIaG5/NibkSFPP\r\nceyY+BTC70VGdZDGN0UqzEeQmzobmz9iv3XCtAxp+qOtdL1fiCymS4IzbvY/\r\n/S9U7IgZRzC0pTq+zj9/aSQo2X3cw1moEbeHv3urKubM8sYgrzrBI75P1rd+\r\n3ExpTrAjjit/xnH//bAJpF8rPXqbfaoLyCUp2GlAFl+biTe8iNMckRbmFmZ0\r\nUXNcX9V4fhwJcIKcA9yLzdiYYgZhAJxlvtw=\r\n=Z36I\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","module":"index.js","browser":"dist/index.js","gitHead":"65857163479f835ec51cc1e23ec01c45eab43008","scripts":{"docs":"npx jsdoc -c .jsdocrc.json .","test":"echo \"Error: no test specified\" && exit 1","build":"cross-env NODE_ENV=production npx aofl build","build-ci":"cross-env NODE_ENV=production aofl build --debug","build:dev":"cross-env NODE_ENV=development npx aofl build","prepublishOnly":"npm run build-ci && npm run docs"},"typings":"types.d.ts","_npmUser":{"name":"ariankhosravi","email":"arian@arin.io"},"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"_npmVersion":"lerna/3.22.1/node@v12.20.1+x64 (darwin)","description":"The rotations class provides weight based view logic for A B testing","directories":{},"_nodeVersion":"12.20.1","_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^3.6.3","@aofl/cli":"^3.14.1","cross-env":"^6.0.3","tsd-jsdoc":"^2.4.0","@aofl/cache-manager":"^3.14.1"},"peerDependencies":{"@aofl/cache-manager":">= 3.0.0-beta.1 < 4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rotations_3.14.1_1647564499706_0.13257314680082044","host":"s3://npm-registry-packages"}}},"time":{"created":"2018-08-05T19:21:50.868Z","modified":"2025-01-18T00:20:56.320Z","1.0.0-beta.21":"2018-08-05T19:21:50.961Z","1.0.0-beta.22":"2018-08-10T19:28:23.918Z","1.0.0-beta.23":"2018-08-16T21:43:37.514Z","1.0.0-beta.24":"2018-08-22T22:34:42.304Z","1.0.0-beta.25":"2018-08-23T19:29:08.210Z","1.0.0-beta.26":"2018-08-27T18:21:41.705Z","1.0.0-beta.27":"2018-09-11T00:36:44.012Z","1.0.0-beta.28":"2018-09-28T00:32:09.391Z","1.0.0":"2018-09-29T23:04:22.334Z","1.1.0":"2018-10-17T22:29:28.609Z","1.1.1":"2018-10-29T19:42:24.434Z","1.1.2":"2018-10-29T19:42:40.390Z","1.2.0":"2018-11-06T20:50:32.179Z","1.2.1":"2018-11-18T21:11:49.552Z","1.2.3":"2018-11-21T00:14:27.888Z","1.3.0":"2018-12-06T21:01:48.886Z","1.4.0":"2018-12-28T02:42:09.194Z","1.4.1":"2019-01-07T18:33:28.526Z","1.5.0-alpha.2":"2019-01-17T22:54:46.145Z","2.0.0-alpha.1":"2019-01-29T01:54:01.336Z","2.0.0-alpha.5":"2019-02-26T23:15:31.479Z","2.0.0-alpha.11":"2019-03-26T07:15:15.800Z","2.0.0-alpha.16":"2019-04-25T19:57:52.927Z","2.0.0-alpha.17":"2019-04-26T18:36:02.486Z","2.0.0-alpha.18":"2019-04-29T21:02:21.447Z","2.0.0-alpha.19":"2019-04-29T23:56:40.808Z","2.0.0-alpha.20":"2019-04-30T01:03:33.667Z","2.0.0":"2019-04-30T19:31:56.858Z","2.0.3":"2019-06-12T19:39:18.657Z","3.0.0-0":"2019-09-17T05:22:08.567Z","3.0.0-alpha.0":"2019-09-17T05:24:09.687Z","3.0.0-alpha.5":"2019-09-20T06:32:45.961Z","3.0.0-alpha.11":"2019-09-27T06:49:33.938Z","3.0.0-beta.6":"2019-10-08T04:49:45.210Z","3.0.0-beta.8":"2019-10-08T05:48:18.283Z","3.0.0-beta.9":"2019-10-08T06:11:45.968Z","3.0.0-beta.11":"2019-10-08T09:42:57.586Z","3.0.0-beta.12":"2019-10-08T09:53:43.869Z","3.0.0-beta.13":"2019-10-09T04:13:28.970Z","3.0.0-beta.14":"2019-10-09T04:33:09.970Z","3.0.0-beta.15":"2019-10-09T04:50:55.249Z","3.0.0-beta.16":"2019-10-09T05:06:06.247Z","3.0.0-beta.17":"2019-10-09T05:25:16.949Z","3.0.0-beta.22":"2019-10-11T04:40:54.765Z","3.0.0-beta.23":"2019-10-11T05:40:02.886Z","3.0.0-beta.24":"2019-10-11T06:34:50.910Z","3.0.0-beta.25":"2019-10-11T07:34:53.205Z","3.0.0-beta.26":"2019-10-11T07:49:15.119Z","3.0.0-beta.27":"2019-10-11T07:54:06.666Z","3.0.0-beta.28":"2019-10-11T08:01:15.608Z","3.0.0-beta.30":"2019-10-11T22:58:50.407Z","3.0.0-beta.32":"2019-10-14T01:09:13.323Z","3.0.0-beta.35":"2019-10-18T06:59:21.656Z","3.0.0-beta.36":"2019-10-19T10:45:58.440Z","3.0.0-beta.37":"2019-10-24T06:08:02.761Z","3.0.0-beta.38":"2019-10-30T22:52:31.522Z","3.0.0-alpha.12":"2019-11-02T01:11:50.563Z","3.0.0-beta.40":"2019-11-11T22:31:23.498Z","3.0.0-beta.41":"2019-11-12T04:55:43.262Z","3.0.0-beta.42":"2019-11-12T05:53:52.608Z","3.0.0-beta.46":"2019-11-14T21:58:23.705Z","3.0.0-beta.47":"2019-11-15T00:48:54.335Z","3.0.0-beta.48":"2019-11-16T23:36:09.889Z","3.0.0-beta.49":"2019-11-17T03:38:01.993Z","3.0.0":"2019-11-17T07:06:15.626Z","3.1.0":"2019-11-22T03:28:26.121Z","3.2.0":"2019-11-24T07:35:01.074Z","3.2.1":"2019-11-24T08:03:55.752Z","3.2.2-alpha.2":"2020-01-14T20:27:38.887Z","3.2.2-alpha.3":"2020-01-14T21:12:58.718Z","3.3.0":"2020-01-22T23:31:19.918Z","3.5.0-beta.1":"2020-02-22T23:26:41.053Z","3.5.0-beta.2":"2020-02-22T23:52:42.314Z","3.5.0-beta.3":"2020-02-23T00:07:25.939Z","3.5.0-beta.4":"2020-02-23T01:57:30.712Z","3.5.0-beta.5":"2020-02-23T03:10:08.155Z","3.5.0-beta.6":"2020-02-23T03:17:49.568Z","3.5.0-beta.7":"2020-02-23T05:05:37.441Z","3.5.0-beta.8":"2020-02-23T05:08:41.802Z","3.5.0-beta.9":"2020-02-23T05:33:08.617Z","3.5.0-beta.10":"2020-02-23T05:50:29.970Z","3.5.0-beta.11":"2020-02-23T07:37:17.873Z","3.5.0-beta.12":"2020-02-23T09:00:13.587Z","3.5.0-beta.13":"2020-02-23T09:02:13.072Z","3.5.0-beta.14":"2020-02-23T10:00:13.049Z","3.5.0-beta.15":"2020-02-23T11:49:18.431Z","3.5.0-beta.16":"2020-02-23T11:58:41.541Z","3.5.0-beta.17":"2020-02-23T12:14:30.078Z","3.5.0-beta.18":"2020-02-25T03:59:36.914Z","3.5.0-beta.19":"2020-02-25T23:57:11.532Z","3.5.0-beta.20":"2020-03-02T23:22:44.478Z","3.5.0-beta.21":"2020-03-02T23:27:05.544Z","3.5.0-beta.22":"2020-03-02T23:42:18.181Z","3.5.0":"2020-03-03T00:03:02.477Z","3.6.1":"2020-03-10T18:42:57.550Z","3.8.0":"2020-05-12T19:19:32.431Z","3.9.0-alpha.0":"2020-05-12T19:29:58.863Z","3.8.1":"2020-05-12T19:40:46.525Z","3.9.0":"2020-05-15T17:58:11.686Z","3.10.0":"2020-05-15T21:15:27.452Z","3.12.0":"2021-01-20T00:01:46.528Z","3.12.1":"2021-01-20T00:12:44.818Z","4.0.0-alpha.9":"2021-02-03T01:48:06.516Z","4.0.0-alpha.10":"2021-02-03T01:56:12.827Z","4.0.0-alpha.11":"2021-02-03T02:24:16.371Z","3.13.0":"2021-02-25T23:43:32.563Z","3.13.1":"2021-06-15T23:48:46.744Z","4.0.0-alpha.13":"2021-09-23T23:32:10.038Z","4.0.0-alpha.15":"2021-10-06T17:03:53.415Z","4.0.0-alpha.16":"2021-10-06T17:05:08.812Z","4.0.0-alpha.17":"2021-10-06T18:47:31.651Z","4.0.0-alpha.18":"2021-10-06T23:40:33.584Z","4.0.0-alpha.19":"2021-10-06T23:47:29.587Z","4.0.0-alpha.20":"2021-10-06T23:54:56.947Z","4.0.0-alpha.21":"2021-10-08T17:06:00.675Z","4.0.0-alpha.22":"2021-10-11T20:39:25.166Z","4.0.0-alpha.23":"2021-10-11T21:07:22.423Z","4.0.0-alpha.24":"2021-10-11T21:46:54.450Z","4.0.0-alpha.25":"2021-10-12T01:20:42.550Z","4.0.0-alpha.26":"2021-10-12T01:34:31.824Z","4.0.0-alpha.27":"2021-10-13T19:06:30.831Z","4.0.0-alpha.28":"2021-10-13T22:18:22.361Z","4.0.0-alpha.29":"2021-10-15T17:35:54.093Z","4.0.0-alpha.30":"2021-10-15T18:51:01.239Z","4.0.0-alpha.31":"2021-10-15T18:55:23.821Z","4.0.0-alpha.32":"2021-10-15T19:39:46.129Z","4.0.0-alpha.33":"2021-10-15T19:43:05.954Z","4.0.0-alpha.34":"2021-10-15T19:53:11.905Z","4.0.0-alpha.35":"2021-10-15T20:00:15.511Z","4.0.0-alpha.36":"2021-10-15T20:03:42.466Z","4.0.0-alpha.37":"2021-10-15T20:06:30.024Z","4.0.0-alpha.38":"2021-10-15T20:46:07.238Z","4.0.0-alpha.39":"2021-10-15T21:10:04.283Z","4.0.0-alpha.40":"2021-10-15T21:19:59.349Z","4.0.0-alpha.41":"2021-10-18T18:34:25.877Z","4.0.0-alpha.42":"2021-10-18T19:40:30.985Z","4.0.0-alpha.43":"2021-10-18T19:44:46.448Z","4.0.0-alpha.44":"2021-11-02T17:39:32.597Z","4.0.0-alpha.45":"2021-11-02T18:15:52.487Z","3.14.0":"2022-03-18T00:18:40.035Z","3.14.1":"2022-03-18T00:48:19.915Z"},"bugs":{"url":"https://github.com/AgeOfLearning/aofl/issues"},"author":{"name":"Arian Khosravi","email":"arian.khosravi@aofl.com"},"license":"MIT","homepage":"https://github.com/AgeOfLearning/aofl#readme","keywords":["aofljs","@aofl/rotations","rotations","A B testing","testing"],"repository":{"url":"git+ssh://git@github.com/AgeOfLearning/aofl.git","type":"git"},"description":"The rotations class provides weight based view logic for A B testing","contributors":[{"name":"Daniel Belisle","email":"daniel.belisle@aofl.com"},{"name":"Micah Blu","email":"micah.blu@aofl.com"}],"maintainers":[{"email":"alexdinari@me.com","name":"alexdinari"},{"email":"lorenzo.battigelli@aofl.com","name":"lorenzo.battigelli"},{"email":"alex.dinari@aofl.com","name":"alex.dinari"},{"email":"it@aofl.com","name":"ageoflearning"},{"email":"jie.zhang@aofl.com","name":"jiezhangaofl"}],"readme":"# @aofl/rotations\n\nThe rotations class provides weight based view logic for A B testing. It takes a rotation configuration file alongside an initial route configuration file containing all possible routes and produces a finalized route configuration file containing only the selected routes based on the rotation configuration rules. It also caches the results per client.\n\nAofl Router works well in conjunction with Aofl Rotations. Other routers may be used as well if they take a configuration file that uses `path` as a key for the value of the route. See sample route config below.\n\n[Api Documentation](https://ageoflearning.github.io/aofl/v3.x/api-docs/module-@aofl_rotations.html)\n\n## Examples\n* https://codesandbox.io/s/github/AgeOfLearning/aofl/tree/v3.0.0/aofl-js-packages/rotations/examples\n\n## Installation\n```bash\n$ npm i -S @aofl/rotations\n```\n\n## Usage\n### Rotations config example\n\n```javascript\n{\n  'baseline_version': '1000',\n  'conditions': {\n    '2': 'homepage_design'\n  },\n  'qualification_order': {\n    '/': ['2']\n  },\n  'versions': {\n    '1000': 'routes',\n    '1001': 'routes-homepage_design_test',\n  },\n  'weights': {\n    '2': {\n      '1000': 1,\n      '1001': 1\n    }\n  }\n}\n```\n\n### Sample Route config example\n\n```js\n{\n  'routes': [\n    {\n      'resolve': () => import('./routes/home/index.js'),\n      'rotation': 'routes',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home'\n    }\n  ],\n  'routes-homepage_design_test': [\n    {\n      'resolve': () => import('./routes-homepage_design_test/home/index.js'),\n      'rotation': 'routes-homepage_design_test',\n      'path': '/',\n      'dynamic': false,\n      'title': 'AofL::Home',\n      'locale': ''\n    }\n  ]\n};\n```\n\n### Sample Rotation conditions\n```js\nlet rotationConditions = {\n  'baseline': () => {\n    return true;\n  },\n  'routes-homepage_design_test': (resolve, reject) => {\n    return Promise.resolve(true); // works with promises too as long as the promise resolves with a boolean\n  }\n};\n```\n\n\n### Sample Directory structure\n\n```\nroutes\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\nroutes-homepage_design_test\n├── home\n│   ├── index.js\n│   ├── styles.css\n│   ├── template.js\n│   └── test\n│       └── index.spec.js\n```\n\nThe qualification logic begins by iterating over baseline routes (routes folder) and evaluating the `conditions` based on `qualifying_order`. Next `weight` are evaluated based on the qualifying rotation and the appropriate `version` is used to generate the new routes array.\n\n## Methods\n\n| Name | Agruments  | Description                  | Returns |\n| ---- | ---------- | ---------------------------- | ------- |\n| constructor  | cacheNameSpace [String],<br> routeConfig [Object],<br> rotationConfig [Object],<br> rotationConditions [Object] | Rotations constructor | void\n| getRoutes | no arguments | Gets the route configuration | routeConfig [Array]&lt;Object&gt;\n","readmeFilename":"README.md"}