{"_id":"nqm-minimongo","_rev":"29-c9b64afbe36eef79ff8373e5b3862834","name":"nqm-minimongo","dist-tags":{"latest":"0.1.5","next":"0.2.4"},"versions":{"0.1.0":{"name":"nqm-minimongo","version":"0.1.0","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.0","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"3e4e5e3a371602d1a5bf13cd774fd83600ade255","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.0.tgz","integrity":"sha512-CF2NtvJZkbwlBCmjoZVgRaRbg5w1u+4vKWv8e9R4mc3cyRNfYQUpLVrDijNOG9jKGnvoJQKCw5PyjmPHJQwU0A==","signatures":[{"sig":"MEYCIQCheoI7O/XJb6E7a1lk67p6wZiyxQFr+a56h3qNUW8fJwIhAMYPV/W6f3phabthABaiqfQxfUNjeHj9H5Gv6uWd9gM1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"3e4e5e3a371602d1a5bf13cd774fd83600ade255","gitHead":"c77ec5cf0911ebf5c285db7ce194d7ed31155d42","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"2.15.11","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"4.7.3","dependencies":{"async":"^1.4.2","bowser":"^0.7.1","jquery":"~2.1.0","lodash":"^3.10.1","idb-wrapper":"^1.4.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.0.tgz_1488742894858_0.1392584724817425","host":"packages-12-west.internal.npmjs.com"}},"0.1.1":{"name":"nqm-minimongo","version":"0.1.1","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.1","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"38c3591f4affa0c010c88143ebc3fea6fe5be84d","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.1.tgz","integrity":"sha512-SggZOYnvGseZnA5I8Jt41yWKDzx9VeXRa8HHDC6u62WmKhwJ8+FjC+jnNCFe1BI4YucmousSZyMm/1NGeoodrA==","signatures":[{"sig":"MEYCIQCSassGNiJcWfGKliRyUM26SafzR499Ti581sSibyAqkgIhALwe6fKy91Uh7kwqxQ8hriLY69Dr5vaV+Y+REmOcZTIR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"38c3591f4affa0c010c88143ebc3fea6fe5be84d","gitHead":"722afe8a733cf30919a7b1c313352dc69565eb76","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"2.15.11","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"4.7.3","dependencies":{"async":"^1.4.2","bowser":"^0.7.1","jquery":"~2.1.0","lodash":"^3.10.1","idb-wrapper":"^1.4.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.1.tgz_1488743112982_0.6964619380887598","host":"packages-18-east.internal.npmjs.com"}},"0.1.2":{"name":"nqm-minimongo","version":"0.1.2","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.2","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"bc3187eddb9fd9b72d7c9c5e78ac0c2e284899cf","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.2.tgz","integrity":"sha512-fAOi6UCvWxUJvrYuCL/NQQx9FHcISnielI2JmG16ZVddZ2qB9oQaeohoQZKIn8rlUid0J+acnzNLSj0bnLE53w==","signatures":[{"sig":"MEQCIGmLAU0c4RA9/+ibyJ/ca7CSsDIbJjqiFKFXA2LWaDxeAiAcYPYDLB5UKFt1+mK4fUkg76Pmjfk1D38s+7lhCPx6bA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"bc3187eddb9fd9b72d7c9c5e78ac0c2e284899cf","gitHead":"e88fda902bc8a660bf5e8edffc76b650c95aba76","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"2.15.11","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"4.7.3","dependencies":{"async":"^1.4.2","bowser":"^0.7.1","lodash":"^3.10.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.2.tgz_1488743338685_0.34528707386925817","host":"packages-12-west.internal.npmjs.com"}},"0.1.3":{"name":"nqm-minimongo","version":"0.1.3","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.3","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"58166f62c0d0cf66295799728927f99c9769b1e3","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.3.tgz","integrity":"sha512-l/NHR0wOzngBwgC+3D9lzERjt+8CID6Azj21XjbejzSqvGbs1ptuo6N6HvWodBJwGwZyCkajK+PuGRnbZe42Gg==","signatures":[{"sig":"MEUCIG7RmZGOHfoPfflFUV6B2Ea+Nf17eMgJG/TRIFG7sPhbAiEAwRLikYa2U7Mxs4bAvBpMZeBZIHBY77b655FvBPdeubE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"58166f62c0d0cf66295799728927f99c9769b1e3","gitHead":"6d4e0a330b1012a20898d6a9b2e430c3820659a9","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"2.15.11","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"4.7.3","dependencies":{"async":"^1.4.2","bowser":"^0.7.1","lodash":"^3.10.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.3.tgz_1488744275899_0.7732737616170198","host":"packages-12-west.internal.npmjs.com"}},"0.1.4":{"name":"nqm-minimongo","version":"0.1.4","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.4","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"641794c20e6a4a3a2f0ea840fa3e95333685b974","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.4.tgz","integrity":"sha512-Pjmcaou5wZplGALiEBJp/S9efwmTWHaL860YWdMhm8ebQ6PsDhMYMgTEtZ154DDhYhjsDkxJs16eEQ/+76qiEw==","signatures":[{"sig":"MEUCIQD37kDdQMhKt3Upd8su2wjKEBvQZv7m3DQlja1arzkiLAIgPF3Wf0MsziS9+QIIU5bOA3IsdkBRrqEGKwmvovkhlvI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"641794c20e6a4a3a2f0ea840fa3e95333685b974","gitHead":"f5a2a29d82463b350c1238ad7197d261095a2f48","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"2.15.11","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"4.7.3","dependencies":{"async":"^1.4.2","bowser":"^0.7.1","lodash":"^3.10.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.4.tgz_1492064068943_0.8386084125377238","host":"packages-12-west.internal.npmjs.com"}},"0.1.5":{"name":"nqm-minimongo","version":"0.1.5","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.1.5","maintainers":[{"name":"nqminds","email":"nqminds@gmail.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"cf528a8815c65b766bb218344dd82f7946d77723","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.1.5.tgz","integrity":"sha512-FSAZci+yZq9pepvNMrB4iCEgtF3lRjgqZ/pIZjNYU7BV2A1RKC8g0G9PAT6VuDGtOWYJnhCq+n+Cp4tjkuuh7w==","signatures":[{"sig":"MEYCIQC2SzJdnJhVuJ9yX3Jc1+4q7YE+Ua3TZf5z8dLB6j85lgIhALzlmgMqAZjAoOvPVgMU3TZZDazyS696MSKzcJwfwWfM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"cf528a8815c65b766bb218344dd82f7946d77723","gitHead":"60cf258cafaa7bb2dc7c5883362eae911ca27398","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"3.10.10","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"6.11.3","dependencies":{"async":"^1.4.2","lodash":"^3.10.1"},"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo-0.1.5.tgz_1509446983725_0.7789102238602936","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"nqm-minimongo","version":"0.2.0","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.2.0","maintainers":[{"name":"nqminds-org","email":"nqminds@gmail.com"},{"name":"iglautier","email":"ivan@nquiringminds.com"},{"name":"mereacre","email":"mereacre@gmail.com"},{"name":"antmcc","email":"anthony@nquiringminds.com"},{"name":"toby.ealden","email":"toby.ealden@gmail.com"},{"name":"aloisklink","email":"alois.klink@gmail.com"},{"name":"cbrafter","email":"craig@nquiringminds.com"},{"name":"ashleysetter","email":"ash@nquiringminds.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"f80ccc271941165b8b72f5258aab47c3ce9cd117","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.2.0.tgz","fileCount":50,"integrity":"sha512-cME9c3xmYaBm9qL0Z6f6LzQdjktxcZin5nWeeVba4LwFxagxRHMl5aEsLMcr2jQk4B/+lJ4TDCWdWFSEgO7l2A==","signatures":[{"sig":"MEUCIEodwx7h2scOmIbbVNQdjD2tbSEAVDFk1cumQO49G4vGAiEAlRMjoIWh37Z/PF7IZi9INwqaGDoENHVxotwmVFsr98E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":438555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgdwnrCRA9TVsSAnZWagAAXrkP/R53xINo4zZHVo5EFhe5\nZYlX0dak4ZLLwt9zI7UqskzGhmvYTRiSuQz29gODgjpDPxD9LKbsllaCG7ci\n7GIBNx+Zn4mIZASKHWFjw5VIr+oedbsi1Nk+R10yEbaREQx8AsqYi5rXs51M\nO6likk8b4/uCXQ+Z2mv1OMEP7W3z4OUbEvI/q4PNySRLZj4ZHl5/9U3R4Ax3\nIxeb/9nCC3DINo2sFXAyX3t62J7exj8RPYgPGlIk9Ljemw8W3WZgp6TlU597\naFxadfTRSh8mQuaEVe7dFiRWFVglxm4lJpuk0awWDnlbeb4sj1qk/SUzc+Ep\nS4fQkpwbb9SgAImWU8GO2KmMTXtw7IjThRAVH2v037RaFhrbVkQhUrh/25T/\n7mMZXxnIZSKNdfISOhdEPpz1aT8MpB/DhkyjC3ces3KxttBZvsMbFYcZRByJ\ngM4f5+71lzt7+8RG3FKxQUcNvPwTih+pS6LaJ3Wr3qpYI5vHwl6BzXvO428Q\nCp54y3PXetD3Ooom8+7fbvKt1GyrxnmlOwdY5Ab+sqYdxlMei0QQ1+Nd5rYA\nvMR6ZwNYE1vcTxZD4mAlaSLt+09hqftrGexG6KWxNHkYUR6tA/FgeyYDwvXk\njTntYzy+uupQaJCJA7MYkwo5Uxns9G4rQEICGS/9X2YykOzGrRHnmcdag2ov\n+/I8\r\n=+a1X\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"1c521ed16ab6078dedb6de03c7e4942bd66e2bea","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds-org","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"6.4.1","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"10.15.3","dependencies":{"async":"^1.4.2","lodash":"^3.10.1"},"_hasShrinkwrap":false,"devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo_0.2.0_1618414059271_0.05696941718970416","host":"s3://npm-registry-packages"}},"0.2.1":{"name":"nqm-minimongo","version":"0.2.1","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.2.1","maintainers":[{"name":"nqminds-org","email":"nqminds@gmail.com"},{"name":"iglautier","email":"ivan@nquiringminds.com"},{"name":"mereacre","email":"mereacre@gmail.com"},{"name":"antmcc","email":"anthony@nquiringminds.com"},{"name":"toby.ealden","email":"toby.ealden@gmail.com"},{"name":"aloisklink","email":"alois.klink@gmail.com"},{"name":"cbrafter","email":"craig@nquiringminds.com"},{"name":"ashleysetter","email":"ash@nquiringminds.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"a0735135a1ad0981554f344fee53e380cc82fa2a","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.2.1.tgz","fileCount":50,"integrity":"sha512-ZR6SsVfVpHQIgTt4+CXZvvlhYievgupQ1kB55d7iyCMMYkZ4WpmpVF3lgKoK3MlndJsGug+ebnUoHqedGx+o4w==","signatures":[{"sig":"MEUCIHYPu1x2Qq93bqxF2WidrXnF6XdIpd2sH0grrDwRbUcWAiEAzTNOkyjdWtt+3eZgJf1TQJwY0I7ULwbczpz9zjUd8O0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":438628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgd/fOCRA9TVsSAnZWagAATnsP/0TX4J1YuC6iTMm7y10l\ng3v+LUqgbYQTjp/J7zWvT65+E+1kQYD2zSgbjtFKSS6ySgP0+JjwGCSjZzUE\ncQcyorV1WaAriEcLCKktW1JjClwK5mgWV6rh95+qAdArMfj/aPKzPAvPI/qa\nPQxcH744z4uiMWMyqs+9wrXZRj0ZP5yRGgP4DKZ6Z2qvfr7U8nPL150xhnIz\n4SaPMrp0Hr9+1M1gg44xJ/CVeL55MnN5iExHeJ8D1HtYFn2BiaXwu1bRBmbw\nP5/3ge76e8mv7sDH7lLvLcrX71lZHKn3RT32dhjoEsf3+QIJq6W2CYlMKVVr\nkGmMhVf361AIJmtkWPiN2d6rki6VJEsG+nUi76Vvha241wOHmwPusVoR9yTr\nGwJJqx6kFe+15X467gIcgni8JxXQfjJupWbdSxQD77dQSDUjAOMBYmM324Sy\nepVzBgJuVWdqqYYmca/pQoa7iUBABnlh0OtN2aKu0p4jMAkVs9qZyrd2Ihug\nVVpStOxhJ4fxs4UhoR5TtAG07B4HOa/q0Cbr0bePgbS0jo0d1iQnpa+DH3mi\n0tKQqiPHVTesrTuAzYnbZYPsj6gBz8KG7aiYS8g7hse2cu4mB12vLibvU0NZ\nGQ67mno70lQZCSiUrcaVqYBmalZu8qlm8JCuJnzpxjlhZe7eWKfqqBXVy9Xs\n4XRb\r\n=soEN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# Minimongo\n\nA client-side MongoDB implementation which supports basic queries, including some geospatial ones.\n\nUses code from Meteor.js minimongo package, reworked to support more geospatial queries and made npm+browserify friendly. It was forked in January 2014.\n\nIt is either IndexedDb backed (IndexedDb), WebSQL backed (WebSQLDb), Local storage backed (LocalStorageDb) or in memory only (MemoryDb).\n\nAutoselection is possible with `utils.autoselectLocalDb(options, success, error)`. success is called with the selected database.\n\n## Fork\n\nForked from https://github.com/mWater/minimongo as we need MemoryDb.find().fetch() to be synchronous, as it is in Meteor. This\nallows integration with Tracker (computations are invalidated properly).\n\nCurrently based on 4.5.0 - [commit 24d9d8677e489679c3e87b053f589a16083ea9a9](https://github.com/mWater/minimongo/commit/24d9d8677e489679c3e87b053f589a16083ea9a9)\n\n## Usage\n\nMinimongo is designed to be used with browserify.\n\n```javascript\n\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar LocalDb = minimongo.MemoryDb;\n\n// Create local db (in memory database with no backing)\ndb = new LocalDb();\n\n// Add a collection to the database\ndb.addCollection(\"animals\");\n\ndoc = { species: \"dog\", name: \"Bingo\" };\n\n// Always use upsert for both inserts and modifies\ndb.animals.upsert(doc, function() {\n\t// Success:\n\n\t// Query dog (with no query options beyond a selector)\n\tdb.animals.findOne({ species:\"dog\" }, {}, function(res) {\n\t\tconsole.log(\"Dog's name is: \" + res.name);\n\t});\n});\n```\n\n### Upserting\n\n`db.sometable.upsert(docs, bases, success, error)` can take either a single document or multiple documents (array) for the first and second parameter.\n\ndocs is the document(s) to upsert. If bases is present, it is the base version on which the update is based. It can be omitted to use the current cached value\nas the base, or put as `null` to force an overwrite (a true upsert, not a patch)\n\n### Finding\n\n`db.sometable.find(selector, options).fetch(success, error)`\n\nselector is a standard MongoDB selector, e.g. `{ x: 5, y: { $in: ['a', 'b'] } }`\n\noptions are MongoDB find options: e.g. `{ limit: 10 }`, `{ sort: [\"x\"] }`\n\n### Caching\n\nA set of rows can be cached in a local database. Call \n\n`db.sometable.cache(docs, selector, options, success, error)`\n\nselector and options are the selector and options that were used to perform the find that produced docs. The local database will add/remove/update its local copy appropriately.\n\n### Seeding\n\nA set of rows can be seeded in a local database. Seeding does not overwrite an existing row; it only makes sure that a row with that _id exists.\n\n`db.sometable.seed(docs, success, error)`\n\n### Un-caching\n\nCached rows matching a selector can be removed with:\n\n`db.sometable.uncache(selector, success, error)`\n\nIt will not affect upserted rows.\n\n### Resolving upserts\n\nUpserts are stored in local databases in a special state to record that they are upserts, not cached rows. The base document on which the upsert is based is also stored. For example, if a row starts in cached state with `{ x:1 }` and is upserted to `{ x: 2 }`, both the upserted and the original state are stored. This allows the server to do 3-way merging and apply only the changes.\n\nTo resolve the upsert (for example once sent to central db), use resolveUpserts on collection\n\n`db.sometable.resolveUpserts(upserts, success, error)` takes the list of upserts to resolve\n\n`resolveUpserts` does not resolve an upsert if another upsert on the same row has taken place. Instead, the base value is updated (since the change has been accepted by the server) but the new upserted value is left alone.\n\n### ReplicatingDb\n\nKeeps two local databases in sync. Finds go only to master.\n\n### IndexedDb\n\nTo make a database backed by IndexedDb:\n\n```javascript\n\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar IndexedDb = minimongo.IndexedDb;\n\n// Create IndexedDb\ndb = new IndexedDb({namespace: \"mydb\"}, function() {\n\t// Add a collection to the database\n\tdb.addCollection(\"animals\", function() {\n\t\tdoc = { species: \"dog\", name: \"Bingo\" };\n\n\t\t// Always use upsert for both inserts and modifies\n\t\tdb.animals.upsert(doc, function() {\n\t\t\t// Success:\n\n\t\t\t// Query dog (with no query options beyond a selector)\n\t\t\tdb.animals.findOne({ species:\"dog\" }, {}, function(res) {\n\t\t\t\tconsole.log(\"Dog's name is: \" + res.name);\n\t\t\t});\n\t\t});\n\t});\n}, function() { alert(\"some error!\"); });\n\n```\n\n### Caching\n\nRows can be cached without creating a pending upsert. This is done automatically when HybridDb uploads to a remote database with the returned upserted rows. It is also done when a query is performed on HybridDb: the results are cached in the local db and the query is re-performed on the local database.\n\nThe field `_rev`, if present is used to prevent overwriting with older versions. This is the odd scenario where an updated version of a row is present, but an older query to the server is delayed in returning. To prevent this race condition from giving stale data, the _rev field is used.\n\n### HybridDb\n\nCombines results from the local database with remote data. Multiple options can be specified at the collection level and then overriden at the find/findOne level:\n\n**interim**: (default true) true to return interim results from the local database before the (slower) remote database has returned. If the remote database gives different results, the callback will be called a second time. This approach allows fast responses but with subsequent correction if the server has differing information.\n\n**cacheFind**: (default true) true to cache the `find` results from the remote database in the local database\n\n**cacheFindOne**: (default true) true to cache the `findOne` results from the remote database in the local database\n\n**shortcut**: (default false) true to return `findOne` results if any matching result is found in the local database. Useful for documents that change rarely.\n\n**useLocalOnRemoteError**: (default true) true to use local results if the remote find fails. Only applies if interim is false.\n\n\nTo keep a local database and a remote database in sync, create a HybridDb:\n\n```\nhybridDb = new HybridDb(localDb, remoteDb)\n```\n\nBe sure to add the same collections to all three databases (local, hybrid and remote).\n\nThen query the hybridDb (`find` and `findOne`) to have it get results and correctly combine them with any pending local results. If you are not interested in caching results, add `{ cacheFind: false, cacheFindOne: false }` to the options of `find` or `findOne` or to the `addCollection` options.\n\nWhen upserts and removes are done on the HybridDb, they are queued up in the LocalDb until `hybridDb.upload(success, error)` is called.\n\n`upload` will go through each collection and send any upserts or removes to the remoteDb.\n\n`findOne` will not return an interim `null` result, but will only return interim results when one is present.\n\n### RemoteDb\n\nUses AJAX-JSON calls to an API to query a real Mongo database. API is simple and contains only query, upsert, patch and remove commands.\n\nIf the `client` field is passed to the constructor, it is appended as a query parameters (e.g. `?client=1234`) to each request made.\n\nExample code:\n\n```\nremoteDb = new minimongo.RemoteDb(\"http://someserver.com/api/\", \"myclientid123\")\n```\n\nThis would create a remote db that would make the following call to the api for a find to collection abc:\n\n`GET http://someserver.com/api/abc?client=myclientid123`\n\nThe client is optional and is a string that is passed in each call only to make authentication easier.\n\nThe API that RemoteDb should support four HTTP methods for each collection:\n\n#### GET `/<collection>`\n\nPerforms a query, returning an array of results. GET query parameters are:\n\n**selector** (optional) : JSON of query, in MongoDB format. e.g. `{\"a\": 1}` to find records with field `a` having value `1`\n**fields** (optional) : JSON object indicating which fields to return in MongoDB format. e.g. `{\"a\": 1}` to return only field `a` and `_id`\n**sort** (optional) : JSON of MongoDB sort field. e.g. `[\"a\"]` to sort ascending by `a`, or `[[\"a\",\"desc\"]]` to sort descending by `a`\n**limit** (optional) : Maximum records to return e.g. `100`\n\nPossible HTTP response codes:\n\n**200** : normal response\n**401** : client was invalid\n\n#### POST `/<collection>`\n\nPerforms a single upsert, returning the upserted row. POST value is the document to upsert. Possible HTTP response codes:\n\n**200** : document was upserted. Returns the upserted object (see notes below on merging)\n**400** : document did not pass validation\n**401** : client was invalid or not present\n**403** : permission denied to upsert\n**409** : another client was upserting same document. Try again.\n**410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### PATCH `/<collection>/<_id>`\n\nPerforms a patch, returning the upserted row. PATCH value is the following structure:\n\n```\n{\n\tdoc: <the document in its new form>\n\tbase: <base document on which the changes were made>\n}\n```\n\nFor example, to change `{ x:1, y:1 }` to set x to be 2, PATCH would send\n```\n{\n\tdoc: { x:2, y: 1 }\n\tbase: { x:1, y: 1 }\n}\n```\n\nPossible HTTP response codes:\n\n**200** : document was upserted. Returns the upserted object\n**400** : document did not pass validation\n**401** : client was invalid or not present\n**403** : permission denied to upsert\n**409** : another client was upserting same document. Try again.\n**410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### DELETE `/<collection>/<_id>`\n\nNote: the RemoteDb does not support remove({ filter }), but only removing a single document by _id!!\n\nRemoves to the local collection are converted into a series of _ids to be removed when sent to the server.\n\nRemoves a document. _id of the document to remove\n\n**200** : document was removed\n**401** : client was invalid or not present\n**403** : permission denied to remove\n**410** : document was already removed and cannot be removed again\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n### Merging\n\nMinimongo is designed to work with a server that performs three-way merging of documents that are being upserted by multiple users.\n\nIt can also be used with a simple server that just overwrites documents completely on upsert, just taking the doc value of PATCH, though this is not recommended.\n\n## Testing\n\nTo test, run `testem` in the main directory.\n\nTo test a RemoteDb implementation, use `test/RemoteDbTests.coffee`. Server must have a collection called scratch with fields as specified at top of tests file.\n","gitHead":"1c521ed16ab6078dedb6de03c7e4942bd66e2bea","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds-org","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"6.4.1","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"10.15.3","dependencies":{"async":"^1.4.2","lodash":"^4.17.21"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo_0.2.1_1618474958311_0.6741932039009892","host":"s3://npm-registry-packages"}},"0.2.3":{"name":"nqm-minimongo","version":"0.2.3","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.2.3","maintainers":[{"name":"nqminds-org","email":"nqminds@gmail.com"},{"name":"iglautier","email":"ivan@nquiringminds.com"},{"name":"mereacre","email":"mereacre@gmail.com"},{"name":"antmcc","email":"anthony@nquiringminds.com"},{"name":"toby.ealden","email":"toby.ealden@gmail.com"},{"name":"aloisklink","email":"alois.klink@gmail.com"},{"name":"cbrafter","email":"craig@nquiringminds.com"},{"name":"ashleysetter","email":"ash@nquiringminds.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"31ad29c1486694af561e40f89602e9efe55af985","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.2.3.tgz","fileCount":50,"integrity":"sha512-dkFvBax4JTkMKALMv16Nl9p1VGTMmjJPj2N9uI+wMMjer96OOPtaJkXc8/S6c88rH8/DMer9JrL6Wabb67A6iQ==","signatures":[{"sig":"MEYCIQC0GaZn4PGfm7pXF33GLkvFq3tE4ZgyAuYWr1HgfYGaQAIhANktDY0hoi0NhMXZF3eYGh+nAUVRTdzcqawO3sJcvPhu","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":438943,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgd/qjCRA9TVsSAnZWagAA/ToQAJyPixkwg4O3fzcLiMp4\nRHdDwDyeeKTMMDqOi11DIk0dFAS9kwFK1S+tUzIYjDFUJI4WHZQ81NwOLagR\nlHAQURo2RsP4Oi/BE3GNbPuNg4U73U/pHvb6j8NBoCtbK8t6S38nVSSRKJ2r\ngmFdcx51B5zjcpyoYQ08PnrDn8w7ClfrMt6EvtWByrQQl331CIjl2xqBo6yH\nJmSi2ofItc5kNckZqDdQ9Qih3iAd9ehqnkPZSoXFR6lF3so54S01EIlN38CF\nVxqfoWUQ80TonFg9z2tFTfs8Imli7d2VK/ehFHPJeP6Xypl1YypvSLO0PQce\ngzMYYtFOo45+jNeY4+5GRTqvRuYEbNtJmScbZMxX+f6jsCNPVJsD4bhfwfzW\nawPYDxJ1vfvA/ZzOTOS1ekuyjKmA9maoLLva5CueiZiIH6OMapPmZ6pDXwis\njxH9aUZhj4V5GQLnxi8WVCC5e4oOjG7I/WxW/EUvktXSeA2e6htup/PIfycW\nmYmvikxVc+UF/kxUEBqbqpuVQId27a1Sppb8b8sTZrlWYUUlCJtYjUbi9Fux\n2J0kgR0oOL/AWyMBaI7SGbrv51JY/St11fmxH0vbChoCuLdcJv0KVC5z0c32\n9s1XpK+b64GWg1jt/Swtnp5qHeVP+Iht9uAnW9J5Ifiggf77QzBf+wMyt/eq\n4H7c\r\n=OYtg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# Minimongo\n\nA client-side MongoDB implementation which supports basic queries, including some geospatial ones.\n\nUses code from Meteor.js minimongo package, reworked to support more geospatial queries and made npm+browserify\nfriendly. It was forked in January 2014.\n\nIt is either IndexedDb backed (IndexedDb), WebSQL backed (WebSQLDb), Local storage backed (LocalStorageDb) or in memory\nonly (MemoryDb).\n\nAutoselection is possible with `utils.autoselectLocalDb(options, success, error)`. success is called with the selected\ndatabase.\n\n## Fork\n\nForked from https://github.com/mWater/minimongo as we need MemoryDb.find().fetch() to be synchronous, as it is in\nMeteor. This allows integration with Tracker (computations are invalidated properly).\n\nCurrently based on 4.5.0 -\n[commit 24d9d8677e489679c3e87b053f589a16083ea9a9](https://github.com/mWater/minimongo/commit/24d9d8677e489679c3e87b053f589a16083ea9a9)\n\n## Build\n\nn.b. requires node v10.x to build (because of gulp build).\n\n```\nnpx gulp\n```\n\n## Usage\n\nMinimongo is designed to be used with browserify.\n\n```javascript\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar LocalDb = minimongo.MemoryDb;\n\n// Create local db (in memory database with no backing)\ndb = new LocalDb();\n\n// Add a collection to the database\ndb.addCollection(\"animals\");\n\ndoc = {species: \"dog\", name: \"Bingo\"};\n\n// Always use upsert for both inserts and modifies\ndb.animals.upsert(doc, function () {\n  // Success:\n\n  // Query dog (with no query options beyond a selector)\n  db.animals.findOne({species: \"dog\"}, {}, function (res) {\n    console.log(\"Dog's name is: \" + res.name);\n  });\n});\n```\n\n### Upserting\n\n`db.sometable.upsert(docs, bases, success, error)` can take either a single document or multiple documents (array) for\nthe first and second parameter.\n\ndocs is the document(s) to upsert. If bases is present, it is the base version on which the update is based. It can be\nomitted to use the current cached value as the base, or put as `null` to force an overwrite (a true upsert, not a patch)\n\n### Finding\n\n`db.sometable.find(selector, options).fetch(success, error)`\n\nselector is a standard MongoDB selector, e.g. `{ x: 5, y: { $in: ['a', 'b'] } }`\n\noptions are MongoDB find options: e.g. `{ limit: 10 }`, `{ sort: [\"x\"] }`\n\n### Caching\n\nA set of rows can be cached in a local database. Call\n\n`db.sometable.cache(docs, selector, options, success, error)`\n\nselector and options are the selector and options that were used to perform the find that produced docs. The local\ndatabase will add/remove/update its local copy appropriately.\n\n### Seeding\n\nA set of rows can be seeded in a local database. Seeding does not overwrite an existing row; it only makes sure that a\nrow with that \\_id exists.\n\n`db.sometable.seed(docs, success, error)`\n\n### Un-caching\n\nCached rows matching a selector can be removed with:\n\n`db.sometable.uncache(selector, success, error)`\n\nIt will not affect upserted rows.\n\n### Resolving upserts\n\nUpserts are stored in local databases in a special state to record that they are upserts, not cached rows. The base\ndocument on which the upsert is based is also stored. For example, if a row starts in cached state with `{ x:1 }` and is\nupserted to `{ x: 2 }`, both the upserted and the original state are stored. This allows the server to do 3-way merging\nand apply only the changes.\n\nTo resolve the upsert (for example once sent to central db), use resolveUpserts on collection\n\n`db.sometable.resolveUpserts(upserts, success, error)` takes the list of upserts to resolve\n\n`resolveUpserts` does not resolve an upsert if another upsert on the same row has taken place. Instead, the base value\nis updated (since the change has been accepted by the server) but the new upserted value is left alone.\n\n### ReplicatingDb\n\nKeeps two local databases in sync. Finds go only to master.\n\n### IndexedDb\n\nTo make a database backed by IndexedDb:\n\n```javascript\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar IndexedDb = minimongo.IndexedDb;\n\n// Create IndexedDb\ndb = new IndexedDb(\n  {namespace: \"mydb\"},\n  function () {\n    // Add a collection to the database\n    db.addCollection(\"animals\", function () {\n      doc = {species: \"dog\", name: \"Bingo\"};\n\n      // Always use upsert for both inserts and modifies\n      db.animals.upsert(doc, function () {\n        // Success:\n\n        // Query dog (with no query options beyond a selector)\n        db.animals.findOne({species: \"dog\"}, {}, function (res) {\n          console.log(\"Dog's name is: \" + res.name);\n        });\n      });\n    });\n  },\n  function () {\n    alert(\"some error!\");\n  }\n);\n```\n\n### Caching\n\nRows can be cached without creating a pending upsert. This is done automatically when HybridDb uploads to a remote\ndatabase with the returned upserted rows. It is also done when a query is performed on HybridDb: the results are cached\nin the local db and the query is re-performed on the local database.\n\nThe field `_rev`, if present is used to prevent overwriting with older versions. This is the odd scenario where an\nupdated version of a row is present, but an older query to the server is delayed in returning. To prevent this race\ncondition from giving stale data, the \\_rev field is used.\n\n### HybridDb\n\nCombines results from the local database with remote data. Multiple options can be specified at the collection level and\nthen overriden at the find/findOne level:\n\n**interim**: (default true) true to return interim results from the local database before the (slower) remote database\nhas returned. If the remote database gives different results, the callback will be called a second time. This approach\nallows fast responses but with subsequent correction if the server has differing information.\n\n**cacheFind**: (default true) true to cache the `find` results from the remote database in the local database\n\n**cacheFindOne**: (default true) true to cache the `findOne` results from the remote database in the local database\n\n**shortcut**: (default false) true to return `findOne` results if any matching result is found in the local database.\nUseful for documents that change rarely.\n\n**useLocalOnRemoteError**: (default true) true to use local results if the remote find fails. Only applies if interim is\nfalse.\n\nTo keep a local database and a remote database in sync, create a HybridDb:\n\n```\nhybridDb = new HybridDb(localDb, remoteDb)\n```\n\nBe sure to add the same collections to all three databases (local, hybrid and remote).\n\nThen query the hybridDb (`find` and `findOne`) to have it get results and correctly combine them with any pending local\nresults. If you are not interested in caching results, add `{ cacheFind: false, cacheFindOne: false }` to the options of\n`find` or `findOne` or to the `addCollection` options.\n\nWhen upserts and removes are done on the HybridDb, they are queued up in the LocalDb until\n`hybridDb.upload(success, error)` is called.\n\n`upload` will go through each collection and send any upserts or removes to the remoteDb.\n\n`findOne` will not return an interim `null` result, but will only return interim results when one is present.\n\n### RemoteDb\n\nUses AJAX-JSON calls to an API to query a real Mongo database. API is simple and contains only query, upsert, patch and\nremove commands.\n\nIf the `client` field is passed to the constructor, it is appended as a query parameters (e.g. `?client=1234`) to each\nrequest made.\n\nExample code:\n\n```\nremoteDb = new minimongo.RemoteDb(\"http://someserver.com/api/\", \"myclientid123\")\n```\n\nThis would create a remote db that would make the following call to the api for a find to collection abc:\n\n`GET http://someserver.com/api/abc?client=myclientid123`\n\nThe client is optional and is a string that is passed in each call only to make authentication easier.\n\nThe API that RemoteDb should support four HTTP methods for each collection:\n\n#### GET `/<collection>`\n\nPerforms a query, returning an array of results. GET query parameters are:\n\n**selector** (optional) : JSON of query, in MongoDB format. e.g. `{\"a\": 1}` to find records with field `a` having value\n`1` **fields** (optional) : JSON object indicating which fields to return in MongoDB format. e.g. `{\"a\": 1}` to return\nonly field `a` and `_id` **sort** (optional) : JSON of MongoDB sort field. e.g. `[\"a\"]` to sort ascending by `a`, or\n`[[\"a\",\"desc\"]]` to sort descending by `a` **limit** (optional) : Maximum records to return e.g. `100`\n\nPossible HTTP response codes:\n\n**200** : normal response **401** : client was invalid\n\n#### POST `/<collection>`\n\nPerforms a single upsert, returning the upserted row. POST value is the document to upsert. Possible HTTP response\ncodes:\n\n**200** : document was upserted. Returns the upserted object (see notes below on merging) **400** : document did not\npass validation **401** : client was invalid or not present **403** : permission denied to upsert **409** : another\nclient was upserting same document. Try again. **410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### PATCH `/<collection>/<_id>`\n\nPerforms a patch, returning the upserted row. PATCH value is the following structure:\n\n```\n{\n\tdoc: <the document in its new form>\n\tbase: <base document on which the changes were made>\n}\n```\n\nFor example, to change `{ x:1, y:1 }` to set x to be 2, PATCH would send\n\n```\n{\n\tdoc: { x:2, y: 1 }\n\tbase: { x:1, y: 1 }\n}\n```\n\nPossible HTTP response codes:\n\n**200** : document was upserted. Returns the upserted object **400** : document did not pass validation **401** : client\nwas invalid or not present **403** : permission denied to upsert **409** : another client was upserting same document.\nTry again. **410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### DELETE `/<collection>/<_id>`\n\nNote: the RemoteDb does not support remove({ filter }), but only removing a single document by \\_id!!\n\nRemoves to the local collection are converted into a series of \\_ids to be removed when sent to the server.\n\nRemoves a document. \\_id of the document to remove\n\n**200** : document was removed **401** : client was invalid or not present **403** : permission denied to remove **410**\n: document was already removed and cannot be removed again\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n### Merging\n\nMinimongo is designed to work with a server that performs three-way merging of documents that are being upserted by\nmultiple users.\n\nIt can also be used with a simple server that just overwrites documents completely on upsert, just taking the doc value\nof PATCH, though this is not recommended.\n\n## Testing\n\nTo test, run `testem` in the main directory.\n\nTo test a RemoteDb implementation, use `test/RemoteDbTests.coffee`. Server must have a collection called scratch with\nfields as specified at top of tests file.\n","gitHead":"1c521ed16ab6078dedb6de03c7e4942bd66e2bea","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds-org","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"6.4.1","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"10.15.3","dependencies":{"async":"^1.4.2","lodash":"^4.17.21"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo_0.2.3_1618475683264_0.788046048657645","host":"s3://npm-registry-packages"}},"0.2.4":{"name":"nqm-minimongo","version":"0.2.4","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","_id":"nqm-minimongo@0.2.4","maintainers":[{"name":"nqminds-org","email":"nqminds@gmail.com"},{"name":"iglautier","email":"ivan@nquiringminds.com"},{"name":"mereacre","email":"mereacre@gmail.com"},{"name":"antmcc","email":"anthony@nquiringminds.com"},{"name":"toby.ealden","email":"toby.ealden@gmail.com"},{"name":"aloisklink","email":"alois.klink@gmail.com"},{"name":"cbrafter","email":"craig@nquiringminds.com"},{"name":"ashleysetter","email":"ash@nquiringminds.com"}],"homepage":"https://github.com/nqminds/minimongo","bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"dist":{"shasum":"7144f84d33d43e6bd82dce38f3c6e54fefa7f799","tarball":"https://registry.npmjs.org/nqm-minimongo/-/nqm-minimongo-0.2.4.tgz","fileCount":50,"integrity":"sha512-na1eJrgoJU+qeK77fKB+6AKZiAp7Cffb+HWGXSDpA13RRYxBbtrAnCyPNVpB2BrnOmy0JDiRna8Mp85EnmdJ9A==","signatures":[{"sig":"MEQCIA8h0EDOP7uVUNhRZqv6iG3LcuM5u5+ClL/iglN1xvdJAiA0TNAn91oHmL/JGguCYVnZXidenKfVfvkbdxuZHd3gpw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":438935,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgd/wECRA9TVsSAnZWagAA7IIP/1LBjK4LVsbyO2fVsdzF\npZQKt/jvzpFDUlwl+kNrcWjBir+DDZ5Oio5uj4lFgq6538exqdqsp0VntwxF\ns+Fp0EdHfbo1XXgS3ntblDEArnrEEAReZmAq1BzGtH1xkHEVpRIU5/96HfBr\n4D5ngGoL+CzWQxOYAO/Bf2m3F/Xlb/tQPD5Aj32DjAjmJTaM+9n1iaHpok4A\nwRGJgYevs/pzDKUftJ51nDmCH7d/JIqO/HPjRhmJR9JlrlA0ezQULtqIbhIq\n9v/7NzPWtcUWqfJPCo+J7XIUpsCR//8D8OaYRRN8Ifx5CoRiGxZS3jQkpAzw\nUO9e/ty/380Diel9hiXrzCzLpFDFRZpsjMjaAMcy3P1GekbCvR9gLUZWGFKy\ni0jCWn9nTdS7peh3GCOKsB3SdbmDpOf7EnRAhdswqwatKo6CNpjr74gszZ72\naWc6aC+zprwT7VXv+islecah2n72AmPDj9Oi2RZOKvmFocjmntlhlvyTrIiF\nyxnK0hgwJdXmIRLXOu/LFUxx9QfaKOLh8ZoP88+UJqqBpXfBTj7HclwlMfEJ\nh3pPfVUXzz3eFPfWhcvaDP8nLe9vr2OTKc0oe/nCJdN1LnUWCSfvx5GsCot6\nrRLonmSHC2wgAKhi11cGbkmNOU5JR5e232b8y1nZzNfNyMslXViB646eLh3F\nssZ5\r\n=gxXt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# Minimongo\n\nA client-side MongoDB implementation which supports basic queries, including some geospatial ones.\n\nUses code from Meteor.js minimongo package, reworked to support more geospatial queries and made npm+browserify\nfriendly. It was forked in January 2014.\n\nIt is either IndexedDb backed (IndexedDb), WebSQL backed (WebSQLDb), Local storage backed (LocalStorageDb) or in memory\nonly (MemoryDb).\n\nAutoselection is possible with `utils.autoselectLocalDb(options, success, error)`. success is called with the selected\ndatabase.\n\n## Fork\n\nForked from https://github.com/mWater/minimongo as we need MemoryDb.find().fetch() to be synchronous, as it is in\nMeteor. This allows integration with Tracker (computations are invalidated properly).\n\nCurrently based on 4.5.0 -\n[commit 24d9d8677e489679c3e87b053f589a16083ea9a9](https://github.com/mWater/minimongo/commit/24d9d8677e489679c3e87b053f589a16083ea9a9)\n\n## Build\n\nn.b. requires node v10.x to build (because of gulp build).\n\n```\nnpx gulp\n```\n\n## Usage\n\nMinimongo is designed to be used with browserify.\n\n```javascript\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar LocalDb = minimongo.MemoryDb;\n\n// Create local db (in memory database with no backing)\ndb = new LocalDb();\n\n// Add a collection to the database\ndb.addCollection(\"animals\");\n\ndoc = {species: \"dog\", name: \"Bingo\"};\n\n// Always use upsert for both inserts and modifies\ndb.animals.upsert(doc, function () {\n  // Success:\n\n  // Query dog (with no query options beyond a selector)\n  db.animals.findOne({species: \"dog\"}, {}, function (res) {\n    console.log(\"Dog's name is: \" + res.name);\n  });\n});\n```\n\n### Upserting\n\n`db.sometable.upsert(docs, bases, success, error)` can take either a single document or multiple documents (array) for\nthe first and second parameter.\n\ndocs is the document(s) to upsert. If bases is present, it is the base version on which the update is based. It can be\nomitted to use the current cached value as the base, or put as `null` to force an overwrite (a true upsert, not a patch)\n\n### Finding\n\n`db.sometable.find(selector, options).fetch(success, error)`\n\nselector is a standard MongoDB selector, e.g. `{ x: 5, y: { $in: ['a', 'b'] } }`\n\noptions are MongoDB find options: e.g. `{ limit: 10 }`, `{ sort: [\"x\"] }`\n\n### Caching\n\nA set of rows can be cached in a local database. Call\n\n`db.sometable.cache(docs, selector, options, success, error)`\n\nselector and options are the selector and options that were used to perform the find that produced docs. The local\ndatabase will add/remove/update its local copy appropriately.\n\n### Seeding\n\nA set of rows can be seeded in a local database. Seeding does not overwrite an existing row; it only makes sure that a\nrow with that \\_id exists.\n\n`db.sometable.seed(docs, success, error)`\n\n### Un-caching\n\nCached rows matching a selector can be removed with:\n\n`db.sometable.uncache(selector, success, error)`\n\nIt will not affect upserted rows.\n\n### Resolving upserts\n\nUpserts are stored in local databases in a special state to record that they are upserts, not cached rows. The base\ndocument on which the upsert is based is also stored. For example, if a row starts in cached state with `{ x:1 }` and is\nupserted to `{ x: 2 }`, both the upserted and the original state are stored. This allows the server to do 3-way merging\nand apply only the changes.\n\nTo resolve the upsert (for example once sent to central db), use resolveUpserts on collection\n\n`db.sometable.resolveUpserts(upserts, success, error)` takes the list of upserts to resolve\n\n`resolveUpserts` does not resolve an upsert if another upsert on the same row has taken place. Instead, the base value\nis updated (since the change has been accepted by the server) but the new upserted value is left alone.\n\n### ReplicatingDb\n\nKeeps two local databases in sync. Finds go only to master.\n\n### IndexedDb\n\nTo make a database backed by IndexedDb:\n\n```javascript\n// Require minimongo\nvar minimongo = require(\"minimongo\");\n\nvar IndexedDb = minimongo.IndexedDb;\n\n// Create IndexedDb\ndb = new IndexedDb(\n  {namespace: \"mydb\"},\n  function () {\n    // Add a collection to the database\n    db.addCollection(\"animals\", function () {\n      doc = {species: \"dog\", name: \"Bingo\"};\n\n      // Always use upsert for both inserts and modifies\n      db.animals.upsert(doc, function () {\n        // Success:\n\n        // Query dog (with no query options beyond a selector)\n        db.animals.findOne({species: \"dog\"}, {}, function (res) {\n          console.log(\"Dog's name is: \" + res.name);\n        });\n      });\n    });\n  },\n  function () {\n    alert(\"some error!\");\n  }\n);\n```\n\n### Caching\n\nRows can be cached without creating a pending upsert. This is done automatically when HybridDb uploads to a remote\ndatabase with the returned upserted rows. It is also done when a query is performed on HybridDb: the results are cached\nin the local db and the query is re-performed on the local database.\n\nThe field `_rev`, if present is used to prevent overwriting with older versions. This is the odd scenario where an\nupdated version of a row is present, but an older query to the server is delayed in returning. To prevent this race\ncondition from giving stale data, the \\_rev field is used.\n\n### HybridDb\n\nCombines results from the local database with remote data. Multiple options can be specified at the collection level and\nthen overriden at the find/findOne level:\n\n**interim**: (default true) true to return interim results from the local database before the (slower) remote database\nhas returned. If the remote database gives different results, the callback will be called a second time. This approach\nallows fast responses but with subsequent correction if the server has differing information.\n\n**cacheFind**: (default true) true to cache the `find` results from the remote database in the local database\n\n**cacheFindOne**: (default true) true to cache the `findOne` results from the remote database in the local database\n\n**shortcut**: (default false) true to return `findOne` results if any matching result is found in the local database.\nUseful for documents that change rarely.\n\n**useLocalOnRemoteError**: (default true) true to use local results if the remote find fails. Only applies if interim is\nfalse.\n\nTo keep a local database and a remote database in sync, create a HybridDb:\n\n```\nhybridDb = new HybridDb(localDb, remoteDb)\n```\n\nBe sure to add the same collections to all three databases (local, hybrid and remote).\n\nThen query the hybridDb (`find` and `findOne`) to have it get results and correctly combine them with any pending local\nresults. If you are not interested in caching results, add `{ cacheFind: false, cacheFindOne: false }` to the options of\n`find` or `findOne` or to the `addCollection` options.\n\nWhen upserts and removes are done on the HybridDb, they are queued up in the LocalDb until\n`hybridDb.upload(success, error)` is called.\n\n`upload` will go through each collection and send any upserts or removes to the remoteDb.\n\n`findOne` will not return an interim `null` result, but will only return interim results when one is present.\n\n### RemoteDb\n\nUses AJAX-JSON calls to an API to query a real Mongo database. API is simple and contains only query, upsert, patch and\nremove commands.\n\nIf the `client` field is passed to the constructor, it is appended as a query parameters (e.g. `?client=1234`) to each\nrequest made.\n\nExample code:\n\n```\nremoteDb = new minimongo.RemoteDb(\"http://someserver.com/api/\", \"myclientid123\")\n```\n\nThis would create a remote db that would make the following call to the api for a find to collection abc:\n\n`GET http://someserver.com/api/abc?client=myclientid123`\n\nThe client is optional and is a string that is passed in each call only to make authentication easier.\n\nThe API that RemoteDb should support four HTTP methods for each collection:\n\n#### GET `/<collection>`\n\nPerforms a query, returning an array of results. GET query parameters are:\n\n**selector** (optional) : JSON of query, in MongoDB format. e.g. `{\"a\": 1}` to find records with field `a` having value\n`1` **fields** (optional) : JSON object indicating which fields to return in MongoDB format. e.g. `{\"a\": 1}` to return\nonly field `a` and `_id` **sort** (optional) : JSON of MongoDB sort field. e.g. `[\"a\"]` to sort ascending by `a`, or\n`[[\"a\",\"desc\"]]` to sort descending by `a` **limit** (optional) : Maximum records to return e.g. `100`\n\nPossible HTTP response codes:\n\n**200** : normal response **401** : client was invalid\n\n#### POST `/<collection>`\n\nPerforms a single upsert, returning the upserted row. POST value is the document to upsert. Possible HTTP response\ncodes:\n\n**200** : document was upserted. Returns the upserted object (see notes below on merging) **400** : document did not\npass validation **401** : client was invalid or not present **403** : permission denied to upsert **409** : another\nclient was upserting same document. Try again. **410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### PATCH `/<collection>/<_id>`\n\nPerforms a patch, returning the upserted row. PATCH value is the following structure:\n\n```\n{\n\tdoc: <the document in its new form>\n\tbase: <base document on which the changes were made>\n}\n```\n\nFor example, to change `{ x:1, y:1 }` to set x to be 2, PATCH would send\n\n```\n{\n\tdoc: { x:2, y: 1 }\n\tbase: { x:1, y: 1 }\n}\n```\n\nPossible HTTP response codes:\n\n**200** : document was upserted. Returns the upserted object **400** : document did not pass validation **401** : client\nwas invalid or not present **403** : permission denied to upsert **409** : another client was upserting same document.\nTry again. **410** : document was already removed and cannot be upserted\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n#### DELETE `/<collection>/<_id>`\n\nNote: the RemoteDb does not support remove({ filter }), but only removing a single document by \\_id!!\n\nRemoves to the local collection are converted into a series of \\_ids to be removed when sent to the server.\n\nRemoves a document. \\_id of the document to remove\n\n**200** : document was removed **401** : client was invalid or not present **403** : permission denied to remove **410**\n: document was already removed and cannot be removed again\n\nOn `403` or `410`, the change is automatically discarded in the HybridDb.\n\n### Merging\n\nMinimongo is designed to work with a server that performs three-way merging of documents that are being upserted by\nmultiple users.\n\nIt can also be used with a simple server that just overwrites documents completely on upsert, just taking the doc value\nof PATCH, though this is not recommended.\n\n## Testing\n\nTo test, run `testem` in the main directory.\n\nTo test a RemoteDb implementation, use `test/RemoteDbTests.coffee`. Server must have a collection called scratch with\nfields as specified at top of tests file.\n","gitHead":"1c521ed16ab6078dedb6de03c7e4942bd66e2bea","scripts":{"test":"testem ci","prepublish":"gulp"},"_npmUser":{"name":"nqminds-org","email":"nqminds@gmail.com"},"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"_npmVersion":"6.4.1","description":"Client-side mongo database with server sync over http","directories":{},"_nodeVersion":"10.15.3","dependencies":{"async":"^1.4.2","lodash":"^4.17.21"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"~1.9.0","glob":"^3.2.9","gulp":"^3.8.11","karma":"^0.13.10","lolex":"^1.5.0","sinon":"~1.8.2","testem":"~0.6.7","coffeeify":"~0.6.0","gulp-util":"^2.2.14","browserify":"^3.29.1","gulp-coffee":"^1.4.2","gulp-rename":"^1.2.0","gulp-uglify":"^0.3.1","karma-mocha":"^0.2.0","vinyl-buffer":"0.0.0","coffee-script":"~1.6.3","karma-browserify":"^4.3.0","vinyl-source-stream":"^0.1.1","karma-chrome-launcher":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nqm-minimongo_0.2.4_1618476035727_0.28878845543528797","host":"s3://npm-registry-packages"}}},"time":{"created":"2017-03-05T19:41:37.088Z","modified":"2024-09-05T11:11:40.450Z","0.1.0":"2017-03-05T19:41:37.088Z","0.1.1":"2017-03-05T19:45:13.751Z","0.1.2":"2017-03-05T19:49:00.778Z","0.1.3":"2017-03-05T20:04:38.020Z","0.1.4":"2017-04-13T06:14:31.173Z","0.1.5":"2017-10-31T10:49:44.906Z","0.2.0":"2021-04-14T15:27:39.425Z","0.2.1":"2021-04-15T08:22:38.515Z","0.2.3":"2021-04-15T08:34:43.426Z","0.2.4":"2021-04-15T08:40:35.882Z"},"bugs":{"url":"https://github.com/nqminds/minimongo/issues"},"author":{"name":"Clayton Grassick, toby.ealden@gmail.com"},"license":"LGPLv3","homepage":"https://github.com/nqminds/minimongo","keywords":["mongodb","mongo","minimongo","IndexedDb","WebSQL","storage"],"repository":{"url":"git+https://github.com/nqminds/minimongo.git","type":"git"},"description":"Client-side mongo database with server sync over http","maintainers":[{"email":"ionut@nquiringminds.com","name":"ionut_nqm"},{"email":"npm-bot@nquiringminds.com","name":"nqminds-bot"},{"email":"nqminds@gmail.com","name":"nqminds-org"},{"email":"mereacre@gmail.com","name":"mereacre"},{"email":"antmcc49@gmail.com","name":"antmcc"},{"email":"toby.ealden@gmail.com","name":"toby.ealden"},{"email":"ash@nquiringminds.com","name":"ashleysetter"}],"readme":"","readmeFilename":""}