{"_id":"x2node-dbos","_rev":"44-4797ca0ab6fb9e6bcf42c9ba3a602136","name":"x2node-dbos","description":"SQL database operations.","dist-tags":{"latest":"1.9.1"},"versions":{"1.0.0-beta.0":{"name":"x2node-dbos","version":"1.0.0-beta.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.2.1","x2node-patches":"^1.1.0","x2node-pointers":"^1.1.0","x2node-records":"^2.2.0","x2node-rsparser":"^2.1.1","x2node-validators":"^1.1.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"bf76f03dcb273a7d1522b637317276c1ed0bafb4","_id":"x2node-dbos@1.0.0-beta.0","_shasum":"3c6f817dedf40af9918495ecb1d5913c8d107d92","_from":".","_npmVersion":"4.5.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"3c6f817dedf40af9918495ecb1d5913c8d107d92","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.0-beta.0.tgz","integrity":"sha512-Y1ae5P0wsVMoqbv12Or6RaNtErOYNu072GyZo2LugrUnOfGQgn3j56Hwtw5Je2hr7wQpWl+BDALNJMkQ4Xc/ew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs+yvnyq0k/3CF1f49TAfhAQ6PiiWUwPjURGtQIMawrQIgMnM8ffpdRiE9sPC1RN2LhiMmBctx9f5K0UWrVt+4J9E="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/x2node-dbos-1.0.0-beta.0.tgz_1493156937604_0.6710116120520979"},"directories":{}},"1.0.0-beta.1":{"name":"x2node-dbos","version":"1.0.0-beta.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.2.2","x2node-patches":"^1.1.1","x2node-pointers":"^1.2.0","x2node-records":"^2.2.1","x2node-rsparser":"^2.1.2","x2node-validators":"^1.1.1"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"a9892d414edd74cd81580fbc0b45b1b7708bf79b","_id":"x2node-dbos@1.0.0-beta.1","_shasum":"8b6ab74d6af3aa27e209b63bd1a5bd99ba735d34","_from":".","_npmVersion":"4.5.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"8b6ab74d6af3aa27e209b63bd1a5bd99ba735d34","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.0-beta.1.tgz","integrity":"sha512-d8mreoi6tidlqH5QNp4BXOupph9Cdvv5wT9xaqwJSqa8S+IMaGjA98ojmf4PbPIcPpKMdRQ6nZkHujwG2aw09w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIU36dU6afSo6xir9WpSthldQQ9L5rteT8vlNVozDMggIgTCe8Q6Pf1Anf/fEeKTQh76p7YVfJAuzABWB9ZFWFh38="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/x2node-dbos-1.0.0-beta.1.tgz_1494116731337_0.9795523004140705"},"directories":{}},"1.0.0-beta.2":{"name":"x2node-dbos","version":"1.0.0-beta.2","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.2.2","x2node-patches":"^1.1.1","x2node-pointers":"^1.2.0","x2node-records":"^2.2.1","x2node-rsparser":"^2.1.2","x2node-validators":"^1.1.1"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"338460dbc79d07658bf1d28e8e09f66f290fdd53","_id":"x2node-dbos@1.0.0-beta.2","_shasum":"ca24354a072eab75590bbdd958c405e2e1dd4141","_from":".","_npmVersion":"4.5.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"ca24354a072eab75590bbdd958c405e2e1dd4141","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.0-beta.2.tgz","integrity":"sha512-U4iN0RO+KmWh+K5jo5DhwGe5eqK349gXqfky4K9LXxp5b3GNKVi040//xlAmmJwKpTdrAc3R8NbeRi4kc9Zjwg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBTHlBFLUR8uE97BqCzsCQmVztWZQEutHDQs8tzyQ8lNAiAf+eChWVj+fkhKQ2iv9UzNUyD8E8EDa6JwKfavhy9Ehw=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/x2node-dbos-1.0.0-beta.2.tgz_1494624022116_0.5868520380463451"},"directories":{}},"1.0.0-beta.3":{"name":"x2node-dbos","version":"1.0.0-beta.3","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.0","x2node-patches":"^1.1.2","x2node-pointers":"^1.2.1","x2node-records":"^2.2.2","x2node-rsparser":"^2.1.3","x2node-validators":"^1.1.2"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"a500cced0a85a5d6a0f13d962f1231131868b702","_id":"x2node-dbos@1.0.0-beta.3","_shasum":"f6ec3338a5c0286394d116b1699b9dc75c671d51","_from":".","_npmVersion":"4.5.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"f6ec3338a5c0286394d116b1699b9dc75c671d51","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.0-beta.3.tgz","integrity":"sha512-8/T3srkGPXubu3F7AT0+Sr0cj3HQBLB2ssBzxHAC/sv0gNS67R5YoTOkOb39JuGGqIwYMkBDG60AlJ+xzh31kw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaJAp6BT2e+yql2X07ELpNxwUAV6PbIMRNDkhkGotkAwIhANMWysro1YPy23fDz4VztTDJGNfu0gdmWlsuMQ5H+mPK"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/x2node-dbos-1.0.0-beta.3.tgz_1494716439768_0.03642558213323355"},"directories":{}},"1.0.0":{"name":"x2node-dbos","version":"1.0.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.1","x2node-patches":"^1.1.3","x2node-pointers":"^1.2.2","x2node-records":"^2.2.3","x2node-rsparser":"^2.1.4","x2node-validators":"^1.1.3"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"ebeeda2bc9c09448da78a79f79bebc7b421c580c","_id":"x2node-dbos@1.0.0","_shasum":"c7f8955464dfc775cdfe0fdd61dfc417d2eefc8b","_from":".","_npmVersion":"4.5.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"c7f8955464dfc775cdfe0fdd61dfc417d2eefc8b","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.0.tgz","integrity":"sha512-xQvG5P8DNzLWIt9iYfClGavx+3rUJPKiOh1YhSefXtq2wch/wlNTmRGUG/bcl9JfDlCXATJE9xXU2PNReT8SOA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHel8kAd3rSgw/y5JoPLYksIqr7IXKPB/ojWlDtLcGRcAiBPly0O4xE2S5WSFyKEy0UHSfPDa7Q7RT3+oHeIvfqVVA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/x2node-dbos-1.0.0.tgz_1494884454462_0.7479802728630602"},"directories":{}},"1.0.1":{"name":"x2node-dbos","version":"1.0.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.1","x2node-patches":"^1.1.3","x2node-pointers":"^1.2.2","x2node-records":"^2.2.3","x2node-rsparser":"^2.1.4","x2node-validators":"^1.1.3"},"devDependencies":{"chai":"^3.5.0","eslint":"^3.17.1","mocha":"^3.2.0"},"gitHead":"cff88c24a0f034d68e5b80a0dd018b46e65758ae","_id":"x2node-dbos@1.0.1","_shasum":"ac3e6bb5cdc1da8d62593fc274c2bd1df7c48632","_from":".","_npmVersion":"4.6.1","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"ac3e6bb5cdc1da8d62593fc274c2bd1df7c48632","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.1.tgz","integrity":"sha512-Lf0TeTTBNWmizqGx/ggFRkpqs4gTstpc8dPOTztZhHVVsyt8UtcA1ZhPer0cCpDjU6CGLSuicNmFsbiIrfiKTQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqZOl6Jxib7IfQehQIUWdFq2OzHVtUOF5hGq6ByO/MwgIgbP1HPRVI3XHLj0hgEs5wIaR3fc6q13xLp6+Ys+AYfwI="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.1.tgz_1495231732488_0.8068708954378963"},"directories":{}},"1.0.2":{"name":"x2node-dbos","version":"1.0.2","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.2","x2node-patches":"^1.1.4","x2node-pointers":"^1.2.3","x2node-records":"^2.2.4","x2node-rsparser":"^2.1.5","x2node-validators":"^1.1.4"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.0.0","mocha":"^3.4.2"},"gitHead":"ab05bf2270f4cd4ad8b6e1396195fde61adde221","_id":"x2node-dbos@1.0.2","_shasum":"415fccce68cacc7d365353bec0e26e2a1caa5109","_from":".","_npmVersion":"4.6.1","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"415fccce68cacc7d365353bec0e26e2a1caa5109","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.2.tgz","integrity":"sha512-RjAdSfZpvtbNXqTGeoGm0Br/lO7AY+mHegvHE99/DBqhuVWT19G5MRvSl252z+n2g3rJB1V83y7tqWTsgRcUAg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHEWoOteVAD22Eb+cyha7RF/usaWUT4qCYVyQYtQBFBpAiB9ZCrkIlKP0cl/roRGmqASg/5tvjM68GiUiPOuXOrBSA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.2.tgz_1497899044486_0.7668612888082862"},"directories":{}},"1.0.3":{"name":"x2node-dbos","version":"1.0.3","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.2","x2node-patches":"^1.1.4","x2node-pointers":"^1.2.3","x2node-records":"^2.2.4","x2node-rsparser":"^2.1.5","x2node-validators":"^1.1.5"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.0.0","mocha":"^3.4.2"},"gitHead":"46a7537a92a7388611de4701f6f1d3466df8cfb6","_id":"x2node-dbos@1.0.3","_shasum":"2738d21278e7ba0fd3270ab7abc48a167ee90f69","_from":".","_npmVersion":"4.6.1","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"shasum":"2738d21278e7ba0fd3270ab7abc48a167ee90f69","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.3.tgz","integrity":"sha512-93uIJSwLutlDkUGhyRfeGCW0Da8Ar4plkIYbe/bJDhEXV+rjzQdvm4HPZXw9PbnsjW8L70Gf01Jl9UeWDaEmJg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD36T41cL7kPtssSXtIVpSWqjAf1JkE57JRohIqkqVF+gIgMYoYZp9tuLGfnHFcUasnVowv90FMvyAWTc8+ygET2Uc="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.3.tgz_1497905207621_0.48444946738891304"},"directories":{}},"1.0.4":{"name":"x2node-dbos","version":"1.0.4","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.2","x2node-patches":"^1.1.4","x2node-pointers":"^1.2.3","x2node-records":"^2.2.4","x2node-rsparser":"^2.1.5","x2node-validators":"^1.2.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.0.0","mocha":"^3.4.2"},"gitHead":"2473ab3cc329b99f81ff063dcbc6e416720c2f63","_id":"x2node-dbos@1.0.4","_npmVersion":"5.2.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-CYg2FPeytMzqAns+6aOP8aabQ+C9VRtUTa+SQaqPaSn6gjijlsHkNG0sv5nM+Vtck5VUYKg/ZqYDyzKXijGmRQ==","shasum":"907253bb501e2ad7e8bf078c44d0ca2e37fc4e4c","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGfxa28Sb/yfZBcSlTUM4Kg3EJXdXibAqqKg5j4p6N3QIhAM43xifT8B2ozx5rokMvHy6CvfDWX4RpNhEqG6DELIhR"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.4.tgz_1499811498444_0.5538932830095291"},"directories":{}},"1.0.5":{"name":"x2node-dbos","version":"1.0.5","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.2","x2node-patches":"^1.1.4","x2node-pointers":"^1.2.3","x2node-records":"^2.2.4","x2node-rsparser":"^2.1.5","x2node-validators":"^1.2.1"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.0.0","mocha":"^3.4.2"},"gitHead":"740073fd1fcfc86b4151c38372ff9dc84d235a16","_id":"x2node-dbos@1.0.5","_npmVersion":"5.2.0","_nodeVersion":"4.3.2","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-68jKSyk5qVpAW1Bcn8N2iOmhiEMVY0ABFSCeqp1G3wVcv9XLDRlSR68BsZpwHuyca5Ks4PXruQSXbOspHJBR0Q==","shasum":"a84766d527f6305e343aaff3f8ae4eae04907a7b","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICFppzuuQ8RT+o/gG4kENVaIiKXEJR0Pt+LjEGE5SCYSAiAuYXHookjwo1PSH3tyCcR6xYYRnEr1mU8z3eoOC57duA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.5.tgz_1499893310924_0.3136458187364042"},"directories":{}},"1.0.6":{"name":"x2node-dbos","version":"1.0.6","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.3","x2node-patches":"^1.1.5","x2node-pointers":"^1.2.4","x2node-records":"^2.2.5","x2node-rsparser":"^2.1.6","x2node-validators":"^1.2.2"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"492df6874e4d9060bfbe022d1789c12886332759","_id":"x2node-dbos@1.0.6","_npmVersion":"5.3.0","_nodeVersion":"8.2.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-ZIfRXRSg0w6stSrURLHYXOdglEPwv9Ql+AkAw5s6kp4TbudOyLCXFBNMw1UZqXuy/CY1nQIY/qAZUUCOEbPM/Q==","shasum":"c9d9631db453dbe0f7e34f095046d566c9cc2bb7","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVN+bSB0wwn42UyM+ats55dzQCFc3FkbsVRH2ryxOgHwIged8Sj4pZrNFhE+/19pq1r22HWWBJYQ5HZJZ2nIWaHqw="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.6.tgz_1501604738139_0.21833341615274549"},"directories":{}},"1.0.7":{"name":"x2node-dbos","version":"1.0.7","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.2.3"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"d7ab9d5a3e7d37764af35d67b69f5e3e3543d82c","_id":"x2node-dbos@1.0.7","_npmVersion":"5.3.0","_nodeVersion":"8.2.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-g9dFjYyY2aGdxlAC1jHFnBzbk/u05wef1wq68kVF3HxlCvTApGX9bTqJSUrnq4bPdNZVCGP+eJ6t+y3pGh5CQA==","shasum":"d85e117fe9bf1142cd9337022385b5e2d38211c0","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKQrCtfLe7h2kGabmNUFrCdUT6WyvmxMe8ymr93mY4xgIgGQdtWfG/E8tgWd6QR2NVhxQnA14frxwuyEvEFMDcQjA="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.7.tgz_1501963934752_0.7387806444894522"},"directories":{}},"1.0.8":{"name":"x2node-dbos","version":"1.0.8","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.2.3"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"2a295b09c99879af8d6ab8f0357a98bee1b18dd1","_id":"x2node-dbos@1.0.8","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-vnTU+vPRLODUTq41TfepSftv8+IxluLgRW3l0JSIYbnMTFWby95ERkj/3OyoKBddfL5GVhL6NytwF+Vwu2DPUA==","shasum":"6cb18c61354bdf92d9b0d44f272d6474cb3955b5","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBNZPh/MDmORKAAtQL+mKVVEzna9i+wDRd2ODcgcacQEAiEA5nHCZRnLf97hVxmHjVT30B5gjodFRzfK2k5Kl7RRj2s="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.8.tgz_1504823999052_0.7551619394216686"},"directories":{}},"1.0.9":{"name":"x2node-dbos","version":"1.0.9","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.2.3"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"f13ee895305e8d9839f990521a6c71297f3d62ab","_id":"x2node-dbos@1.0.9","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-H9xMz0xbml95Dmwhh76vejH3Vym0VWgxc9ORUomZtm1ghlTEmnGzQEJLonA90FvdkMJbpTl+NBqaVeST/6zr5Q==","shasum":"c02ac3644fe3438a4454c5438a6470ef8628bad2","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.9.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID6QgmxfVQIGIhnSQVEn/zyZBFDD0raHhRgQ1obkHhIKAiEAwzkSfF+5ePTbjV4JhdIsdPPUma/4+bbdbmCL7hy1RzU="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.9.tgz_1504911104731_0.09208596777170897"},"directories":{}},"1.0.10":{"name":"x2node-dbos","version":"1.0.10","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"c4973b4a61251f4cba79921cc1441be9e9c333c8","_id":"x2node-dbos@1.0.10","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-npasItwmdPN9pqYKaDQQJWjpfRxE+HDkKEhAFRgh1L0o+pG9jLS0W7U5C5CvYWHqUR1B7Gz0CdFMNhFddQwn8Q==","shasum":"a19d567aa2d1911d15f8024af6a3ce2393e30da4","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.10.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDvTtmeypPjWqdhD+C/s02vstIm95f08zdM88h1Z5cccAiBqOHqBUBYaFsD4xhKrNd/FVprf0YEJxzZJBQsxdKrRBQ=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.10.tgz_1505175570301_0.5509783956222236"},"directories":{}},"1.0.11":{"name":"x2node-dbos","version":"1.0.11","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"1d61fa5c1c290df60114e2c1c936540919412663","_id":"x2node-dbos@1.0.11","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-q1JdjLhECUlMxdGKOjdUfigm+YmR95R9whPHHHHjKpxbBU8LSxqMPLNkrSt0pebWvUb+ubxfJExrLY9FH/2pxg==","shasum":"297a62cfd0bebbefa88f85c345656aebf3514c75","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.11.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcKTe1u9kPZlRCUggtcnWm0JcoE/QlcuYISlD8/FbEuAIgO2p2eMY9OUYw//Z5Ay6l4BBHuuWBJjpnZRgLywxOkEY="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.11.tgz_1510598975451_0.7112572065088898"},"directories":{}},"1.0.12":{"name":"x2node-dbos","version":"1.0.12","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"95dd9429d0b823d3a3e5fddfa3fd61b3837e8adf","_id":"x2node-dbos@1.0.12","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-3wJ4vAI+20yRfpgeqWpB58fCZBjP/Hxx+g7jNsQcnD+KAmGhZcdVeHtRLLEWqRZ6mGIg/O7zpbBk+7ppK1BiuA==","shasum":"85b537162c155e24b9b63560ac6ff3a07a1d7235","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.12.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDqyjmJ2gClaHlR/mtM+gJgnK0aX6m1z4ZbvT3gi8BnDAiBQdwQI39M5ZowXcXwdNsq7osuebNNxT1VacSKfz2szmg=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.12.tgz_1510688480513_0.8017685078084469"},"directories":{}},"1.0.13":{"name":"x2node-dbos","version":"1.0.13","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"d99b98b08092273943c0a89e8286402cffe29605","_id":"x2node-dbos@1.0.13","_npmVersion":"5.5.1","_nodeVersion":"8.8.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-jNLJywZM4my+3vNqL1pIm3OoEcrysrgFvaiDGfUQsh7rgI6xI7pom5MCohxKIMloq/nbW4fp1FJrZAKZ2+STIQ==","shasum":"4b1ac16097221b8f712740838395b782086d04e4","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.13.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZA1jmM4DbC+k9vu8QKhF7CIPPXT4AQh5kQ7+cWSMrSwIhAMIeSeXirsXX7EqU6TPavoWiT5x5PjYvs8toNPMksVJg"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.13.tgz_1510770811657_0.24234082433395088"},"directories":{}},"1.0.14":{"name":"x2node-dbos","version":"1.0.14","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"35827334787eaa3aa4bdc033dd32f81781d2b962","_id":"x2node-dbos@1.0.14","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-RRghupoCUihPXGPc6VqdONoCPk9SLl63Vfu9iU1yNFtA/laZ7zP7Q/HItkAAnaf2dDksaZA3K3IT9ZSMjHJEXQ==","shasum":"2ebc946693381dbeb251ca77c85e081be37c4346","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.14.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFdxwqbXtDpjF7i0OERRJH4LRvmNhDu2Y98I9n0A7IhCAiEAyDyupecBgEHdGvag3MlvKNFq532volMC+MGx6GCmn9Q="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.14.tgz_1514317822820_0.5088839109521359"},"directories":{}},"1.0.15":{"name":"x2node-dbos","version":"1.0.15","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.6","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"9d411aca75cce4934821a6ad0ee3070780155e6e","_id":"x2node-dbos@1.0.15","_npmVersion":"5.6.0","_nodeVersion":"9.3.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-i1UVjpgISAnoMGgMtsleYxTzzN8cBYBO59WEQeEJRv3bMjndHfjlbxSvgi0MFpqEnX0EqTUDnvZIMBHv+G9YEA==","shasum":"f02f4b69bbd431242eba72cc4ed8bf7f2100a0b0","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.15.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCn2JiHgxJ0Izg1HdQG3Q0TNDON5SWHksGaiT/Wx0HgzwIgYJfyjHFLIJ6ph7h4okHa7Gawy+2mk3eWKMS2p8PN7WY="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.15.tgz_1515002405518_0.2375775461550802"},"directories":{}},"1.0.16":{"name":"x2node-dbos","version":"1.0.16","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.7","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"ab795b623ba54db1fa586e0bb4ef0c6d7223b8eb","_id":"x2node-dbos@1.0.16","_npmVersion":"5.6.0","_nodeVersion":"9.4.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-8lbZl6MIaoD6MO7LvrHTnYBOYe7FJakQwpbKDI5Hy+YB/qX4xSdT960pqkI9yspgcOTRv/19AXjFgUsWbEmEMw==","shasum":"b140d9e77d9bde2ee1b5b246ee5ba6eef48705fb","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.0.16.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCef3JBNiDEBFZNqNQRyS3C2IKfuF+J1SpgyvQmeKDDUwIhAMwnS2WsGdlhTidQ/bg1sPBqS8N7z1JEkSz+SnKwx4eK"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.0.16.tgz_1516146867451_0.7820573369972408"},"directories":{}},"1.1.0":{"name":"x2node-dbos","version":"1.1.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.7","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"6d9a48e78c1561f5acb94b3c7224ae815231a049","_id":"x2node-dbos@1.1.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-CuVbOw3EGd+tnK+ktld0EvtM3mAejtKJoaW7Bd/K6Z3MOpNGVX3tu+ip8YboKTJXTT8LXmYIjtkRj7J6AeoKEA==","shasum":"d5e5af615e951398976ec184cd4b4262bc82ac35","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDarsmqWNIM0r3Dl7lWEzWlvuV49DD4iPRXAuZ8nTe6hgIhAPwYrAyDPd09ldWfCjaWgluI726icvotOwTruzpcjtlx"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.1.0.tgz_1516572550521_0.5156266409903765"},"directories":{}},"1.1.1":{"name":"x2node-dbos","version":"1.1.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.4","x2node-patches":"^1.1.7","x2node-pointers":"^1.2.5","x2node-records":"^2.2.6","x2node-rsparser":"^2.1.7","x2node-validators":"^1.3.0"},"devDependencies":{"chai":"^3.5.0","eslint":"^4.3.0","mocha":"^3.5.0"},"gitHead":"ed9e7d46bd9e2f3cd1f9012268a0c7caee1f4ed5","_id":"x2node-dbos@1.1.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-/tqFW9Zbl+yQka7040Y9fISGvsX2u38Qeu69TlLnpkKRlfOZNFWaFQse+0yLo++W4WWBZvaY9MHGslZdJcLciA==","shasum":"5c2f3572eae0400ec32bcf0e6762e4e836d4b001","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.1.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClVCqRYanb6yP2CqdT9WpOCNw/tS3zKaeD9YDrb7VBJwIgXmV53/jB+tEawl+PN35oN92iQEonManu7XdCQhohQCU="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos-1.1.1.tgz_1516679445464_0.7602982888929546"},"directories":{}},"1.2.0":{"name":"x2node-dbos","version":"1.2.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.5","x2node-patches":"^1.2.0","x2node-pointers":"^1.2.6","x2node-records":"^2.3.0","x2node-rsparser":"^2.1.8","x2node-validators":"^1.3.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.17.0","mocha":"^5.0.0"},"gitHead":"2da17ff53926758098ce87bdfe3e591e82a08bb6","_id":"x2node-dbos@1.2.0","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-8twEjss0E6UgtcGOBamw2pRidGjv0YkXaLDppKEVlrNdBZp5RzaY0wfFLnuaYRZW/pQGHzGO5QrgEWi6sgmpow==","shasum":"c50d37cd84f47e76643aa75c638a9d66b11994e4","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.2.0.tgz","fileCount":32,"unpackedSize":499300,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID2dch4EVrXIOxCoh2852Xbr+2OgNejjICUCtIRMMFVQAiBEvLdt+09HxE9cIIPTbXVz9h7gsZ4ns4Am+eK+8fd9RA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.2.0_1518046327688_0.08669131339899194"},"_hasShrinkwrap":false},"1.3.0":{"name":"x2node-dbos","version":"1.3.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=4.3.2"},"dependencies":{"x2node-common":"^1.3.5","x2node-patches":"^1.2.1","x2node-pointers":"^1.2.6","x2node-records":"^2.3.0","x2node-rsparser":"^2.1.8","x2node-validators":"^1.3.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.17.0","mocha":"^5.0.0"},"gitHead":"3344ced48e56abf60f2bbdd835aaa8cbd06aeb56","_id":"x2node-dbos@1.3.0","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-M3B5vRoQYVDDmDRpWeOgaParb+LEXCE1tqYBuIhu97F/AKOcYfHUtwIsqC6U9JIi+bhH4vI52Vsv/dXO1wU3Vw==","shasum":"76b9811eea031f7302965525e567fabc17131642","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.3.0.tgz","fileCount":32,"unpackedSize":499724,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8zjCqvzWIb+86QclSpr/Lsfxc1rHivDo4lsokxNrXXwIgOqnvdRea9Wd9/vcPiwz4CSLhy22ZerFU9cHQAk1PtvQ="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.3.0_1518217015219_0.13008816371930654"},"_hasShrinkwrap":false},"1.4.0":{"name":"x2node-dbos","version":"1.4.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.3.6","x2node-patches":"^1.2.3","x2node-pointers":"^1.2.7","x2node-records":"^2.3.1","x2node-rsparser":"^2.1.9","x2node-validators":"^1.4.0"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.18.2","mocha":"^5.0.4"},"gitHead":"fa5deb07e5ec09acd72e99ea26a12e7b58794b53","_id":"x2node-dbos@1.4.0","_npmVersion":"5.7.1","_nodeVersion":"9.8.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-sbDy8R5NgVWdG0xjhhl76f/4Zb5E8SoP38SC2GBIOuFvaQzjUh5KEwpeQrxb50Lo0xNxb5LhjJisdJrMOZ1+NA==","shasum":"8db36e87111424f95a7e6bfcc034382d2b0e3e07","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.4.0.tgz","fileCount":33,"unpackedSize":508512,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0r5D62buvFhA3s+3UDhrMqUGt842TbeqzoTJTYa39lAIhAKfbq9YcIJpi2hjqegiflP8ht8x+T2kqG/pzypE1q46t"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.4.0_1520883076728_0.6852559714192492"},"_hasShrinkwrap":false},"1.4.1":{"name":"x2node-dbos","version":"1.4.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.3.6","x2node-patches":"^1.2.3","x2node-pointers":"^1.2.7","x2node-records":"^2.3.1","x2node-rsparser":"^2.1.9","x2node-validators":"^1.4.0"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.18.2","mocha":"^5.0.4"},"gitHead":"2847759b1525c8e8c3edb5738f5e8e54c44639c8","_id":"x2node-dbos@1.4.1","_npmVersion":"6.0.0","_nodeVersion":"10.0.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-N6CAh+NGS7xn8qvJHDwFo7UM03xaQ0ATvLF/7Wpenytd//qLyz5nlyInunLo22KaCzX58I6s0h98CTix9FTChA==","shasum":"63df540122b9bec58826c6ee08e85e2af6486318","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.4.1.tgz","fileCount":33,"unpackedSize":508597,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8JBYCRA9TVsSAnZWagAAMQwP/1kKd6u3DKwbWBVYhrSd\n6v72bgIG7lH6hq5P6iqPGKuUuV7b7uAw4Pvl6FMqxQglXOZE2ivVOU6DY6JF\nGHjlKRlLjjuz6HFDCdKgsQK20/gz9UYXN85lUagyoeWnm8rCWD8usU4oaK9P\nQQSYfOagPc6IYzxDxuiLG52TO2ISkue5OJJkkle/LXbFUXy6+O58eancy3KB\ndtGpeGkJeAor21srfFNWqo8D0H2zSk0STUcCepQFndnktYVgImUxbB9sqqJp\nwxE+ZlHDSWNcfd+yTQjfhhaJshwZkUqJrGhIBpxq3gqVSroeqbJ/SUdl05Qo\ngJqrFSIFGEmvv1VLQwLmXFeWbR/ZEvUb6fLmtgHIUj4rSKr0/jQP8Bp7xncD\nUnemCR5xE812u2DFqtWL3NKmaIxwFQdgLgAcJIHV2F5ZfIzoknywNoiE7PIW\nMDYFhdTuXqazRVoccYuTn3lmAhh9FoMw0I6inaHwheHFjkqJiqYThQ3x9icz\n/lWbtsahOoxW3AI1x4j6ERDtCfVMkEcyRV7aGu4GmrzyDWFrNsJVZAdEK0D3\nhiXVpIHcjuDIqD7pPnHF/0iLGyi+meBDugNLfYznKo/ujoJaEv5rS5oKu6mb\nlEIvySuSOiPpLoBFjwtAfQQXRQLvcy/uxzj/mcGjys+xmV33KtP4TU4472mU\n1lnv\r\n=1wD3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFxc51S3AHMphZyBc5DjJGuUUbnfCdcvy+nHfDCpum8CAiB7eI1Hi7oQRn7b8cJ/VvXXiUqC2/e5+66Pt0nXGgZaTA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.4.1_1525715029869_0.5039935267314233"},"_hasShrinkwrap":false},"1.4.2":{"name":"x2node-dbos","version":"1.4.2","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.4.2","x2node-patches":"^1.2.4","x2node-pointers":"^1.2.8","x2node-records":"^2.3.2","x2node-rsparser":"^2.1.10","x2node-validators":"^1.4.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.19.1","mocha":"^5.2.0"},"gitHead":"7209d85db757907523fd1ed4ad577e12d2ee088f","_id":"x2node-dbos@1.4.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-U1B+ZkHHMxOgdLRNvJrTe94e1Way7ZQQjp5nUqncHUBxORnl0PyCY3HB/YmeRzZBDNokLE7jGxQZRT3IFIRhvg==","shasum":"6ea3d559c97fea2b164cb98ab0572a580bddf1e9","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.4.2.tgz","fileCount":33,"unpackedSize":509076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFxSuCRA9TVsSAnZWagAACr8P/jqne8w5lasCjlvWDT44\no1udZDdYBUAZsiE54gfVGrxbTBBuIGrpdjYmOHo0W5xS4L3BkE38XdAuTsb4\n6jQGBxBFcPrSTV9OVoHjV4kiMQL5XewHnTmmV8WWb5s1H8H5K83iuHVVKJ2g\nCPXngqKqjYWG3pf1jvZPeA0CUA5XeZVOEgjkTywSMPe8Re1hLPh7FhrsdEaF\nF8V2I4zyIy5TbQFVE6oiui/gLKi/i15juvFVRlt+qw5gp2dxtt64gAifZSwY\nvQ4T3tG5K+XaIYzE3byVpmn72HMaJD2UTH85pXMjmHeZaTeIS3eXFGgdM2HB\nj1CGDdxbNdvMe+L8ZKtcHBrc6Vyz24U5H9wpJvHqUuKZsy8oUdn7uhp8+vFW\nAtuPp2wnHdshbyA0Uli5yr8IZICcGW3HCuDBpgNutEW/UB60wBpLqlro49t1\n3AoCDZdgR7xX6bu+SgsQGqcSoezaNOBUPwNLN6jMBwzZApPIjUSYVZSyRFsc\nUjdzyyHWLDFhzNvlk5xMyw62GFo1JOgnMNhM6IM3WsQOKC3NjkJXSqv0i3ef\nlBl9wN7i9jtqtRq3sCGPMajEN1XnRi1UzhzwY/CR+7HXQHNzELMxo+IuJ273\nREJMDvuBz5v4C75L3FIUGsmTpAQS+zpwEx2/UIkKFna4SB35/9X5zImj+ttj\nsBtt\r\n=AvCE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFi6xuSOJNnyMdHVqn53jDhdS21/nBmqi0NCyCfI3y3NAiEA9mRPkmVPMpuN6+QYhM/XEi757Fin4DL8lMhNh2fvaQ0="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.4.2_1528239276333_0.017341612874763657"},"_hasShrinkwrap":false},"1.4.3":{"name":"x2node-dbos","version":"1.4.3","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.0","x2node-patches":"^1.2.5","x2node-pointers":"^1.2.9","x2node-records":"^2.4.0","x2node-rsparser":"^2.1.11","x2node-validators":"^1.4.2"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.19.1","mocha":"^5.2.0"},"gitHead":"e98ad3da325509feb1ff50a1327cc01f4f7d2e6e","_id":"x2node-dbos@1.4.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-SfE79vYmKP7gAADNygdNDyKsIMVDrtOJGg/OSe2tIoZ54Xg6xT91QtrtuK03Pq880upEfg5IllxnFnRplLZJJA==","shasum":"ffff28c5396c6b4d154a13c8a6864399b5b47fd3","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.4.3.tgz","fileCount":33,"unpackedSize":510223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbKDAGCRA9TVsSAnZWagAAA+IQAKPKj7q4Yjlm9qMOexWA\nAqffeIpBNz0THPGEcABwTnFxsGLOciaZL/vtTtgARPRpNTCKExIhVZG5NtlB\nOsACf9MalguGIlHEhAhuhcLapubmPMAik2bJsSHlBXe/jzBvi0r+BfibtC8F\nN1rxzBzrOGuuwn2Hfat2DnGj5cPAgnzaH+8BUD4dGoijhMtw+NqrzQtAGCQI\neBQ5ArO9tq8hITecQ8flDzHnGh9NVMKI2EMJn3hf8IAhk1SP29eKyvAFSiKS\nYd5NvLyEy6wADXUsM1BKEoOpIFVoI5TFMbTogEXTwgOS9X5a0hwdVA8RW7HA\nQrz+S2LvcmF56PsakJuxfT+lSAKsiYzYViHEpZZfTIFtyzukQlwZxBsmOm7i\nQs79bcLTrLjkOU1adlgwiAvbSMOOOi3AhoocZw5mnUDUpz2Dhw79/CD4RPaf\nCjChtVmpJJaWOjVrNpEaLKeqKQvEQT6cs2MoSP63vYsw0GLgB74F7wLqCjYw\nrxheVtLa4jRJMRo8nT5qQekKhLjXu0pZm6vTbSj/Avmwb35Jy5DkTbwLak01\nHBB86LiFTCMPrvcOyd3epLGnGT9IYe+u43E6Rj/5wZY64syb5z5Hb+leXeU+\n1lyjvbsBxwuGvTYxiULGhBRC0FAKrwh1bPNHlatVmPwIkjLWZlLVjAQntrVM\nTG3O\r\n=MN9S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDujHS5ovp6xPFOlfSgrOvHz8Cg4lBLGYXexkpNm6JLqwIhAPWwGKq73FqTsffgDMXEy79AgdE13sulqxDmeRlSln5K"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.4.3_1529360387493_0.7793713054491773"},"_hasShrinkwrap":false},"1.4.4":{"name":"x2node-dbos","version":"1.4.4","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.0","x2node-patches":"^1.2.5","x2node-pointers":"^1.2.9","x2node-records":"^2.4.0","x2node-rsparser":"^2.1.11","x2node-validators":"^1.5.0"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.19.1","mocha":"^5.2.0"},"gitHead":"b7789924c4ee772ba178fe17c02285ca71a54692","_id":"x2node-dbos@1.4.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-TSw4B+LDr8P2q+TfbC8wdWJKdu9XTNb/upAiV2gWhm2JRhn7atIRPUtkKfIwmWcezBWIGRP00Fb1L1Ply9xqgg==","shasum":"f7d90ee91c8f574b927e7a5f292b779f18489d70","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.4.4.tgz","fileCount":33,"unpackedSize":510223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbLYamCRA9TVsSAnZWagAAIUEP+wTwqib9nXEZ1IZUwDep\nYduL0oQyugNM5U4Dp1T3oVvn9ZG8uhDqHG5axasGL8JBqybCaPsY1x+zK6Yl\nv4SJrFlclY3GTkONSMWHFALEBHjuWHmLC1TW8fJUTRsM7XNMYNW09zDeyqjN\na+jK9eY9MmIKq1fkjddsLSAFdQ9upvu9xqJd84sxgJXNaxF7pmW2B79Rss5z\nRv4tjA3tNYU30FhrX/n5NjnpeD3RzAl42OocV4pUC93gY+/mj0ZK++UdHKdP\nrii+u3IY1xQTa+JGsBSaIBPeXWUQxMm5XG6c71BMh2PyuneiSeE3XlJd/n+7\nmhPVdXIBo5EMnacImwqzCpFRxKo6kzEFH9wNJ6XdSWqDsrqmu9TtwSYK1tsR\npiDnjXTGKrQy8UqLQO2nyimQhASfRdRy71dvWt8wsr4DWCZHPscNaaAxf3WC\nsA7/hMK6jFUSixCAxx4BtXtbLSOB9nVTmbrrXXYiPlu7XU+9x9eKCsHogto6\ntahvaPb7Rjdbi9S01xgxqX/S6/sVtj+QKuQwaYge2OyFomgTbFgK+HgLt6iw\nWfpx6MZ9BCVOrglpx35vQ+hVuiwniMstT+D3Z+8vCLwofZvAZTLmAKV9cYxo\nEKdddFKiDOSmYj4fgYitewpiauHFhEb8N72zDssNFXwYbpMzBYK+brajZVqT\nFRWy\r\n=Xc9K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCI2LAo5Zqa5ZMGfjdHVJlluLFBdkuu/TeHFL5ItTEBFgIhAIlOSxdgCfhOMxagnry7uD14oGxLRA23W41c3oGKZJlO"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.4.4_1529710246757_0.8021545954706841"},"_hasShrinkwrap":false},"1.5.0":{"name":"x2node-dbos","version":"1.5.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.0","x2node-patches":"^1.2.5","x2node-pointers":"^1.2.9","x2node-records":"^2.4.0","x2node-rsparser":"^2.1.11","x2node-validators":"^1.5.0"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.19.1","mocha":"^5.2.0"},"gitHead":"c77f11a57a075c761d632ddfe2c66836954959b0","_id":"x2node-dbos@1.5.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-qGZNMXdKlxcx8jsG18jWKNxW+hOqoe4pC8Ny3jqmGADTTzEd7QkEbRwLwbaFuTBTw/4VtLtnRP8IiBS/Mz//xg==","shasum":"4d1dce3582c4b1ac2c9794a4968596c3c89d112c","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.5.0.tgz","fileCount":33,"unpackedSize":512742,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPPXHCRA9TVsSAnZWagAA3dgQAJbVFUfIKlATpE3AR+DS\nrDyKkh5q4TdVWTCHTo/Yi6IFKq4GyMYEKcTez6UbIGyGcsZ0XyKyN4lZW+Zs\n60ef4Ah/y/JMxzi5CeW7rK+69NSu9vUEp7NghbFiixIWn+95LO6lVZV6yFda\nSuLEP03ymy2yvjmc5ZxtB/q2SuuqqI8fpwmd+tFcI2xl7jxat8vqqlV/BeVC\n92tM2RKUGWksGf83TVG5OpZx1eCl4+mp1Jts/ezjxhAEFEdut8iiUgbgZYzJ\nIICLZ2cvngkjTBCCV94lm94LqqXoab9ylYKfAPbP9Y1HLaNogEMkft6KuppO\n/0EZ1F+dEW3dwCmPpxU7aO5Gd6Eihb8N7Io1zAWbuFAPT1/n+5zYf4TYwj8b\n5ZqRBHT4xAeLoMdTMAwPz/d6uc6lvbjNv1jnZ4cEIdhNja4T9Ewm1wC0rLsm\nn5bZaygFr1kq5cu9NAkjYoZPI5OayImLvEFJ7r+Vth08eNGFY/bzX3x7KUV/\nvw0IopbNPn18dUFBhitYvdNcqibFlMskPjJ8ubDziSIfuxVwhz6HDtaKjUc5\nfX30XUe0d4qVbw0WFizR826XBdRlo6MtcFMghInQnEx9olRO5wc7cPUjhoLk\nTof7mxMVfoQQJ8A73DQ9KVu/Dt7PUPAuxZh1tfvnzpuNfys2LdtRiiCkLjID\nbBot\r\n=RQ9m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEe7eybxuRunrYogCHh0grHBsvLWwbZ0NjauBQKKB11PAiBCHRJLgcBVEsQ9VsZ5qrpqnKzKSkB2tDlUJDB2xjJvCg=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.5.0_1530721735537_0.7562860725248746"},"_hasShrinkwrap":false},"1.5.1":{"name":"x2node-dbos","version":"1.5.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.0","x2node-patches":"^1.2.5","x2node-pointers":"^1.2.9","x2node-records":"^2.4.0","x2node-rsparser":"^2.1.11","x2node-validators":"^1.5.0"},"devDependencies":{"chai":"^4.1.2","eslint":"^4.19.1","mocha":"^5.2.0"},"gitHead":"03a3b5bebaa407657b366214fc308869846b17c3","_id":"x2node-dbos@1.5.1","_npmVersion":"6.1.0","_nodeVersion":"10.6.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-hCSTRr0crCv39WTgOQbit/O1I03Tx9YAnheZLjixrgWuXPQrceqnyo3N+uyu5edTkO7Qi3thpAYVevnwUDpF/Q==","shasum":"e6d7f0d00982c21a3d50884e00c9b402fd683ef5","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.5.1.tgz","fileCount":33,"unpackedSize":512808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbR6EnCRA9TVsSAnZWagAAHPEQAKGUEHX0N/y/aCBJtAdL\nxqS+TjUgV41H+titEN+15vF7LDRkjnwqPQz/HN++YZ9NDq4XbHaYzp9X3tfh\n/bGWFsjUMn2ymklW2tJoD2eLeRJdpSv5WGuHDo4awWb1x7oV5VvePcLAAdyc\nqeStady69UPQsnc0ZwobO40PTpsPtEy8mENdStqYK85suHI8wSEDVsAS/4i7\nTmaZY7sUlj5qINmMXHw1+qSig3oZ6mzfgIXLRhcGCeKyX2nMzlvuNUcsxlVm\n51qREHx2hUljfkuLKADMVrxWhN91EoikkaqmUOQimIxNX0u6Hw0qTIMFMWJD\nOk0Ipq46c807TDvZ326H6NN9j4xuun90N31qhn5N9C28zqiw6zvHVhdgd3bC\n98BDSri/mTGK73xmA0pHjnVXtzqbnXRW3DGgOD553s/ntkJ85kygqFCn4KkW\nUmR6To5bk4Tsr/biejGjPyzUBMeil6TOeZkN045wXhK/UpmvWIyxzqeRhup7\no5CxPD90aZ14p+QyO8tfi1s5e1k1O2i5ZCEuvs3Mu4bor6mAJhTACcHgOsRD\n/AFiGJPSaYLjE18ErELaNbH0IsGN/A0VYSS/5w2DPQyZBvCrYvbpDWsV1S/K\nrIBaAlqw+DIazFnFsZSRc2ybooc6tSuNHidVX0d4ArE3ehX+wCyDp94iuksJ\n+e94\r\n=mA9y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFo8MJOqHOjG5hjCkQIyA2A7nJJeJf8G6P40WioKPadkAiBY9SlUMPwXcTsZBb7j5QJuFvDEzHYT/c2Rk5Yic1EVbA=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.5.1_1531420967690_0.8199292220728722"},"_hasShrinkwrap":false},"1.6.0":{"name":"x2node-dbos","version":"1.6.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.2.6","x2node-pointers":"^1.2.10","x2node-records":"^2.4.1","x2node-rsparser":"^2.1.12","x2node-validators":"^1.5.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^5.3.0","mocha":"^5.2.0"},"gitHead":"1e549afdc9b00617983cac5f9dfcdf50f54e8a93","_id":"x2node-dbos@1.6.0","_npmVersion":"6.3.0","_nodeVersion":"10.8.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-3rKOOBPBkBRUhs5EhT7ET96jnHG8mnsHhwiC+3Cux5Crzp4cmIFeGHPmQOOtfuwTdIB4/UoOXZOJiosOGKMQeg==","shasum":"ca03be5d7665ce27535baca5634ad3d399c11075","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.6.0.tgz","fileCount":33,"unpackedSize":513781,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcw2wCRA9TVsSAnZWagAAshIP/jX6jlelEMR3f/x9J4Jh\nr2rXwME6lfOKAJdVg2Nl6knhaRyZLUOvirJgBnRfu64SryL6G1PnXshxK1mw\n9X1Pb364mBzALGPPLvsUUCZMaFRF7jMDUojEa5WA/SkaEBeNDIDgtKlVtQjv\nDhlgtampolR0jHM0s651JR4sXj2j93BGDr5NEJVU2d8WU8QKh5ge/L9laYet\nkTWUZbyPavJCHs0VxqGXCfoEKPI997OflTReb8NTVSvodWdzs7z1HxpCSwno\n3OIxnMbKPfP+OCZLHzYDoARb9vnXJUrpAmR4AsV/XhymqkDN64n4j/5a624B\neILr0Z9KrZSuI4LAT7vi/i7Tofkyx7fS8EF1Fy7OncR+Xu8n4+k6Uv78kGdp\nc9Ve7SjaJQdObdB5IeVDLnp9sowrMXEZUy0l9Ybukx4K1QrUFkfyzv5+RU3j\nMGnm+wDm8rdWI4T6uOdYAv72PwpHH6IhoqRIiQ9CaGhZW2Pb4O13BmejlDGK\n+tjiD38eq7qbyFm0aZ1qbsv4PphV0MavdULsPLPfG7S9i5asIsAJhWVEcfxf\nfe0a9zb1+MBO9j9c2D7oRvrcm/hSnWHcYGOgv4K9Froz3L47TfpVC5nJXcfJ\nV9klisFxZqwOHIoui+MDjdSb7ZdP7lKKqhjAs1cyobnPk+FHKp/sdSlXMGac\ntWH0\r\n=FpSF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6HFMP6G475sqeJNAXUUu2fN7PgUnd8W371AbKPlngeAIgWhqBr2rU5OE8X4AC483t3eQgtCXLcE2i3Z9XRHcL0jw="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.6.0_1534266799796_0.4544503613741744"},"_hasShrinkwrap":false},"1.7.0":{"name":"x2node-dbos","version":"1.7.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.2.6","x2node-pointers":"^1.2.10","x2node-records":"^2.4.1","x2node-rsparser":"^2.1.12","x2node-validators":"^1.5.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^5.4.0","mocha":"^5.2.0"},"gitHead":"35464e5cb01e4451036d49f2b45ab8ac2fa8928b","_id":"x2node-dbos@1.7.0","_npmVersion":"6.4.0","_nodeVersion":"10.9.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-Dr9fU1sCOYHnBmU7ipHQX+3po0UHhDMjCqyZEydvKkpbSMukH2DCEN/n8W42syhkwrm7mG5MryvFrkTCjuc45w==","shasum":"fd1c3d6e1653e1090cf2c54c8b5eda6454281c6d","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.7.0.tgz","fileCount":33,"unpackedSize":515031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbefaeCRA9TVsSAnZWagAAStwP+wUEKrY5FtnSPUyywBPR\n8N+eZt75japix32viD9YeUWHvQvDHXEMaBzqsIU1T+y97CIECOfsSSSqAQtG\np0/+tIN3/OvGeTJsCdCYXTqG731SBFicg4moYclS5UKIRGR4rNC3ZcR16uXc\nS4EKCIIiRJYtiDb4of+FU2Trwtq1N0vQa9U53+uEeIj2Wz5U/m4lOPtNwMtA\nidM3/35BP5IUnnsxyOU9sidatFPk8DDykuoKA0yrqKgTb21KFIqIBEDUa/zN\nS1rJ2rPZ/6Yqi8lp58sVMyYL9RRWDwolrPD1Ht5h9rM3KtijXrAtYvP5aWmg\nzYhdJoIxl9o3cwxm3/YfyboeDUVoxWnYBQtSNIfvC2x+vob/ICr9EEkMcj9S\nGdHu6bgBM1djrDHmJ0mC/PCKMSmu1CSh8RNv1VMCZSAeWrbyp/WtOznSTmVz\n/IX5EBnB8sog5V+AvC0whyk5FijBXaN5ozcnlcuSFfLsC4tCZweh2TFtYIA2\nQ17X8wuXq+JyCecKDAUt5vYLBXNSOCZw22QvEtl1ZjEyjkPh9vW6uzEh61Qt\nHF79dV3RTFDHprZLsftgjh2yNnJRZ4QiRu3oORtO4XRyqGlqsyq8pCRCY49p\nXDVtlMojFogc7+tFKxv0+5INorpdds4Ao2XamwhbcQpQSSFmF/3oCLzNKSOA\nuJv4\r\n=CDMr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCy/7xRcvUcA3PKnuA7SGGmwW3l0Dl9GWDPzLU6OzCLKwIgVl2FjBrpI8A24hTnQeRTCnGES2k3EWHS/wBy9YACjrA="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.7.0_1534719644995_0.49239032478234823"},"_hasShrinkwrap":false},"1.7.1":{"name":"x2node-dbos","version":"1.7.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.2.6","x2node-pointers":"^1.2.10","x2node-records":"^2.4.1","x2node-rsparser":"^2.1.12","x2node-validators":"^1.5.1"},"devDependencies":{"chai":"^4.1.2","eslint":"^5.4.0","mocha":"^5.2.0"},"gitHead":"4f02f17ea55f10ca2e145eae3386d5be86d5cf9c","_id":"x2node-dbos@1.7.1","_npmVersion":"6.4.0","_nodeVersion":"10.9.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-4hLywcKKK8pkq1ybt0l/dqmduz4VegXf1pGwFXctBVVWr5VcMtKvN9cZIdjojciSJscf6LWMGgNWRFFuKkan6A==","shasum":"73bcbd529ced3a82cf04da3e412ec2a99d5be860","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.7.1.tgz","fileCount":33,"unpackedSize":515516,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbga+cCRA9TVsSAnZWagAAzusP/iw5azk3rAkXVyer/dpW\nw2JtiHlFAD1amEJffSEporkCMYqzKefK93scSg5SLu0ooufvEIqYE8tlQd6i\nkv4k65kYya4wu/7xDsDLX4MzYDhWUYPMNueNhGNDlCcJ9uXmXSG3sWTue6xw\nXV9BMeEmsJq7CeKwRgczpqhDUYhuKEcL5zSYrwEylMDAixvI3o/DyYeLxoj+\nHwFxLND61LhtTpPg58i5FSIIMJYXbU3PN2oIDjhtI7Fc2Dqhlu8Os9XkkPgG\n7NYoJ7rZVTkV+cffsheoITTc/RPxe8CyvJhOEQkOuLL3IMyFQmX6UQw22Is0\npFeQuBKJ7mMD4PSCReFRO+mz8uG/7aCW2lSyFYFcm8YQwrt3VaFGbLdKgB6a\n8GhaoGHUEbYPTpSFvmO3xcc0YuprOW9amwkHyV9VqvpetlJzHVlJZu8PVPKl\nHbojJO0A7OQSKiuFHXrZU19M8SczH84sMqqHK8azC+DG+EljsmNsbZ2UzIiq\nUFkNaAGcfqFttL+LHO6CZjKznYwQaenpnvW6sbTrdrVmzKDFc7A07rQlP1xn\nuEUpVgLUlSPAstR99+HykK6Mh6a3xb91DJ/Hr1KUmEEegtU1kEwssd/wOYYM\nFBSPYsX/l/KMtZ3yE2wj0eOrjTmzWm2ey+SM6v1Sq+5dyjXhRoocDNeQt5EM\nOa8k\r\n=GlGb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFa+2Cl2vn0aadDedkfY0AqKLymBYSf0l8yydOujBaM+AiEAoI6xIAIw0lYSiqS5HY+2bk0SB69Sa8D8Man+RW4vHLQ="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.7.1_1535225755807_0.45165804922358044"},"_hasShrinkwrap":false},"1.8.0":{"name":"x2node-dbos","version":"1.8.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.3.0","x2node-pointers":"^1.2.11","x2node-records":"^2.4.2","x2node-rsparser":"^2.1.13","x2node-validators":"^1.5.2"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.6.1","mocha":"^5.2.0"},"gitHead":"e9b018438f74d649d78f0c0435ec30c7f33a0e14","_id":"x2node-dbos@1.8.0","_npmVersion":"6.4.1","_nodeVersion":"10.11.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-5yTqMlDLMk5c9/ekDzKeTYXqbP7h3fgs+7XqLivJeBbBCJ4ZZTDYvDoEh6+dPJJOSuoeilnVNqvuXoqA+T83IQ==","shasum":"c82aa4de564ab5190d9da1b0878bddaf1e88b40a","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.8.0.tgz","fileCount":33,"unpackedSize":515979,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbu4UNCRA9TVsSAnZWagAAW4YP/0DO8C2g1W5ElhNTquXS\nWG6k9xVAwds9QZTW4P2wUri+F/7sOfPp9TMEGrd5iijG0xQmBPt8kdu2VDx8\nM/f8UGKGdhlm+JWeBgaMbRS1u7XabZAxojz0OfcbBqHbIKlehV3jt778Bswl\nBrZ1bgUk3xifNFx/yDbSUrrib4Nq9BPrUpNM2H6MyPJQULmFeMLKIm04Wooa\nG2IBcOTg88wnAFTyOdz1dTve3DG47ZytsBsZt2npK55kxO9JLPb4NTo9DDTm\nzNQzazehiYWpEyKpwpHliHKkMrl7JBpj7zRYeYBjjSYS9GRthKD2dHKzylXP\ndjF7XZ6XbLMoWv+YxYe3KOCxw7E4/B3VswQsl/IsDUFteD+zg4LmuLisGd9B\n6NFHppiyDJwspWOqQzZfNjmujiglIqdpZ2j6mLgKlwGLM8hT109pElMx5RJ8\nyKmgUoPS9tjToq61krXjPb1VfXprHneIQ+uqQzWED3P4SEZbhwzn6uaOuqZI\nuYr5EwkFXNnipBmg0EqyFplKZBb2gkw8uIX1JFB0ryqebctLnQqGn4XwUP20\nZyE0YhMYbvYuQd3Yhy/18Qtt3IwYA6wCjTdMXqaMWRF8+tXKjQkEig/pKPxG\nxxHfKo/gW0G+uOsHv/la8PTon8BRPyTHVQKy/BIt3q5OBxpgA5Ulj/v71ekd\n2VEh\r\n=pXxS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1nZ68EZgIm7Ex1J9kF/taqUFtz8qNPaLazveJTadlVgIhALTaQ7MV07N9ootv+5KIOFW0LS7I5veS0uM07Xi8wjoE"}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.8.0_1539015948349_0.08951445341508668"},"_hasShrinkwrap":false},"1.8.1":{"name":"x2node-dbos","version":"1.8.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.3.0","x2node-pointers":"^1.2.11","x2node-records":"^2.4.2","x2node-rsparser":"^2.1.13","x2node-validators":"^1.5.2"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.8.0","mocha":"^5.2.0"},"gitHead":"6996f3ac4e105d72f45d54353e60473eb283e8b6","_id":"x2node-dbos@1.8.1","_npmVersion":"6.4.1","_nodeVersion":"10.12.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-2hz32JEi98qdESxWTtgLXrzVuddYP4kAbMvrkbg4ayOBN3Zx0x04J7LTH+mAlU/Irfr0mCMWwujBnhGikSIDbw==","shasum":"1cd4b2a74229e831a2e2e0a6bbf901d4d04144e6","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.8.1.tgz","fileCount":33,"unpackedSize":515991,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb05qKCRA9TVsSAnZWagAAfpAQAJQljSAKWEc4ChvImLze\n0xHLmQaVhRVlJXvifX7J3VQMTMM4d513Tc2eGk+bMHoMSuWw+kaVKynVsua5\nNZJM5eKb/XF1Vc6Q2gx2DwkCxSPzc9kJHjphPJutGeqZZKlGo1MKhkk1UOBE\nzYmu/CMPbZV/1MDNzX222ZD6Z+/lFacsduTBist1qpxXny0iG2hHkmxT8svy\nGOWP8P+s+Yt4S3f+HnfhlmN6seAv+Xnr1FHRs31aj3CIKiADNggsi/aJdeVH\nd62YEVWev26hS4RLMzvq+6/7/Fujr5f4+TCHSuUTl4xAPjwpLi3Pdcl7qydD\nfNnSIIzFBuyDz5jSzRTdME0JsRzdmXDZzAxhPLalRKM/kbaTLJJ2AM4AnZYv\nQVdWWagLZdifWrilCHhLgKn+18bWfLemQ3BP0DrmZk0RkzjsiCzqs1+aiY64\nhIR1NjZE3AQ4hytIpGkFUycVaFR1nIWIZEjUAAA8lGWDaLumRCHszojZgAtD\nTsTwqeXyYrExJudoyIvzX8Q55XOnDIMjcvfJL7HcofZFT23kRBffEbwh6aj9\nPosnj/pkg1kBfWTRwdbjOpfwAh4wJ7MJiF80l1ciwTZpqrJ9Itg3aBuKYu4O\ni4SozMYJgMmjhGg1A7B6FqIuclup3UHTsAHhO+ieUPtCr2o1ToAa14N/fEYQ\nsAAn\r\n=dNvj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4HtB33sdON8J6BNbPzYIM6oJAY9MAIwI2l5FJ6AWnkwIgTr5GTguKyayCZ7CsxDgSajCeerJw4mqm2rhpVQfV/ME="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.8.1_1540594313777_0.42962822984465343"},"_hasShrinkwrap":false},"1.8.2":{"name":"x2node-dbos","version":"1.8.2","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.1","x2node-patches":"^1.3.0","x2node-pointers":"^1.2.11","x2node-records":"^2.4.2","x2node-rsparser":"^2.1.13","x2node-validators":"^1.5.2"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.9.0","mocha":"^5.2.0"},"gitHead":"aeefce91ffbd7e30731514b55db0a19c8a5cd038","_id":"x2node-dbos@1.8.2","_npmVersion":"6.4.1","_nodeVersion":"11.3.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-123b9VVj03HMXxmS5p6dDnujs072GrsKM1vhDCVDOhhRLiyOGcEoR8Eqw4miQM3x3BCJwBbbHTcDIs7hKurjsA==","shasum":"d8fc869696bd3eab50eccc0cc3d777cb81259463","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.8.2.tgz","fileCount":33,"unpackedSize":515991,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcAX8/CRA9TVsSAnZWagAACIYQAI4JCiLBp/z24ecRcDDM\nUGg6+sij36Kxdb7SJvrMR7FTxihzYn5iPx+CgEo7qo72jKMrz3j52TyftPJn\nn1VVU+XZ6/axJjoJ2Mub7FycBP+qamLqo6+09mi2FpCCBaa8vRajdJ6CzjT0\n+qtyzKCa6amTIoxlw1YQ6J4MeUNNgyEykV8pOA9LFXDdHivtOMVPxj+0RYuZ\nDuUXDc2LJaxoNrKXvOkhjTzJNKsiRAuAQo+FzGhoTxpqexrwLDeNri94soxV\ni0HLbogFyMr/PHYOILTbdqX4kzuRtRJRmJnTfwtsRfNDKW3bz3fRGzMnVrfg\nD5j0dolOtYcQmM2MRiT4+SPBZXksndbszA6L554+OsYYvRmKXyo2nxfE3yRL\ncQzF/z7FK7u4AAyMVUf64L/mUXuS1YphKmUFQppt6DnGos8ga8HovLPa8YpI\nRkh5tPtFqsz9oS3gHltKvy/3cv1nl9HZ2Nolo7hBwqJUpDv/Ep1oSHRy4ve0\nJ2eHBicCDS67wUOYFyk+mjOgZXqCuad/9WDQDqX89yfw0LQegA5q/uhVGUVK\nymkQauEHompq1XAs0jc2kVUuMmdID19h7ooU5Fx3JppqefuOtIYWz+c6NCI4\nW5J/mn/H9TmBrWENjY1F+AHTlEqzKa6XFF8qj/TCD/+wKMNnJlYDfUC3ubvR\nI5sw\r\n=iR00\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAzds0kA8W5r95yOU7tvDBLyd17yOv0oEAsincO/kUKMAiA01srB5YA/jYomzsLCvRCliOjlTac4zbyR6hc/vjCicg=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.8.2_1543601982258_0.9555044117545692"},"_hasShrinkwrap":false},"1.8.3":{"name":"x2node-dbos","version":"1.8.3","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.2","x2node-patches":"^1.3.1","x2node-pointers":"^1.2.12","x2node-records":"^2.4.3","x2node-rsparser":"^2.1.15","x2node-validators":"^1.6.1"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.9.0","mocha":"^5.2.0"},"gitHead":"ca5a952921b6f88b875847795cb4319b37151a2d","_id":"x2node-dbos@1.8.3","_npmVersion":"6.4.1","_nodeVersion":"11.3.0","_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"dist":{"integrity":"sha512-a/WGiBFzMUAE8KHK8+tiRcsznJN5AQCU8k36Bl6SQDVpxBJ6aWW+ShIMcTkKvj6kM5KTavOT6GkwvYyvDtvsyA==","shasum":"7fc7e77e4731cef3bb4395031e17738c3724fbd3","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.8.3.tgz","fileCount":33,"unpackedSize":515991,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcCBfJCRA9TVsSAnZWagAA6YIP/2iiCdzFpGgtiGViz9M2\nLft4tup9FWoZs2w71SGt+umMvuXQ1n5B+LgNutqQC6nzTYqm84QHOkgC9k9C\nxefYK9n9uwUV/zBH/0pqEJjqYbSOrTTj8Vnls+2e5+CkXyDBwsVwgJ/kaoth\nwdlN0zGzm4PWjtQ8FHaObI8G0H/OqiiWTHAk8Ttd+p2MC5yLlTjBXmtE1esZ\ntrKEo7N0fwoe5CBzjqXlkA2xRKEBtBeO8OTl3hOdPAdNI/0sqDDgFRXyLiA8\nhdIs537DvIoV17a89QDhYdxajlfH4lPAuuQuimwPfWM19weADR42vAFmunBG\n9ZJQ3JR06w3g07KDbd7edvqbEP0xQ65jG4NoLmIQVQW+XU6iyx6g1A1Js6q2\n4Bdd2/9uHxMOpu4caH0tjbtid8xDSY2GuiNvVoz4trokd4lYFhMCnngWQ6wd\nKgKh4NouokohkVxg8vYzKjx9HIjYey3EjECc4mAuoR1cHA6PodC9HyA5YWp8\ndPWZnAf+fmsi/pSqFd+emCXuLUa45DpDNJ4UldMgrqY6ldnE+TikdiZA6KuP\nvl24PCVxuxcHjp6pU7QkFSs/OqfFZ3LJn9bXwqMajv93PZrUA0qJ2ezXMi7Q\nE4QZoecpyLxhHSEH5geR4DeilhJ7tLuxkGD0jDY426FIvUJamzIK3/gRuPC6\nMDZx\r\n=89rJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVBqL/VM8a34N+0DEud5nMQv0bk68EQDU6LIcVq1MHiwIgSNmIixvQ25vJpHU/MqszUb1dZDRdJcXKym2rkbBupEs="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.8.3_1544034248641_0.2506075509046253"},"_hasShrinkwrap":false},"1.9.0":{"name":"x2node-dbos","version":"1.9.0","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.2","x2node-patches":"^1.3.1","x2node-pointers":"^1.2.12","x2node-records":"^2.4.3","x2node-rsparser":"^2.1.15","x2node-validators":"^1.6.1"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.12.1","mocha":"^5.2.0"},"gitHead":"d7b847d859b79dce0c46e04788201e05d5a70886","_id":"x2node-dbos@1.9.0","_nodeVersion":"11.6.0","_npmVersion":"6.6.0","dist":{"integrity":"sha512-RSR200nB1OOoNe6c47exbl7Ty3BIU9wCvIDmGtFe9kEBJyXSevDzKz6nfX1dudGBO/3M6tW6i9i7VO8O6Ys5gw==","shasum":"9c492c8f7b6fb9f6cbaa396b271e7496f48ca305","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.9.0.tgz","fileCount":33,"unpackedSize":516392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcQ830CRA9TVsSAnZWagAAzrwP/0s1pNksHtr6gXQkm6Qt\nPj+GbjNlFguwK6QcC/nAaOCbaGeBScpyHieIIME/HP9eJel5eM1uSSprSpDI\nStpmWG9EEqoU6oX9IKux4+QEiaohfE/bst2/EllV8FoXXsHkgvwrv9O2RmU2\nqLR/pDLZTBAD0qZCACwwBRW/TRtKxK/lo/bCGRSIpo7Ok3LmYMRkmzRqF9WA\nM/Gr7JLTHAapAhDVXDckNLgw5fYcEkO9VIoNZftMQRGuGZtssWTcSK7/GWoO\nP7E/wDGou2V9f+aU4vME0dYfLsTVYlKbenQux1IPdj0nvoLfj+DPQ+Umvrmx\nbd76aKHx6rWAP43AQd4Na1vXm3Y7+qZPHZGFUn1dRPJSLRqvTLY7zNB/vTuH\n98xNBhm7KPPDKeoudHu3El/H4TeDIDqOAy88k6wxqkKf3FO9pCszEiZKOUJR\n4VN9MzF8alA7Nlf8hTMeMjTjTjJw9z1fWlforJ+6JN/gfZ/fgHxyOKybIKtJ\n7HAwnBWJJzerBlMeCEvuwSA/P5izDQ9cTYd0qXkqsDG4Q1DxfGf+aMmyJT3p\nXafImhMx7t6N78cOFhNM+MQp9KfMBr0+hCrlBlhdO0bnL71UDlleph1K2Aiy\n34kC06q/JGzGRCDEWIDF5nWk8EhNjhj2Ugk+dALDGj6/+ovUPKH3pTvvB7OA\nJruz\r\n=hNxB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGQ5gqlixesjKs1bYBzX3ry3CUHtPpgVIYHES35ffoOVAiBIrcZoTjsM5lx2RR7NE3TTmi9mHAIOK5g4pbi420RItw=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.9.0_1547947507282_0.06571151090281946"},"_hasShrinkwrap":false},"1.9.1":{"name":"x2node-dbos","version":"1.9.1","description":"SQL database operations.","keywords":["sql","x2node","nodejs"],"main":"index.js","scripts":{"test":"eslint . && mocha","preversion":"npm test","postversion":"git push && git push --tags"},"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"license":"MIT","bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","engines":{"node":">=6.10.3"},"dependencies":{"x2node-common":"^1.5.2","x2node-patches":"^1.3.1","x2node-pointers":"^1.2.12","x2node-records":"^2.4.3","x2node-rsparser":"^2.1.15","x2node-validators":"^1.6.1"},"devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","mocha":"^5.2.0"},"gitHead":"d0098909751102447248bc3867808fb2ddbc0be4","_id":"x2node-dbos@1.9.1","_nodeVersion":"11.15.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ZSN914v6R6InYX1dNG1DE3wCG+wzp5kZ6v3hilD3osVjgAlLQjVe5uBMQgQ4mhdXJnqc3VZCjsWRL+a3olj87A==","shasum":"3ce24bc0d796259682ba8d1825ac4faeecaabe47","tarball":"https://registry.npmjs.org/x2node-dbos/-/x2node-dbos-1.9.1.tgz","fileCount":33,"unpackedSize":516393,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7afICRA9TVsSAnZWagAAGCMP/39MXbI2i30qO0g/RT6z\nK5brboR9USy0ANr/qXAK1TnOMMVXlgGWPjDdwruBuAWqFFoqKy7gwr/IMF09\n3XLRhhhzQIof08QNC20uMwR3JlDhnH8SO9X+EbQK9TM5vzPF6+OBoZze5eTm\nQ+vyKhzNYukJnFMNb/kK2dXxqrO7iZBy54rgX45/tYeWawSbl/rjp+2yuyH9\nf057Ig0Q1c3TeafeluUo8aTQKi4txLhfYmGvS7mxuPbHT766iRC7d9GtwS37\nHPS+z+s3XxYvLjpxyiJLR73dMfBAqlFNcONRabbaEXGoPCtYy1vd2NS9nC/M\noAJxvo3imcgrFI8L6moQ2ixIQuR4hpjggkuPD+ptVFV2odYi7mbQSSZ/KYGi\ns4PWy9MwJ33XkKtvaDQ7XT1a12E1d64ROFBxQDG4akg9jW5QNNUZs9j9fXwo\niSzFcqXL1orl7LbzWSDESHzQ98RUgkLUPcrvn1VbZHF6ogcve3hH7U0ohcCC\npoflhyQjb5HIbUJCzPrdDTWLpAInDzaXhpCkIw93E7NobZwgzCuzUrS9HQyy\nnT8+pKvtWynM4zqpwjFDaQM1aYceuRJ++/Y35bxRa5RPdwRqHob6JnkYiYU4\nlpXr2CckNnjZlXnoppZoLvzrYDXQM0ZWCu1LWJWBy+IC9DY5Tw7Q44YFTbf5\nmhIr\r\n=yM5U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFhC227pE7X75/kOIUx6ZUssuYVuKQkF3psK+MYQJoVuAiAjdvRowdsMy026gQMPm+EC10hK9+DNd/QjR6ijn6gajQ=="}]},"maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"_npmUser":{"name":"levahim","email":"lev@boylesoftware.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x2node-dbos_1.9.1_1559078854858_0.4298981886562099"},"_hasShrinkwrap":false}},"readme":"# X2 Framework for Node.js | Database Operations\n\nThe _Database Operations_ or _DBOs_ module, being a part of _X2 Framework_ for _Node.js_, allows applications to perform complex operations against SQL databases without dealing with SQL queries, parsing result set rows into hierarchical JSON objects and dealing with database and database driver specifics. It allows applications to focus on the high level data structures and business logic instead. Some of the most notable features of the module include:\n\n* Centering on the concept of _records_, which are well defined JSON documents that support complex data structures including nested objects, arrays and maps (nested objects with arbitrary sets of properties). This allows applications to work with the persistent data as easily as it could be with a document-based database while having a full-featured SQL database in the back-end.\n\n* Mapping of _Record Types_ defined using the means of the [x2node-records](https://www.npmjs.com/package/x2node-records) module to the database tables.\n\n* Automatic construction of SQL queries and statements to support the four basic database operations for records and record collections: search/read, create, update and delete.\n\n* Automatic generation of multiple SQL statements to perform complex database operations when necessary, while still reaching for the best efficiency.\n\n* Support for quering records with multiple nested collection properties.\n\n* Support for fetching referred records of other record types all in a single database operation.\n\n* Support for calculated properties and aggregates.\n\n* Support for result set ranges expressed in records, not rows.\n\n* Automatic support for record meta-data such as record versions (which may be useful to support ETags and data modification conflicts detection).\n\n* Respect for the RDBMS features such as data integrity constraints and transactional data locking.\n\nIt's worth noting that the DBOs module is not an ORM and it does not attempt to recreate the concepts pioneered by such _Java_ world frameworks as _Hibernate_. It is not built around the idea of automatic synchronization of state between the application-side objects and the database. It is built around the principles of clarity, efficiency and practicality.\n\nOut of the box, the module supports _MySQL_ (_MariaDB_, _Amazon Aurora_) and _PostgreSQL_ databases. Support for more database engines will be included in the future releases. Custom database driver implementations can be plugged in as well.\n\nSee module's [API Reference Documentation](https://boylesoftware.github.io/x2node-api-reference/module-x2node-dbos.html).\n\n## Table of Contents\n\n* [Usage](#usage)\n  * [Record Types](#record-types)\n  * [The DBO Factory](#the-dbo-factory)\n  * [Fetching Records](#fetching-records)\n  * [Creating Records](#creating-records)\n  * [Updating Records](#updating-records)\n  * [Deleting Records](#deleting-records)\n* [Record Type Definitions](#record-type-definitions)\n  * [Mapping Record Types](#mapping-record-types)\n  * [Mapping Stored Record Properties](#mapping-stored-record-properties)\n    * [Scalar Properties](#scalar-properties)\n    * [Collection Properties](#collection-properties)\n  * [Dependent Record References](#dependent-record-references)\n  * [Shared Link Tables](#shared-link-tables)\n  * [Calculated Properties](#calculated-properties)\n  * [Aggregate Properties](#aggregate-properties)\n  * [Embedded Objects](#embedded-objects)\n  * [Polymorphic Objects](#polymorphic-objects)\n  * [Ordered Collections](#ordered-collections)\n  * [Array Index Column](#array-index-column)\n  * [Filtered Collection Views](#filtered-collection-views)\n  * [Record Meta-Info Properties](#record-meta-info-properties)\n  * [Generated Properties](#generated-properties)\n  * [Super-Properties](#super-properties)\n  * [Uniqueness of the Id Property](#uniqueness-of-the-id-property)\n* [Fetch DBO](#fetch-dbo)\n  * [Selected Properties Specification](#selected-properties-specification)\n  * [Filter Specification](#filter-specification)\n    * [Logical Junctions](#logical-junctions)\n    * [Tests](#tests)\n    * [Collection Tests](#collection-tests)\n  * [Order Specification](#order-specification)\n  * [Range Specification](#range-specification)\n  * [Records Locking](#records-locking)\n* [Insert DBO](#insert-dbo)\n* [Update DBO](#update-dbo)\n* [Delete DBO](#delete-dbo)\n* [Transactions](#transactions)\n* [Record Collections Monitors](#record-collections-monitors)\n* [Data Sources](#data-sources)\n* [Database Drivers](#database-drivers)\n* [Record Types Library Descriptors Extensions](#record-types-library-descriptors-extensions)\n\n## Usage\n\nFor the purpose of the DBOs module usage demonstration let's say we have the following self-explanatory schema in a _MySQL_ database:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    fname VARCHAR(30) NOT NULL,\n    lname VARCHAR(30) NOT NULL\n);\n\nCREATE TABLE products (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    name VARCHAR(30) NOT NULL UNIQUE,\n    price DECIMAL(5,2) NOT NULL\n);\n\nCREATE TABLE orders (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    account_id INTEGER UNSIGNED NOT NULL,\n    placed_on TIMESTAMP(3) DEFAULT 0,\n    status VARCHAR(10) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n\nCREATE TABLE order_items (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    order_id INTEGER UNSIGNED NOT NULL,\n    product_id INTEGER UNSIGNED NOT NULL,\n    quantity TINYINT UNSIGNED NOT NULL,\n    FOREIGN KEY (order_id) REFERENCES orders (id),\n    FOREIGN KEY (product_id) REFERENCES products (id),\n    UNIQUE (order_id, product_id)\n);\n```\n\nFrom the point of view of the application, this schema provides storage for three types of records: accounts, products and orders (with order line items). The DBOs will work with these three types of records and will allow searching them, getting their data, creating, updating and deleting them.\n\n### Record Types\n\nThe first step is to define the record types library using X2 Framework's [x2node-records](https://www.npmjs.com/package/x2node-records) module and map the records and their properties to the database tables and columns:\n\n```javascript\n// load the framework modules\nconst records = require('x2node-records');\nconst dbos = require('x2node-dbos');\n\n// construct our sample record types library with DBOs extensions\nconst recordTypes = records.with(dbos).buildLibrary({\n    recordTypes: {\n        'Account': {\n            table: 'accounts',\n            properties: {\n                'id': {\n                    valueType: 'number',\n                    role: 'id'\n                },\n                'firstName': {\n                    valueType: 'string',\n                    column: 'fname'\n                },\n                'lastName': {\n                    valueType: 'string',\n                    column: 'lname'\n                },\n                'orderRefs': {\n                    valueType: 'ref(Order)[]',\n                    reverseRefProperty: 'accountRef'\n                }\n            }\n        },\n        'Product': {\n            table: 'products',\n            properties: {\n                'id': {\n                    valueType: 'number',\n                    role: 'id'\n                },\n                'name': {\n                    valueType: 'string'\n                },\n                'price': {\n                    valueType: 'number'\n                }\n            }\n        },\n        'Order': {\n            table: 'orders',\n            properties: {\n                'id': {\n                    valueType: 'number',\n                    role: 'id'\n                },\n                'accountRef': {\n                    valueType: 'ref(Account)',\n                    column: 'account_id',\n                    modifiable: false\n                },\n                'placedOn': {\n                    valueType: 'datetime',\n                    column: 'placed_on',\n                    modifiable: false\n                },\n                'status': {\n                    valueType: 'string'\n                },\n                'items': {\n                    valueType: 'object[]',\n                    table: 'order_items',\n                    parentIdColumn: 'order_id',\n                    properties: {\n                        'id': {\n                            valueType: 'number',\n                            role: 'id'\n                        },\n                        'productRef': {\n                            valueType: 'ref(Product)',\n                            column: 'product_id',\n                            modifiable: false\n                        },\n                        'quantity': {\n                            valueType: 'number'\n                        }\n                    }\n                }\n            }\n        }\n    }\n});\n```\n\nNote how the DBOs module is added to the library as an extention to allow all the additional record type and property definition attributes used to map the database schema.\n\n### The DBO Factory\n\nThe next step is to constructo the _DBO Factory_, which is used to create the various DBOs:\n\n```javascript\n// create DBO factory against the record types library and the DB driver\nconst dboFactory = dbos.createDBOFactory(recordTypes, 'mysql');\n```\n\nThe DBO factory is provided with the record types library and the database driver, so that it knows how to construct database engine-specific SQL. Out-of-the-box the module supports [mysql](https://www.npmjs.com/package/mysql) (and other compatible implementations) and [pg](https://www.npmjs.com/package/pg). Custom driver implementations can be provided to the DBO factory as well.\n\nThe `createDBOFactory()` function can also take a third argument, `options`, which is an object passed directly to the database driver implementation.\n\nThe built-in _PostgreSQL_ driver does not take any options.\n\nThe built-in _MySQL_ driver, however, can take the following options:\n\n* `orderMode` - There is a difference how some versions of _MariaDB_ (pre version 10.1.35) and _MySQL_ apply sorting to the results of SQL queries. _MySQL_ and newer versions of _MariaDB_ may apply sorting _after_ the result set rows are generated, including any variable calculations. That means that if the row includes a row counter that is incremented for each row, the counter will be calculated _before_ the sorting is applied. This is as opposed to older versions of _MariaDB_ that _always_ apply sorting _before_ row variables are calculated. Because of these differences, the driver may decide to construct the SQL queries differently. By default, the query without a counter but with the `ORDER BY` clause is created and is used as a subquery for the outer query that includes the row counter. This corresponds to _MySQL_ and newer versions of _MariaDB_. If `orderMode` option is \"pre\", no subquery is used and both the row counter and the `ORDER BY` clause are included in a single one-level query. If `orderMode` is \"preIfMariaDB\", the driver detects if it runs against a _MariaDB_ database and automatically uses the \"pre\" mode if so.\n\n* `mariaDB` - This is a deprecated option replaced by `orderMode`. If `true` (Boolean), the \"pre\" mode is forced.\n\n* `databaseCharacterSet` - The database character set. Used, for example, for case conversion in case-insensitive tests. Defaults to \"utf8\".\n\n* `useLocalTimezone` - When `true`, the driver will assume that the database is running in the same timezone as the application. By default, the database is expected to run in UTC timezone.\n\nNormally, a factory is created once by the application when it starts up and is used to construct DBOs throughout the application's lifecycle.\n\nThe DBO factory can be used to construct four types of DBOs:\n\n* _Fetch DBO_ for searching and loading records from the database.\n\n* _Insert DBO_ for creating new records.\n\n* _Update DBO_ for patching existing records.\n\n* _Delete DBO_ for deleting records.\n\nSome most basic usage examples for the four follow.\n\n### Fetching Records\n\nTo search and load _Order_ records from the database described above, the following code could be used:\n\n```javascript\n// build a fetch DBO for selecting 5 recent pending orders for a specific account\nconst fetchDBO = dboFactory.buildFetch('Order', {\n\n    // select all order record properties\n    props: [ '*' ],\n\n    // filter by status and account id passed in as a query parameter when executed\n    filter: [\n        [ 'status => is', 'PENDING' ],\n        [ 'accountRef => is', dbos.param('accountId') ]\n    ],\n\n    // order in descending order by order placement timestamp\n    order: [\n        'placedOn => desc'\n    ],\n\n    // select first 5 matched order records (that's right, records, not rows!)\n    range: [ 0, 5 ]\n});\n\n// configure MySQL database connection\nconst connection = require('mysql').createConnection({\n    host: 'localhost',\n    database: 'mydatabase',\n    user: 'myuser',\n    password: 'mypassword'\n});\n\n// connect and do the operations\nconnection.connect(err => {\n\n    // check if errors\n    if (err) {\n        console.error('connection error');\n        throw err;\n    }\n\n    // execute the fetch DBO on the connection and close it before exiting\n    fetchDBO.execute(connection, null, {\n        accountId: 10 // for example we want orders for the account id #10\n    }).then(\n        result => {\n            console.log('result:\\n' + JSON.stringify(result, null, '  '));\n            connection.end();\n        },\n        err => {\n            console.error('error:', err);\n            connection.end();\n        }\n    );\n});\n```\n\nThe `result` object will include a `records` property, which will be an array with all matched order records (up to 5 in our example), and may look something like this:\n\n```json\n{\n  \"recordTypeName\": \"Order\",\n  \"records\": [\n    {\n      \"id\": 1,\n      \"accountRef\": \"Account#10\",\n      \"placedOn\": \"2017-02-20T18:32:55.000Z\",\n      \"status\": \"PENDING\",\n      \"items\": [\n        {\n          \"id\": 101,\n          \"productRef\": \"Product#1\",\n          \"quantity\": 1\n        },\n        {\n          \"id\": 102,\n          \"productRef\": \"Product#2\",\n          \"quantity\": 10\n        }\n      ]\n    },\n    {\n      \"id\": 2,\n      ...\n    },\n    ...\n  ]\n}\n```\n\nDon't mind the `null` passed into the DBO's `execute()` method as the second argument for now. It is for the actor performing the operation (anonymous in this case) and it is explained later.\n\nWe could request to fetch only specific record properties and also include referred records such as the _Products_ and the _Accounts_:\n\n```javascript\nconst fetchDBO = dboFactory.buildFetch('Order', {\n\n    // select only specific properties\n    props: [\n        '.count',               // include total count of matched orders\n        'placedOn',             // only placedOn from the order\n        'items.quantity',       // plus quantity for the items\n        'items.productRef.*',   // plus product and all product properties\n        'accountRef.firstName', // plus account first name\n        'accountRef.lastName'   // and the last name\n    ],\n    ...\n});\n```\n\nThe result then would look something like the following:\n\n```json\n{\n  \"recordTypeName\": \"Order\",\n  \"count\": 12,\n  \"records\": [\n    {\n      \"id\": 1,\n      \"accountRef\": \"Account#10\",\n      \"placedOn\": \"2017-02-20T18:32:55.000Z\",\n      \"items\": [\n        {\n          \"productRef\": \"Product#1\",\n          \"quantity\": 1\n        },\n        {\n          \"productRef\": \"Product#2\",\n          \"quantity\": 10\n        }\n      ]\n    },\n    {\n      \"id\": 2,\n      ...\n    },\n    ...\n  ],\n  \"referredRecords\": {\n    \"Account#10\": {\n      \"firstName\": \"John\",\n      \"lastName\": \"Silver\"\n    },\n    \"Product#1\": {\n      \"id\": 1,\n      \"name\": \"Rope\",\n      \"price\": 9.99\n    },\n    \"Product#2\": {\n      \"id\": 2,\n      \"name\": \"Nails\",\n      \"price\": 4.5\n    }\n  }\n}\n```\n\nNote that the record id is always included even though not explicitely selected. Also, intermediate properties in the selected property paths are included.\n\nThe `count` is a so called _super-aggregate_, which is automatically added to the records types library. The detailed description of super-aggregates is provided later in this manual. For now, it shows the total number of matched records regardless of the query range, which can be convenient on the client side to drive the search results pagination.\n\n### Creating Records\n\nTo create a new order record we could use the following code:\n\n```javascript\n// create the DBO and pass new order record template to it\nconst insertDBO = dboFactory.buildInsert('Order', {\n    accountRef: 'Account#10',\n    placedOn: new Date(),\n    status: 'PENDING',\n    items: [\n        {\n            productRef: 'Product#1',\n            quantity: 1\n        },\n        {\n            productRef: 'Product#2',\n            quantity: 10\n        }\n    ]\n});\n\n// execute the DBO\ninsertDBO.execute(connection, null).then(\n    recordId => {\n        console.log('new Order id: ' + recordId);\n    },\n    err => {\n        console.error('error:', err);\n    }\n);\n```\n\nIn our example the record ids are auto-generated in the database, so we do not include them in the record template. The promise returned by the insert DBO resolves to the new record id.\n\n### Updating Records\n\nUpdating records involves special objects called _patches_, which are specifications of what needs to be changed in the matched records. Let's say we want to make the following changes to an order with a specific id:\n\n1. Update quantity on the first order line item.\n\n2. Add a new line item to the order.\n\n3. Change the order status.\n\nThe following code can be used to do that:\n\n```javascript\n// build the patch specification\nconst patches = require('x2node-patches');\nconst patch = patches.build(recordTypes, 'Order', [\n    { op: 'replace', path: '/items/0/quantity', value: 2 },\n    { op: 'add', path: '/items/-', value: {\n        productRef: 'Product#3',\n        quantity: 1\n    } },\n    { op: 'replace', path: '/status', value: 'PROCESSING' }\n]);\n\n// create the DBO passing the patch and the order record selector filter\nconst updateDBO = dboFactory.buildUpdate('Order', patch, [\n    [ 'id => is', dbos.param('orderId') ]\n]);\n\n// execute the DBO\nupdateDBO.execute(connection, null, null, {\n    orderId: 1\n}).then(\n    result => {\n        console.log('update operation status:\\n' + JSON.stringify(result, null, '  '));\n    },\n    err => {\n        console.error('error:', err);\n    }\n);\n```\n\nThe example above uses X2 Framework's [x2node-patches](https://www.npmjs.com/package/x2node-patches) module to build the patch specification using [JSON Patch](https://tools.ietf.org/html/rfc6902) notation.\n\nThe third `null` argument to the DBO's `execute()` method is for an optional record validation function that allows validating records after the patch is applied but before the record is saved into the database. This functionality is described later in this manual.\n\nThe `result` object returned by the operation will contain information about what records were updated as well as the updated records data itself. This is also described in detail later.\n\n### Deleting Records\n\nDeleting an order record could be done like this:\n\n```javascript\n// build the DBO for the specific order id\nconst deleteDBO = dboFactory.buildDelete('Order', [\n    [ 'id => is', dbos.param('orderId') ]\n]);\n\n// execute the DBO and pass the order id to it\ndeleteDBO.execute(connection, null, {\n    orderId: 1\n}).then(\n    result => {\n        console.log('delete operation status:\\n' + JSON.stringify(result, null, '  '));\n    },\n    err => {\n        console.error('error:', err);\n    }\n);\n```\n\nThe `result` object will tell if any records were matched and actually deleted.\n\n### Debug Logging\n\nSometimes it is useful to see what SQL statements are run against the database. To turn on the DBOs module's debug logging, which includes that information, the `NODE_DEBUG` environment variable must include word \"X2_DBO\" (see [Node.js API docs](https://nodejs.org/docs/latest-v4.x/api/util.html#util_util_debuglog_section) for details).\n\n## Record Type Definitions\n\nThe DBOs module introduces a number of attributes used in record types library definitions to map records and their properties to the database tables and columns. This mapping allows the DBO factory to construct the SQL queries. The DBOs module itself is a record types library extension and must be added to the library for the extended attributes to get processed:\n\n```javascript\nconst records = require('x2node-records');\nconst dbos = require('x2node-dbos');\n\nconst recordTypes = records.with(dbos).buildLibrary({\n    ...\n});\n```\n\n### Mapping Record Types\n\nEvery record type must have the main table, to which it is mapped. This is the table that has the record id as its primary key and normally stores the bulk of the scalar record properties as its columns. To associate a record type with a table, a `table` attribute is used in the definition:\n\n```javascript\nconst recordTypes = records.with(dbos).buildLibrary({\n    recordTypes: {\n        ...\n        'Order': {\n            table: 'orders',\n            properties: {\n                ...\n            }\n        },\n        ...\n    }\n});\n```\n\nIf `table` attribute is not specified, the record type name is used.\n\n### Mapping Stored Record Properties\n\nThe term _stored property_ is used to describe record properties that belong to the record type, are stored together with the records of the type. Later we will see that not all properties defined on a record type are stored properties. For example, some properties may be calculated on the fly when records are fetched from the database and therefore are not stored. Other properties may be stored but belong to a different record type and are imported into another record type. Views supported by the basic [x2node-records](https://www.npmjs.com/package/x2node-records) module are another example of properties that are not stored.\n\nA number of attributes specific to the DBOs module is used to map stored record properties to the tables and columns.\n\n#### Scalar Properties\n\nThe simples case of a record property is a scalar property stored in the record type's main table column. To associate such property with the specific column, a `column` property definition attribute is used:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'firstName': {\n                valueType: 'string',\n                column: 'fname'\n            },\n            'zip': {\n                valueType: 'string',\n                optional: true\n            }\n        }\n    },\n    ...\n}\n```\n\nThis will map the `firstName` property to the `fname` column of the `accounts` table and the `zip` property to its `zip` column (if `column` attribute is not specified, the property name is used):\n\n```sql\nCREATE TABLE accounts (\n    ...\n    fname VARCHAR(30) NOT NULL,\n    zip CHAR(5),\n    ...\n);\n```\n\nThe column data type must match the property value type. Also, the column may be nullable if the property is optional.\n\nA property does not have to be stored in the main record type table. If a property is stored in a separate table, the property definition must have a `table` attribute and a `parentIdColumn` attribute, which specifies the column in the property table that points back at the parent record id. Normally it does not make much sense to store scalar, simple value properties in a separate table, but it will work nonetheless. It makes more sense when it comes to nested object properties. For example, if an account address is stored in a separate table in a one-to-one relation with the main record table:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE account_addresses (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    street VARCHAR(50) NOT NULL,\n    ...\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n```\n\nthen it can be mapped like this:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'address': {\n                valueType: 'object',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                properties: {\n                    'street': {\n                        valueType: 'string'\n                    }\n                    ...\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\n#### Collection Properties\n\nWhen it comes to array and map properties, use of property tables becomes necessary due to the RDBMS nature. The example above can be modified to allow multiple addresses on an account:\n\n```sql\nCREATE TABLE account_addresses (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    account_id INTEGER UNSIGNED NOT NULL,\n    street VARCHAR(50) NOT NULL,\n    ...\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n```\n\nand the record type definition:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addresses': {\n                valueType: 'object[]',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                properties: {\n                    'id': {\n                        valueType: 'number',\n                        role: 'id'\n                    },\n                    'street': {\n                        valueType: 'string'\n                    }\n                    ...\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nIf an address has a type (\"Home\", \"Work\", etc.):\n\n```sql\nCREATE TABLE account_addresses (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    account_id INTEGER UNSIGNED NOT NULL,\n    type VARCHAR(10) NOT NULL,\n    street VARCHAR(50) NOT NULL,\n    ...\n    FOREIGN KEY (account_id) REFERENCES accounts (id),\n    UNIQUE (account_id, type)\n);\n```\n\nthen we could have the addresses on the account as a map:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addresses': {\n                valueType: 'object{}',\n                keyPropertyName: 'type',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                properties: {\n                    'id': {\n                        valueType: 'number',\n                        role: 'id'\n                    },\n                    'type': {\n                        valueType: 'string'\n                    },\n                    'street': {\n                        valueType: 'string'\n                    }\n                    ...\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nIf we don't want to have the address type as a property on the address record, then the key column can be specified using `keyColumn` property definition attribute instead of using `keyPropertyName`:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addresses': {\n                valueType: 'object{}',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                keyColumn: 'type',\n                keyValueType: 'string',\n                properties: {\n                    'id': {\n                        valueType: 'number',\n                        role: 'id'\n                    },\n                    'street': {\n                        valueType: 'string'\n                    }\n                    ...\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nNote, that in that case the `keyValueType` attribute must be provided as well (see [x2node-rsparser](https://www.npmjs.com/package/x2node-rsparser) module for details).\n\nSimple value collection properties utilize the `column` attribute to map the column in the collection table. For example, if we have a list of phone numbers associated with the account:\n\n```sql\nCREATE TABLE account_phones (\n    account_id INTEGER UNSIGNED NOT NULL,\n    phone CHAR(10) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n```\n\nthe definition will be:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'phones': {\n                valueType: 'string[]',\n                table: 'account_phones',\n                parentIdColumn: 'account_id',\n                column: 'phone'\n            }\n        }\n    },\n    ...\n}\n```\n\nAnd if we have a phone type as a map key:\n\n```sql\nCREATE TABLE account_phones (\n    account_id INTEGER UNSIGNED NOT NULL,\n    type VARCHAR(10) NOT NULL,\n    phone CHAR(10) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id),\n    UNIQUE (account_id, type)\n);\n```\n\nthe definition will be:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'phones': {\n                valueType: 'string{}',\n                table: 'account_phones',\n                parentIdColumn: 'account_id',\n                keyColumn: 'type',\n                keyValueType: 'string',\n                column: 'phone'\n            }\n        }\n    },\n    ...\n}\n```\n\nNote that use of `keyColumn` attribute becomes the only option for simple value map properties (no `keyPropertyName` is appropriate).\n\nThere is an important deviation between how the `keyColumn` and `keyPropertyName` attributes work when it comes to reference property maps. Such maps (as well as arrays) introduce a link table between the main tables of the referrer and the referred record types. When the `keyPropertyName` is used to map the map key, the key is located in the referred record type table. For example, if we extract the address records in the examples above into a separate record type, the tables will be:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE account_addresses (\n    account_id INTEGER UNSIGNED NOT NULL,\n    address_id INTEGER UNSIGNED NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id),\n    FOREIGN KEY (address_id) REFERENCES addresses (id),\n    UNIQUE (account_id, address_id)\n);\n\nCREATE TABLE addresses (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    type VARCHAR(10) NOT NULL,\n    street VARCHAR(50) NOT NULL,\n    ...\n);\n```\n\nand the definitions:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addressRefs': {\n                valueType: 'ref(Address){}',\n                keyPropertyName: 'type',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                column: 'address_id'\n            }\n        }\n    },\n    'Address': {\n        table: 'addresses',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            'type': {\n                valueType: 'string'\n            },\n            'street': {\n                valueType: 'string'\n            },\n            ...\n        }\n    },\n    ...\n}\n```\n\nSo, the `type` property for the map key is taken from the `addresses` table. On the other hand, if `keyColumn` attribute is used, the column is mapped to the link table and _not_ the referred record type table:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE account_addresses (\n    account_id INTEGER UNSIGNED NOT NULL,\n    type VARCHAR(10) NOT NULL,\n    address_id INTEGER UNSIGNED NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id),\n    FOREIGN KEY (address_id) REFERENCES addresses (id),\n    UNIQUE (account_id, type)\n);\n\nCREATE TABLE addresses (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    street VARCHAR(50) NOT NULL,\n    ...\n);\n```\n\nand the definitions:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addressRefs': {\n                valueType: 'ref(Address){}',\n                table: 'account_addresses',\n                parentIdColumn: 'account_id',\n                keyColumn: 'type',\n                keyValueType: 'string',\n                column: 'address_id'\n            }\n        }\n    },\n    'Address': {\n        table: 'addresses',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            'street': {\n                valueType: 'string'\n            },\n            ...\n        }\n    },\n    ...\n}\n```\n\n### Dependent Record References\n\nSome reference properties are not stored with the referring record. Instead, there is a reference property in the referred record type that points back at the referring record. The referred record type in this case is called a _dependent_ record type, because its records can exist only in the context of the referring record (unless the reverse reference property is optional), meaning the referring record must exist for the referred record to point at it.\n\nFor example, if we have records types _Account_ and _Order_ and the account has a list of references to the orders made for that account. The _Order_, even though a separate record type, has a reference back to the account it belongs to and can only exist in a context of an account. That makes the _Order_ a dependent record type.\n\nHere are the tables:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE orders (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    account_id INTEGER UNSIGNED NOT NULL,\n    ...\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n```\n\nand the definitions:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'orderRefs': {\n                valueType: 'ref(Order)[]',\n                reverseRefProperty: 'accountRef'\n            }\n        }\n    },\n    'Order': {\n        table: 'orders',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            'accountRef': {\n                valueType: 'ref(Account)',\n                column: 'account_id',\n                modifiable: false\n            },\n            ...\n        }\n    },\n    ...\n}\n```\n\nThe `orderRefs` property of the _Account_ record type is not stored anywhere in any tables and columns associated with it, so it is not a stored property of the _Account_ record type. Instead, it is a property of the dependent _Order_ record type and is stored with the order records in `accountRef` property. This is why the `orderRefs` property does not have any `table` and `column` definition attributes. Instead, it has a `reverseRefProperty` attribute that names the property in the referred record type that points back at the referring record.\n\nThe dependent record reference properties are only allowed as top record type properties (not in nested objects). And the reverse reference properties in the referred record types are also only allowed to be top record type properties, plus they are required to be scalar, non-polymorph and not be dependent record references themselves. They are, however, allowed to be stored in a separate table (this may be useful when `keyColumn` is used with a dependent record reference map property, in which case the map key column will reside in the separate link table).\n\nAs it will be shown later in this manual, normally, when a record with dependent record reference properties is deleted, the operation is automatically cascaded on to the dependent records, which are deleted as well. This is called _strong dependencies_. In the example above, it makes sense to delete all _Order_ records associated with an _Account_ when the _Account_ record is deleted from the database. Sometimes, however, a dependent reference mechanism needs to be used to import a reference property to a record (for data access convenience), but the referred record type is not exactly dependent. This is called a _weak dependence_. One side effect of a weak dependence is that the deletion operation is not cascaded over it (the operation will fail on the database level if referred records exist and foreign key constraints are properly utilized). To make a dependent reference property weak, a `weakDependency` property definition attribute can be added with value `true`.\n\n### Shared Link Tables\n\nSometimes, two record types may have references at each other, but none of them is dependent on another. For example, if we have record types _Account_ and _Address_ and they are in a many-to-many relationship so that a single address can be shared by multiple accounts and an account can have multiple addresses:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE accounts_addresses (\n    account_id INTEGER UNSIGNED NOT NULL,\n    address_id INTEGER UNSIGNED NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id),\n    FOREIGN KEY (address_id) REFERENCES addresses (id),\n    UNIQUE (account_id, address_id)\n);\n\nCREATE TABLE addresses (\n    id INTEGER UNSIGNED PRIMARY KEY,\n    ...\n);\n```\n\nAt the same time, we want to have a list of addresses on the account records and we want to have a list of accounts that use an address on the address record. It can be done like this:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'addressRefs': {\n                valueType: 'ref(Address)[]',\n                table: 'accounts_addresses',\n                parentIdColumn: 'account_id',\n                column: 'address_id'\n            }\n        }\n    },\n    'Address': {\n        table: 'addresses',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            ...\n            'accountRefs': {\n                valueType: 'ref(Account)[]',\n                table: 'accounts_addresses',\n                parentIdColumn: 'address_id',\n                column: 'account_id'\n            }\n        }\n    },\n    ...\n}\n```\n\nProperties `addressRefs` on record type _Account_ and `accountRefs` on record type _Address_ share the same link table `accounts_addresses`. This case is unique in the sense that modification of a record of one record type may have a side-effect of making changes to stored properties of some records of another record type. Such record types and the properties that reference each other are known as _entangled_.\n\n### Calculated Properties\n\nIt is possible to have properties on a record type that are not stored in the database directly, but are calculated every time a record is fetched from the database. Such properties are called _calculated properties_. Instead of a column and table, a calculated property has a value expression associated with it using `valueExpr` property definition attribute. The `valueExpr` attribute is a string that uses a special expression syntax that includes value literals, references to other properties of the record, value transformation functions and operators. Here is the expression language EBNF definition:\n\n```ebnf\nExpr = [ \"+\" | \"-\" ] , Term , { ( \"+\" | \"-\" ) , Term }\n    | String\n    | Boolean\n    ;\n\nTerm = Factor , { ( \"*\" | \"/\" ) , Factor }\n    ;\n\nFactor = FunctionCall\n    | PropertyRef\n    | Number\n    | \"(\" , Expr , \")\"\n    ;\n\nFunctionCall = FunctionName , \"(\" , Expr , { \",\" , Expr } , \")\"\n    ;\n\nString = '\"' , { CHAR } , '\"' | \"'\" , { CHAR } , \"'\" ;\nBoolean = \"true\" | \"false\" ;\nNumber = DIGIT , { DIGIT } , [ \".\" , DIGIT , { DIGIT } ] ;\nFunctionName = ? See Description ? ;\nPropertyRef = ? See Description ? ;\n```\n\nThe following value transformation functions are supported:\n\n* `length`, `len` - Takes single string argument, yields string length.\n\n* `lower`, `lc`, `lcase`, `lowercase` - Takes single string argument, yields all lower-case string.\n\n* `upper`, `uc`, `ucase`, `uppercase` - Takes single string argument, yields all upper-case string.\n\n* `substring`, `sub`, `mid`, `substr` - Yields substring of the string provided as the first argument. The second argument is the first substring character index, starting from zero. The optional third argument is the maximum substring length. If not provided, the end of the input string is used.\n\n* `lpad` - Pads the string provided as the first argument on the left to achieve the minimum length provided as the second argument using the character provided as the third argument as the padding character.\n\n* `concat`, `cat` - Concatenate provided string arguments.\n\n* `coalesce` - Yield first non-null argument.\n\nThe properties in the expressions are referred using dot notation. In a calculated nested object property, to refer to a property in the parent object a caret character is used to denote the immediate parent.\n\nFor example, given the record types library used in the opening [Usage](#usage) section, the _Order_ records could be augmented with some calculated properties:\n\n```javascript\n{\n    ...\n    'Order': {\n        ...\n        properties: {\n            ...\n            'customerName': {\n                valueType: 'string',\n                valueExpr: 'concat(accountRef.firstName, \" \", accountRef.lastName)'\n            },\n            ...\n            'items': {\n                ...\n                properties: {\n                    ...\n                    'totalCost': {\n                        valueType: 'number',\n                        valueExpr: 'productRef.price * quantity'\n                    },\n                    'orderStatus': {\n                        valueType: 'string',\n                        valueExpr: '^.status'\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nThis example shows that reference properties can be hopped over to access properties of the referred records. Also, if there were more nesting levels, jumping over multiple children (`prop.nestedProp.moreNestedProp`) and multiple parents (`^.^.grandparentProp.nestedProp`) is possible with the dot notation.\n\nWhen the records with calculated properties are fetched from the database, the expressions are converted into SQL value expressions and are calculated on the database side.\n\n### Aggregate Properties\n\nA special case of a calculated property is an _aggregate property_. An aggregate property requires:\n\n* A collection property, elements of which it aggregates. The collection is called _aggregated collection_.\n* An expression for the aggregated values, called _aggregated value expression_.\n\n* The _aggregation function_, which determines how the values are aggregated.\n\n* And optionally a filter to include only certain elements of the aggregated collection.\n\nAn `aggregate` property definition attribute is used to specify these elements. For example, our _Order_ records could include properties that aggregate the order line items like the following:\n\n```javascript\n{\n    ...\n    'Order': {\n        table: 'orders',\n        properties: {\n            ...\n            'itemsCount': {\n                valueType: 'number',\n                aggregate: {\n                    collection: 'items',\n                    valueExpr: 'id => count'\n                }\n            },\n            'orderTotal': {\n                valueType: 'number',\n                aggregate: {\n                    collection: 'items',\n                    valueExpr: 'productRef.price * quantity => sum'\n                }\n            },\n            'expensiveProductsCount': {\n                valueType: 'number',\n                aggregate: {\n                    collection: 'items',\n                    valueExpr: 'quantity => sum',\n                    filter: [\n                        [ 'productRef.price => min', 1000 ]\n                    ]\n                }\n            },\n            ...\n            'items': {\n                valueType: 'object[]',\n                table: 'order_items',\n                parentIdColumn: 'order_id',\n                properties: {\n                    'id': {\n                        valueType: 'number',\n                        role: 'id'\n                    },\n                    'productRef': {\n                        valueType: 'ref(Product)',\n                        column: 'product_id',\n                        modifiable: false\n                    },\n                    'quantity': {\n                        valueType: 'number'\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nThe value expressions for the aggregate properties have format:\n\n```\nExpr => AggregateFunc\n```\n\nWhere `Expr` is a regular value expression calculated in the context of the aggregated collection property, and `AggregateFunc` is one of:\n\n* `count` - Number of unique values yielded by the aggregated expression.\n\n* `sum` - Sum of the values yielded by the aggregated expression.\n\n* `min` - The smallest value yielded by the aggregated expression.\n\n* `max` - The largest value yielded by the aggregated expression.\n\n* `avg` - Average of the values yielded by the aggregated expression.\n\nThe optional filter specification format will be discussed later in this manual when we talk about fetch DBO.\n\nAn aggregate property can also be a map, in which case the aggregation is further subdivided and grouped by the map key. To specify the map key use `keyPropertyName` attribute in the aggregate property definition.\n\n### Embedded Objects\n\nProperties of a scalar nested object do not have to be stored in a separate table. The nested object's properties can be stored in the columns of the main record type table and the nested object can be used simply to organize the JSON structure of the record. For example, an address on an _Account_ record could be stored in the same table:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    fname VARCHAR(30) NOT NULL,\n    lname VARCHAR(30) NOT NULL,\n    street VARCHAR(50) NOT NULL,\n    city VARCHAR(50) NOT NULL,\n    state CHAR(2) NOT NULL,\n    zip CHAR(5) NOT NULL\n);\n```\n\nbut be a nested object in the record type:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            'firstName': {\n                valueType: 'string',\n                column: 'fname'\n            },\n            'lastName': {\n                valueType: 'string',\n                column: 'lname'\n            },\n            'address': {\n                valueType: 'object',\n                properties: {\n                    'street': {\n                        valueType: 'string'\n                    },\n                    'city': {\n                        valueType: 'string'\n                    },\n                    'state': {\n                        valueType: 'string'\n                    },\n                    'zip': {\n                        valueType: 'string'\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nSince the `address` property does not have a `table` attribute, the framework knows that it is stored in the parent table.\n\nIn the example above, the `address` property is required. Things turn slightly more complicated if the property needs to be optional. First, the `NOT NULL` constraints are removed from the table:\n\n```sql\nCREATE TABLE accounts (\n    ...\n    street VARCHAR(50),\n    city VARCHAR(50),\n    state CHAR(2),\n    zip CHAR(5)\n);\n```\n\nBut now, the framework needs to be able to tell if the `address` nested object is present on a record it's loading from the database or not. To do that, the `presenceTest` attribute is specified on the property definition. The presence test is a Boolean expression written as a filter specification, which is discussed in detail later in this manual. But here is our example:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'address': {\n                valueType: 'object',\n                optional: true, // address is now optional\n                presenceTest: [\n                    [ 'state => present' ],\n                    [ 'zip => present' ]\n                ],\n                properties: {\n                    'street': {\n                        valueType: 'string',\n                        optional: true\n                    },\n                    'city': {\n                        valueType: 'string',\n                        optional: true\n                    },\n                    'state': {\n                        valueType: 'string'\n                    },\n                    'zip': {\n                        valueType: 'string'\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nThis definition makes properties `street` and `city` optional, but `state` and `zip` are still required. The presence test checks if `state` and `zip` are present on the record, and if they are not, the whole `address` property is considered to be absent.\n\n### Polymorphic Objects\n\nPolymorphic objects are treated very similarly to nested objects where each polymorphic object subtype is like a nested object property on the base polymorphic object with the properties that describe the subtype-specific properties. The table mappings work the same as for scalar nested objects. For example, if we have two types of payment information that can be associated with an account&mdash;credit cards and bank accounts&mdash;the tables could be:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    fname VARCHAR(30) NOT NULL,\n    lname VARCHAR(30) NOT NULL\n);\n\nCREATE TABLE account_creditcards (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    association VARCHAR(20) NOT NULL,\n    last4digits CHAR(4) NOT NULL,\n    expdate CHAR(4) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n\nCREATE TABLE account_bankaccounts (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    routing_num CHAR(9) NOT NULL,\n    account_type VARCHAR(10) NOT NULL,\n    last4digits CHAR(4) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n```\n\nthen the record type definition would be:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'paymentInfo': {\n                valueType: 'object',\n                typePropertyName: 'type',\n                subtypes: {\n                    'CREDIT_CARD': {\n                        table: 'account_creditcards',\n                        parentIdColumn: 'account_id',\n                        properties: {\n                            'association': {\n                                valueType: 'string'\n                            },\n                            'last4Digits': {\n                                valueType: 'string',\n                                column: 'last4digits'\n                            },\n                            'expirationDate': {\n                                valueType: 'string',\n                                column: 'expdate'\n                            }\n                        }\n                    },\n                    'BANK_ACCOUNT': {\n                        table: 'account_bankaccounts',\n                        parentIdColumn: 'account_id',\n                        properties: {\n                            'routingNumber': {\n                                valueType: 'string',\n                                column: 'routing_num'\n                            },\n                            'accountType': {\n                                valueType: 'string',\n                                column: 'account_type'\n                            },\n                            'last4Digits': {\n                                valueType: 'string',\n                                column: 'last4digits'\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nProperties common to all subtypes could be stored either in the parent table (in the example above the `last4digits` column is moved to the `accounts` table and the `last4Digits` property is moved to the `properties` section of the `paymentInfo` property definition), or they could be stored in a separate table:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    fname VARCHAR(30) NOT NULL,\n    lname VARCHAR(30) NOT NULL\n);\n\nCREATE TABLE account_paymentinfos (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    last4digits CHAR(4) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES accounts (id)\n);\n\nCREATE TABLE account_creditcards (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    association VARCHAR(20) NOT NULL,\n    expdate CHAR(4) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES account_paymentinfos (id)\n);\n\nCREATE TABLE account_bankaccounts (\n    account_id INTEGER UNSIGNED NOT NULL UNIQUE,\n    routing_num CHAR(9) NOT NULL,\n    account_type VARCHAR(10) NOT NULL,\n    FOREIGN KEY (account_id) REFERENCES account_paymentinfos (id)\n);\n```\n\nand the definitions:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'paymentInfo': {\n                valueType: 'object',\n                typePropertyName: 'type',\n                table: 'account_paymentinfos',\n                parentIdColumn: 'account_id',\n                properties: {\n                    'last4Digits': {\n                        valueType: 'string',\n                        column: 'last4digits'\n                    }\n                },\n                subtypes: {\n                    'CREDIT_CARD': {\n                        table: 'account_creditcards',\n                        parentIdColumn: 'account_id',\n                        properties: {\n                            'association': {\n                                valueType: 'string'\n                            },\n                            'expirationDate': {\n                                valueType: 'string',\n                                column: 'expdate'\n                            }\n                        }\n                    },\n                    'BANK_ACCOUNT': {\n                        table: 'account_bankaccounts',\n                        parentIdColumn: 'account_id',\n                        properties: {\n                            'routingNumber': {\n                                valueType: 'string',\n                                column: 'routing_num'\n                            },\n                            'accountType': {\n                                valueType: 'string',\n                                column: 'account_type'\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nWhen the framework builds queries for fetching account records in the examples above, it will join all the subtype tables and see which one has a record. Depending on that, it will figure out the nested object subtype. That logic relies on the database having a single record in only a single subtype table for a given base polymorphic record. In the second example, it is enforced by having a `UNIQUE` constraint on the `account_id` column of the `account_paymentinfos` table. In the first example, however, it is not completely enforced on the database level&mdash;physically it is possible to have a row in both `account_creditcards` and `account_bankaccounts` tables each sharing the same account id.\n\nSometimes, a subtype does not have any subtype-specific properties and therefore there is no need for a separate table for it. In that case, the framework cannot determine the subtype by joining the tables and simply checking which one has a record. To solve it, the type property needs to be actually stored in a column on the base polymorphic object's table. For example, if we have a polymorphic _Event_ record type where subtype _OPENED_ has a subtype-specific property `openerName`, which, for the example sake, is stored in a separate table, and subtype _CLOSED_ does not have any subtype-specific properties. The tables are:\n\n```sql\nCREATE TABLE events (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    type VARCHAR(10) NOT NULL,\n    happened_on TIMESTAMP\n);\n\nCREATE TABLE events_open (\n    id INTEGER UNSIGNED NOT NULL UNIQUE,\n    opener_name VARCHAR(50) NOT NULL,\n    FOREIGN KEY (id) REFERENCES events (id)\n);\n```\n\nThe `type` column of the `events` table is used to store the event type (either \"OPENED\" or \"CLOSED\"). The definition should then be:\n\n```javascript\n{\n    ...\n    'Event': {\n        table: 'events',\n        typePropertyName: 'type',\n        typeColumn: 'type',\n        properties: {\n            'happenedOn': {\n                valueType: 'datetime',\n                column: 'happened_on'\n            }\n        },\n        subtypes: {\n            'OPENED': {\n                table: 'events_open',\n                parentIdColumn: 'id',\n                properties: {\n                    'openerName': {\n                        valueType: 'string',\n                        column: 'opener_name'\n                    }\n                }\n            },\n            'CLOSED': {\n                properties: {}\n            }\n        }\n    },\n    ...\n}\n```\n\nNote the `typeColumn` attribute that tells the framework where to find/store the record subtype.\n\n### Ordered Collections\n\nWhen collection properties are fetched from the database, it is possible to specify the order in which they are returned. For that, any collection property definition can have an `order` attribute. For example:\n\n```javascript\n{\n    ...\n    'Order': {\n        table: 'orders',\n        properties: {\n            ...\n            'items': {\n                valueType: 'object[]',\n                table: 'order_items',\n                parentIdColumn: 'order_id',\n                order: [ 'productRef.name', 'quantity => desc' ],\n                properties: {\n                    'id': {\n                        valueType: 'number',\n                        role: 'id'\n                    },\n                    'productRef': {\n                        valueType: 'ref(Product)',\n                        column: 'product_id',\n                        modifiable: false\n                    },\n                    'quantity': {\n                        valueType: 'number'\n                    }\n                }\n            }\n        }\n    },\n    ...\n}\n```\n\nOr, another example:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'orderRefs': {\n                valueType: 'ref(Order)[]',\n                reverseRefProperty: 'accountRef',\n                order: [ 'placedOn => desc' ]\n            }\n        }\n    },\n    ...\n}\n```\n\nThe order specification is described in detail later in this manual when we talk about the fetch DBO.\n\nNote, that to order a simple value collection by the value, `$value` pseudo-property reference can be used.\n\n### Array Index Column\n\nUnless an `order` attribute is specified on an array property, the order, in which the elements will be returned in the fetch DBO result, is undetermined. It is possible, however, to make an array property strictly ordered by the insertion order. To do that, the table used to store the array elements can have a special element index column maintained automatically by the framework. For example if we want to have tags on _Product_ records and we want the tags list to have specific order, we add a tag index column to the table:\n\n```sql\nCREATE TABLE products (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    ...\n);\n\nCREATE TABLE product_tags (\n    product_id INTEGER UNSIGNED NOT NULL,\n    ind TINYINT UNSIGNED NOT NULL,\n    tag VARCHAR(20) NOT NULL,\n    FOREIGN KEY (product_id) REFERENCES products (id),\n    UNIQUE (product_id, ind)\n);\n```\n\nTo let the framework manage the index column, `indexColumn` attribute is added to the array property definition:\n\n```javascript\n{\n    ...\n    'Product': {\n        table: 'accounts',\n        properties: {\n            ...\n            'tags': {\n                valueType: 'string[]',\n                table: 'product_tags',\n                parentIdColumn: 'product_id',\n                indexColumn: 'ind',\n                column: 'tag'\n            }\n        }\n    },\n    ...\n}\n```\n\nWhenever the DBOs are used to create and modify the `tags` array, the framework will be generating additional SQL to maintain the index values in sync with the array element indexes. And when a fetch DBO is used to fetch _Product_ records, the `tags` property will always be ordered by the index column.\n\nThe same works with nested object arrays as well.\n\n### Filtered Collection Views\n\nIt is also possible to specify filtered views of collection properties that include only those elements that match a certain criteria. For example:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            ...\n            'orderRefs': {\n                valueType: 'ref(Order)[]',\n                reverseRefProperty: 'accountRef'\n            },\n            'pendingOrderRefs': {\n                viewOf: 'orderRefs',\n                filter: [\n                    [ 'status => is', 'PENDING' ]\n                ]\n            }\n        }\n    },\n    ...\n}\n```\n\nNote that the `filter` attribute can be specified only on a view property, not on the actual property itself, which always includes all of its elements.\n\nThe filter specification is described in detail later in this manual when we talk about the fetch DBO.\n\n### Record Meta-Info Properties\n\nThe DBOs module introduces a number special _meta-info properties_ that can be specified on a record type and are maintained automatically by the framework. Such properties use `role` property definition attribute to specify their type. For example:\n\n```javascript\n{\n    ...\n    'Account': {\n        table: 'accounts',\n        properties: {\n            'id': {\n                valueType: 'number',\n                role: 'id'\n            },\n            'version': {\n                valueType: 'number',\n                role: 'version'\n            },\n            'createdOn': {\n                valueType: 'datetime',\n                role: 'creationTimestamp',\n                column: 'created_on'\n            },\n            'createdBy': {\n                valueType: 'string',\n                role: 'creationActor',\n                column: 'created_by'\n            },\n            'modifiedOn': {\n                valueType: 'datetime',\n                role: 'modificationTimestamp',\n                column: 'modified_on'\n            },\n            'modifiedBy': {\n                valueType: 'string',\n                role: 'modificationActor',\n                column: 'modified_by'\n            },\n            ...\n        }\n    },\n    ...\n}\n```\n\nWhich has to be reflected in the `accounts` database table:\n\n```sql\nCREATE TABLE accounts (\n    id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n    version INTEGER UNSIGNED NOT NULL,\n    created_on TIMESTAMP(3) DEFAULT 0,\n    created_by VARCHAR(30) NOT NULL,\n    modified_on TIMESTAMP(3) NULL,\n    modified_by VARCHAR(30),\n    ...\n);\n```\n\nThe following meta-info property roles are supported:\n\n* `version` - Record version. A new record will have version 1. Every time a record is updated, the framework will increment the version property.\n\n* `creationTimestamp` - Timestamp when the record was created.\n\n* `creationActor` - Stamp of the actor that created the record (see [x2node-common](https://www.npmjs.com/package/x2node-common) module for the framework's notion of _actor_).\n\n* `modificationTimestamp` - Timestamp when the record was last time modified. The property is optional by default.\n\n* `modificationActor` - Stamp of the actor that modified the record last time. The property is optional by default.\n\nAll meta-info properties are marked as non-modifiable and from the application point of view they are read only.\n\n### Generated Properties\n\nA generated property is a property whose value is automatically assigned when a new record is created. Therefore, values for generated properties do not have to be provided in the record template passed into the insert DBO. A typical example of a generated property is a record id auto-assigned by the database (the _MySQL_'s `AUTO_INCREMENT` columns, _PostgreSQL_'s `SERIAL` columns, etc.).\n\nA generated property has a _generator_ associated with it. The generator associated with properties auto-assigned by the database, like the record ids mentioned above, is called _auto_. This is the default generator assigned to all properties that have `role` attribute equal \"id\" unless explici","maintainers":[{"name":"levahim","email":"lev@boylesoftware.com"}],"time":{"modified":"2022-06-29T04:43:36.168Z","created":"2017-04-25T21:48:58.639Z","1.0.0-beta.0":"2017-04-25T21:48:58.639Z","1.0.0-beta.1":"2017-05-07T00:25:33.659Z","1.0.0-beta.2":"2017-05-12T21:20:24.809Z","1.0.0-beta.3":"2017-05-13T23:00:41.015Z","1.0.0":"2017-05-15T21:40:56.693Z","1.0.1":"2017-05-19T22:08:53.873Z","1.0.2":"2017-06-19T19:04:06.115Z","1.0.3":"2017-06-19T20:46:49.090Z","1.0.4":"2017-07-11T22:18:19.785Z","1.0.5":"2017-07-12T21:01:52.354Z","1.0.6":"2017-08-01T16:25:39.943Z","1.0.7":"2017-08-05T20:12:16.612Z","1.0.8":"2017-09-07T22:40:00.450Z","1.0.9":"2017-09-08T22:51:46.257Z","1.0.10":"2017-09-12T00:19:32.004Z","1.0.11":"2017-11-13T18:49:36.734Z","1.0.12":"2017-11-14T19:41:22.222Z","1.0.13":"2017-11-15T18:33:31.895Z","1.0.14":"2017-12-26T19:50:24.497Z","1.0.15":"2018-01-03T18:00:06.983Z","1.0.16":"2018-01-16T23:54:28.865Z","1.1.0":"2018-01-21T22:09:10.652Z","1.1.1":"2018-01-23T03:50:46.977Z","1.2.0":"2018-02-07T23:32:08.523Z","1.3.0":"2018-02-09T22:56:57.825Z","1.4.0":"2018-03-12T19:31:16.795Z","1.4.1":"2018-05-07T17:43:49.950Z","1.4.2":"2018-06-05T22:54:36.479Z","1.4.3":"2018-06-18T22:19:47.570Z","1.4.4":"2018-06-22T23:30:46.864Z","1.5.0":"2018-07-04T16:28:55.598Z","1.5.1":"2018-07-12T18:42:47.785Z","1.6.0":"2018-08-14T17:13:20.078Z","1.7.0":"2018-08-19T23:00:45.111Z","1.7.1":"2018-08-25T19:35:55.893Z","1.8.0":"2018-10-08T16:25:48.527Z","1.8.1":"2018-10-26T22:51:53.901Z","1.8.2":"2018-11-30T18:19:42.567Z","1.8.3":"2018-12-05T18:24:08.775Z","1.9.0":"2019-01-20T01:25:07.401Z","1.9.1":"2019-05-28T21:27:34.998Z"},"homepage":"https://github.com/boylesoftware/x2node-dbos#readme","keywords":["sql","x2node","nodejs"],"repository":{"type":"git","url":"git+https://github.com/boylesoftware/x2node-dbos.git"},"author":{"name":"Lev Himmelfarb","email":"lev@boylesoftware.com"},"bugs":{"url":"https://github.com/boylesoftware/x2node-dbos/issues"},"license":"MIT","readmeFilename":"README.md"}