Compare commits

..

22 Commits

Author SHA1 Message Date
03baffd9fd 3.1.52 2020-09-25 21:05:22 +00:00
f29ae67580 fix(core): update 2020-09-25 21:05:21 +00:00
e550a8dbd6 3.1.51 2020-09-25 20:42:39 +00:00
cf6ef25a8d fix(core): update 2020-09-25 20:42:38 +00:00
29c512b0cc 3.1.50 2020-09-24 14:10:55 +00:00
105f69d1c9 fix(core): update 2020-09-24 14:10:54 +00:00
4c375f8465 3.1.49 2020-09-10 10:36:01 +00:00
9466af6a4a fix(core): update 2020-09-10 10:36:00 +00:00
c5aa747f42 3.1.48 2020-09-10 10:12:18 +00:00
b5f2474f65 fix(core): update 2020-09-10 10:12:17 +00:00
85f0d99934 3.1.47 2020-09-09 05:05:42 +00:00
3b2d3d9072 fix(core): update 2020-09-09 05:05:41 +00:00
3ff5c36fdf 3.1.46 2020-09-09 05:00:10 +00:00
a5acc2fe4e fix(core): update 2020-09-09 05:00:09 +00:00
9c81257101 3.1.45 2020-09-09 04:51:57 +00:00
f7342962f4 fix(core): update 2020-09-09 04:51:56 +00:00
bcd10205d3 3.1.44 2020-09-09 03:51:22 +00:00
6cab20f32d fix(core): update 2020-09-09 03:51:21 +00:00
5aaa6ad2d6 3.1.43 2020-09-09 02:50:28 +00:00
635256f2f6 fix(core): update 2020-09-09 02:50:27 +00:00
f799d3efa5 3.1.42 2020-09-09 02:21:16 +00:00
f74020ba96 fix(core): update 2020-09-09 02:21:15 +00:00
7 changed files with 164 additions and 183 deletions

166
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartdata", "name": "@pushrocks/smartdata",
"version": "3.1.41", "version": "3.1.52",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -1646,9 +1646,9 @@
} }
}, },
"@pushrocks/smartlog": { "@pushrocks/smartlog": {
"version": "2.0.36", "version": "2.0.39",
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.36.tgz", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.39.tgz",
"integrity": "sha512-guM03567UFZebx3urBQdiQecZwKvrR8c8fzt7EDPrI1ihArZc7ab6MQEu9yklPKqJMGLEz8t0oExgQ8804r73g==", "integrity": "sha512-fHCoBLwKM+F3jN5nZH6QEcEVWtgyESN+ysT9KLxmM/wrhIibG98yLxp6kwfZZbv6aKmHWbtKEvBmv+Vd4Hfwlg==",
"requires": { "requires": {
"@pushrocks/isounique": "^1.0.4", "@pushrocks/isounique": "^1.0.4",
"@pushrocks/smartlog-interfaces": "^2.0.20" "@pushrocks/smartlog-interfaces": "^2.0.20"
@ -2177,9 +2177,9 @@
} }
}, },
"@tsclass/tsclass": { "@tsclass/tsclass": {
"version": "3.0.24", "version": "3.0.25",
"resolved": "https://verdaccio.lossless.one/@tsclass%2ftsclass/-/tsclass-3.0.24.tgz", "resolved": "https://verdaccio.lossless.one/@tsclass%2ftsclass/-/tsclass-3.0.25.tgz",
"integrity": "sha512-fzmTQOkSqoUWhNSadbb5qxfjph3csZFiryBn24an1j+euFWYxEaaeSPBqPV3flxoHXzk68BTkho1ffmiypX5Kw==", "integrity": "sha512-CGfjdltByZYXyV+6WFOhBELjXDoes37Ww4w35D3MlCxT7MAKoxJn+PnIZ7Add4rJcJwziLuftYVKwKnY+FRRgA==",
"requires": { "requires": {
"@pushrocks/tapbundle": "^3.2.9", "@pushrocks/tapbundle": "^3.2.9",
"type-fest": "^0.16.0" "type-fest": "^0.16.0"
@ -2264,27 +2264,6 @@
"@types/express": "*" "@types/express": "*"
} }
}, },
"@types/cross-spawn": {
"version": "6.0.2",
"resolved": "https://verdaccio.lossless.one/@types%2fcross-spawn/-/cross-spawn-6.0.2.tgz",
"integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/debug": {
"version": "4.1.5",
"resolved": "https://verdaccio.lossless.one/@types%2fdebug/-/debug-4.1.5.tgz",
"integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==",
"dev": true
},
"@types/dedent": {
"version": "0.7.0",
"resolved": "https://verdaccio.lossless.one/@types%2fdedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A==",
"dev": true
},
"@types/default-gateway": { "@types/default-gateway": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://verdaccio.lossless.one/@types%2fdefault-gateway/-/default-gateway-3.0.1.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fdefault-gateway/-/default-gateway-3.0.1.tgz",
@ -2344,21 +2323,6 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/find-cache-dir": {
"version": "3.2.0",
"resolved": "https://verdaccio.lossless.one/@types%2ffind-cache-dir/-/find-cache-dir-3.2.0.tgz",
"integrity": "sha512-+JeT9qb2Jwzw72WdjU+TSvD5O1QRPWCeRpDJV+guiIq+2hwR0DFGw+nZNbTFjMIVe6Bf4GgAKeB/6Ytx6+MbeQ==",
"dev": true
},
"@types/find-package-json": {
"version": "1.1.1",
"resolved": "https://verdaccio.lossless.one/@types%2ffind-package-json/-/find-package-json-1.1.1.tgz",
"integrity": "sha512-XMCocYkg6VUpkbOQMKa3M5cgc3MvU/LJKQwd3VUJrWZbLr2ARUggupsCAF8DxjEEIuSO6HlnH+vl+XV4bgVeEQ==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/form-data": { "@types/form-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://verdaccio.lossless.one/@types%2fform-data/-/form-data-2.5.0.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fform-data/-/form-data-2.5.0.tgz",
@ -2397,22 +2361,10 @@
"@types/uglify-js": "*" "@types/uglify-js": "*"
} }
}, },
"@types/lockfile": {
"version": "1.0.1",
"resolved": "https://verdaccio.lossless.one/@types%2flockfile/-/lockfile-1.0.1.tgz",
"integrity": "sha512-65WZedEm4AnOsBDdsapJJG42MhROu3n4aSSiu87JXF/pSdlubxZxp3S1yz3kTfkJ2KBPud4CpjoHVAptOm9Zmw==",
"dev": true
},
"@types/lodash": { "@types/lodash": {
"version": "4.14.159", "version": "4.14.161",
"resolved": "https://verdaccio.lossless.one/@types%2flodash/-/lodash-4.14.159.tgz", "resolved": "https://verdaccio.lossless.one/@types%2flodash/-/lodash-4.14.161.tgz",
"integrity": "sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg==" "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA=="
},
"@types/md5-file": {
"version": "4.0.2",
"resolved": "https://verdaccio.lossless.one/@types%2fmd5-file/-/md5-file-4.0.2.tgz",
"integrity": "sha512-8gacRfEqLrmZ6KofpFfxyjsm/LYepeWUWUJGaf5A9W9J5B2/dRZMdkDqFDL6YDa9IweH12IO76jO7mpsK2B3wg==",
"dev": true
}, },
"@types/mime": { "@types/mime": {
"version": "2.0.3", "version": "2.0.3",
@ -2431,19 +2383,10 @@
"resolved": "https://verdaccio.lossless.one/@types%2fminimatch/-/minimatch-3.0.3.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fminimatch/-/minimatch-3.0.3.tgz",
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
}, },
"@types/mkdirp": {
"version": "1.0.1",
"resolved": "https://verdaccio.lossless.one/@types%2fmkdirp/-/mkdirp-1.0.1.tgz",
"integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/mongodb": { "@types/mongodb": {
"version": "3.5.26", "version": "3.5.27",
"resolved": "https://verdaccio.lossless.one/@types%2fmongodb/-/mongodb-3.5.26.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fmongodb/-/mongodb-3.5.27.tgz",
"integrity": "sha512-p0X2VJgIBNHfNBdZdzzG8eQ/3bf6mQoXDT0UhVyVEdSzXEa1+2pFcwGvEZp72sjztyBwfRKlgrXMjCVavLcuGg==", "integrity": "sha512-1jxKDgdfJEOO9zp+lv43p8jOqRs02xPrdUTzAZIVK9tVEySfCEmktL2jEu9A3wOBEOs18yKzpVIKUh8b8ALk3w==",
"requires": { "requires": {
"@types/bson": "*", "@types/bson": "*",
"@types/node": "*" "@types/node": "*"
@ -2459,9 +2402,9 @@
} }
}, },
"@types/node": { "@types/node": {
"version": "14.6.0", "version": "14.11.2",
"resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-14.6.0.tgz", "resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-14.11.2.tgz",
"integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA=="
}, },
"@types/parcel-bundler": { "@types/parcel-bundler": {
"version": "1.12.1", "version": "1.12.1",
@ -3049,9 +2992,9 @@
} }
}, },
"bl": { "bl": {
"version": "2.2.0", "version": "2.2.1",
"resolved": "https://verdaccio.lossless.one/bl/-/bl-2.2.0.tgz", "resolved": "https://verdaccio.lossless.one/bl/-/bl-2.2.1.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
"requires": { "requires": {
"readable-stream": "^2.3.5", "readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
@ -4388,12 +4331,6 @@
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
} }
}, },
"dedent": {
"version": "0.7.0",
"resolved": "https://verdaccio.lossless.one/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
"dev": true
},
"deep-eql": { "deep-eql": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://verdaccio.lossless.one/deep-eql/-/deep-eql-3.0.1.tgz", "resolved": "https://verdaccio.lossless.one/deep-eql/-/deep-eql-3.0.1.tgz",
@ -7736,11 +7673,11 @@
} }
}, },
"mongodb": { "mongodb": {
"version": "3.6.0", "version": "3.6.2",
"resolved": "https://verdaccio.lossless.one/mongodb/-/mongodb-3.6.0.tgz", "resolved": "https://verdaccio.lossless.one/mongodb/-/mongodb-3.6.2.tgz",
"integrity": "sha512-/XWWub1mHZVoqEsUppE0GV7u9kanLvHxho6EvBxQbShXTKYF9trhZC2NzbulRGeG7xMJHD8IOWRcdKx5LPjAjQ==", "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==",
"requires": { "requires": {
"bl": "^2.2.0", "bl": "^2.2.1",
"bson": "^1.1.4", "bson": "^1.1.4",
"denque": "^1.4.1", "denque": "^1.4.1",
"require_optional": "^1.0.1", "require_optional": "^1.0.1",
@ -7749,34 +7686,24 @@
} }
}, },
"mongodb-memory-server": { "mongodb-memory-server": {
"version": "6.6.4", "version": "6.8.0",
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server/-/mongodb-memory-server-6.6.4.tgz", "resolved": "https://verdaccio.lossless.one/mongodb-memory-server/-/mongodb-memory-server-6.8.0.tgz",
"integrity": "sha512-GCtrlUDpq6oPkdlkmIgh0Q6vJYf7njzw8AJnbg/gime2NxuUtqcOK2n+9L3qeDzt6EZxdtP/+1u/80wfjwc5mA==", "integrity": "sha512-jAJwx9yrRjB3XDFDA0DBYSHbMSvhPssDdnbEg70O2gp0qfTRtgQTaAUvTGCawj2d/iDuEJgFHJkuczHQG33a0Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"mongodb-memory-server-core": "6.6.4" "mongodb-memory-server-core": "6.8.0"
} }
}, },
"mongodb-memory-server-core": { "mongodb-memory-server-core": {
"version": "6.6.4", "version": "6.8.0",
"resolved": "https://verdaccio.lossless.one/mongodb-memory-server-core/-/mongodb-memory-server-core-6.6.4.tgz", "resolved": "https://verdaccio.lossless.one/mongodb-memory-server-core/-/mongodb-memory-server-core-6.8.0.tgz",
"integrity": "sha512-g4WMmXp2Gg305eKETaE9Nnp2eR3mTMKSTZJsxpXhsx+Mhl2IQoMLa78ny7eFPN7FORnLxQsmLMANv4b0bP+RDA==", "integrity": "sha512-cw8TX3iKhmXPiPQDcmIftHl1WvuCn970nomeQKgpcJZOYIUI87zD97apNIWfajkEduIe+24yYoqIwbwLbA19gQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/cross-spawn": "^6.0.2",
"@types/debug": "^4.1.5",
"@types/dedent": "^0.7.0",
"@types/find-cache-dir": "^3.2.0",
"@types/find-package-json": "^1.1.1",
"@types/lockfile": "^1.0.1",
"@types/md5-file": "^4.0.2",
"@types/mkdirp": "^1.0.1",
"@types/tmp": "^0.2.0", "@types/tmp": "^0.2.0",
"@types/uuid": "^8.0.0",
"camelcase": "^6.0.0", "camelcase": "^6.0.0",
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"debug": "^4.1.1", "debug": "^4.1.1",
"dedent": "^0.7.0",
"find-cache-dir": "^3.3.1", "find-cache-dir": "^3.3.1",
"find-package-json": "^1.2.0", "find-package-json": "^1.2.0",
"get-port": "^5.1.1", "get-port": "^5.1.1",
@ -7784,19 +7711,14 @@
"lockfile": "^1.0.4", "lockfile": "^1.0.4",
"md5-file": "^5.0.0", "md5-file": "^5.0.0",
"mkdirp": "^1.0.4", "mkdirp": "^1.0.4",
"mongodb": "^3.5.9", "mongodb": "3.6.2",
"tar-stream": "^2.1.3", "semver": "^7.3.2",
"tar-stream": "^2.1.4",
"tmp": "^0.2.1", "tmp": "^0.2.1",
"uuid": "^8.2.0", "uuid": "8.3.0",
"yauzl": "^2.10.0" "yauzl": "^2.10.0"
}, },
"dependencies": { "dependencies": {
"@types/uuid": {
"version": "8.3.0",
"resolved": "https://verdaccio.lossless.one/@types%2fuuid/-/uuid-8.3.0.tgz",
"integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==",
"dev": true
},
"agent-base": { "agent-base": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://verdaccio.lossless.one/agent-base/-/agent-base-6.0.1.tgz", "resolved": "https://verdaccio.lossless.one/agent-base/-/agent-base-6.0.1.tgz",
@ -7851,6 +7773,12 @@
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true "dev": true
}, },
"semver": {
"version": "7.3.2",
"resolved": "https://verdaccio.lossless.one/semver/-/semver-7.3.2.tgz",
"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
"dev": true
},
"shebang-command": { "shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://verdaccio.lossless.one/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://verdaccio.lossless.one/shebang-command/-/shebang-command-2.0.0.tgz",
@ -10506,12 +10434,12 @@
"dev": true "dev": true
}, },
"tar-stream": { "tar-stream": {
"version": "2.1.3", "version": "2.1.4",
"resolved": "https://verdaccio.lossless.one/tar-stream/-/tar-stream-2.1.3.tgz", "resolved": "https://verdaccio.lossless.one/tar-stream/-/tar-stream-2.1.4.tgz",
"integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bl": "^4.0.1", "bl": "^4.0.3",
"end-of-stream": "^1.4.1", "end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0", "fs-constants": "^1.0.0",
"inherits": "^2.0.3", "inherits": "^2.0.3",
@ -10519,9 +10447,9 @@
}, },
"dependencies": { "dependencies": {
"bl": { "bl": {
"version": "4.0.2", "version": "4.0.3",
"resolved": "https://verdaccio.lossless.one/bl/-/bl-4.0.2.tgz", "resolved": "https://verdaccio.lossless.one/bl/-/bl-4.0.3.tgz",
"integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
"dev": true, "dev": true,
"requires": { "requires": {
"buffer": "^5.5.0", "buffer": "^5.5.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartdata", "name": "@pushrocks/smartdata",
"version": "3.1.41", "version": "3.1.52",
"private": false, "private": false,
"description": "do more with data", "description": "do more with data",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
@ -22,14 +22,14 @@
"homepage": "https://gitlab.com/pushrocks/smartdata#README", "homepage": "https://gitlab.com/pushrocks/smartdata#README",
"dependencies": { "dependencies": {
"@pushrocks/lik": "^4.0.17", "@pushrocks/lik": "^4.0.17",
"@pushrocks/smartlog": "^2.0.36", "@pushrocks/smartlog": "^2.0.39",
"@pushrocks/smartpromise": "^3.0.6", "@pushrocks/smartpromise": "^3.0.6",
"@pushrocks/smartstring": "^3.0.18", "@pushrocks/smartstring": "^3.0.18",
"@tsclass/tsclass": "^3.0.24", "@tsclass/tsclass": "^3.0.25",
"@types/lodash": "^4.14.159", "@types/lodash": "^4.14.161",
"@types/mongodb": "^3.5.26", "@types/mongodb": "^3.5.27",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"mongodb": "^3.6.0", "mongodb": "^3.6.2",
"runtime-type-checks": "0.0.4" "runtime-type-checks": "0.0.4"
}, },
"devDependencies": { "devDependencies": {
@ -39,9 +39,9 @@
"@pushrocks/smartunique": "^3.0.3", "@pushrocks/smartunique": "^3.0.3",
"@pushrocks/tapbundle": "^3.2.9", "@pushrocks/tapbundle": "^3.2.9",
"@types/mongodb-memory-server": "^2.3.0", "@types/mongodb-memory-server": "^2.3.0",
"@types/node": "^14.6.0", "@types/node": "^14.11.2",
"@types/shortid": "0.0.29", "@types/shortid": "0.0.29",
"mongodb-memory-server": "^6.6.4", "mongodb-memory-server": "^6.8.0",
"tslint": "^6.1.3", "tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0" "tslint-config-prettier": "^1.18.0"
}, },

View File

@ -27,7 +27,7 @@ tap.skip.test('should create a testinstance as database', async () => {
smartdataOptions = { smartdataOptions = {
mongoDbName: await mongod.getDbName(), mongoDbName: await mongod.getDbName(),
mongoDbPass: '', mongoDbPass: '',
mongoDbUrl: await mongod.getConnectionString(), mongoDbUrl: await mongod.getUri(),
}; };
console.log(smartdataOptions); console.log(smartdataOptions);
testDb = new smartdata.SmartdataDb(smartdataOptions); testDb = new smartdata.SmartdataDb(smartdataOptions);
@ -66,6 +66,11 @@ class Car extends smartdata.SmartDataDbDoc<Car, Car> {
@smartdata.svDb() @smartdata.svDb()
public brand: string; public brand: string;
@smartdata.svDb()
deepData = {
sodeep: 'yes'
};
constructor(colorArg: string, brandArg: string) { constructor(colorArg: string, brandArg: string) {
super(); super();
this.color = colorArg; this.color = colorArg;
@ -80,15 +85,46 @@ tap.test('should save the car to the db', async () => {
const myCar2 = new Car('red', 'Volvo'); const myCar2 = new Car('red', 'Volvo');
await myCar2.save(); await myCar2.save();
let counter = 0;
const totalCars = 2000;
do {
const myCar3 = new Car('red', 'Renault'); const myCar3 = new Car('red', 'Renault');
await myCar3.save(); await myCar3.save();
counter++;
if (counter%100 === 0) {
console.log(`Filled database with ${counter} of ${totalCars} Cars`);
}
} while (counter < totalCars);
}); });
tap.test('expect to get instance of Car', async () => { tap.test('expect to get instance of Car with shallow match', async () => {
let counter = 0;
do {
const timeStart = Date.now();
const myCars = await Car.getInstances<Car>({ const myCars = await Car.getInstances<Car>({
brand: 'Volvo', brand: 'Renault',
}); });
expect(myCars[0].color).to.equal('red'); console.log(`took ${Date.now() - timeStart}ms to query a set of 2000`);
expect(myCars[0].deepData.sodeep).to.equal('yes');
expect(myCars[0].brand).to.equal('Renault');
counter++;
} while (counter < 30);
});
tap.test('expect to get instance of Car with deep match', async () => {
let counter = 0;
do {
const timeStart = Date.now();
const myCars2 = await Car.getInstances<Car>({
'deepData.sodeep': 'yes',
} as any);
console.log(`took ${Date.now() - timeStart}ms to query a set of 2000`);
expect(myCars2[0].deepData.sodeep).to.equal('yes');
expect(myCars2[0].brand).to.equal('Volvo');
counter++;
} while (counter < 30);
}); });
tap.test('expect to get instance of Car and update it', async () => { tap.test('expect to get instance of Car and update it', async () => {
@ -101,11 +137,15 @@ tap.test('expect to get instance of Car and update it', async () => {
}); });
tap.test('should be able to delete an instance of car', async () => { tap.test('should be able to delete an instance of car', async () => {
const myCar = await Car.getInstance<Car>({ const myCars = await Car.getInstances<Car>({
brand: 'Volvo', brand: 'Volvo',
color: 'blue'
}); });
expect(myCar.color).to.equal('blue'); console.log(myCars);
expect(myCars[0].color).to.equal('blue');
for (const myCar of myCars) {
await myCar.delete(); await myCar.delete();
}
const myCar2 = await Car.getInstance<Car>({ const myCar2 = await Car.getInstance<Car>({
brand: 'Volvo', brand: 'Volvo',

View File

@ -1,6 +1,7 @@
import * as plugins from './smartdata.plugins'; import * as plugins from './smartdata.plugins';
import { SmartdataDb } from './smartdata.classes.db'; import { SmartdataDb } from './smartdata.classes.db';
import { SmartDataDbDoc } from './smartdata.classes.doc'; import { SmartDataDbDoc } from './smartdata.classes.doc';
import { CollectionFactory } from './smartdata.classes.collectionfactory';
export interface IFindOptions { export interface IFindOptions {
limit?: number; limit?: number;
@ -15,23 +16,26 @@ export interface IDocValidationFunc<T> {
export type TDelayedDbCreation = () => SmartdataDb; export type TDelayedDbCreation = () => SmartdataDb;
const collectionFactory = new CollectionFactory();
/** /**
* This is a decorator that will tell the decorated class what dbTable to use * This is a decorator that will tell the decorated class what dbTable to use
* @param dbArg * @param dbArg
*/ */
export function Collection(dbArg: SmartdataDb | TDelayedDbCreation) { export function Collection(dbArg: SmartdataDb | TDelayedDbCreation) {
return function (constructor) { return function classDecorator<T extends { new (...args: any[]): {} }>(constructor: T) {
if (dbArg instanceof SmartdataDb) { return class extends constructor {
// tslint:disable-next-line: no-string-literal public static get collection() {
constructor['smartdataCollection'] = new SmartdataCollection(constructor, dbArg); return collectionFactory.getCollection(constructor.name, dbArg);
} else {
constructor['smartdataDelayedCollection'] = () => {
return new SmartdataCollection(constructor, dbArg());
};
} }
public get collection() {
return collectionFactory.getCollection(constructor.name, dbArg);
}
};
}; };
} }
// tslint:disable-next-line: max-classes-per-file
export class SmartdataCollection<T> { export class SmartdataCollection<T> {
/** /**
* the collection that is used * the collection that is used
@ -42,13 +46,13 @@ export class SmartdataCollection<T> {
public smartdataDb: SmartdataDb; public smartdataDb: SmartdataDb;
public uniqueIndexes: string[] = []; public uniqueIndexes: string[] = [];
constructor(collectedClassArg: T & SmartDataDbDoc<T, unknown>, smartDataDbArg: SmartdataDb) { constructor(classNameArg: string, smartDataDbArg: SmartdataDb) {
// tell the collection where it belongs // tell the collection where it belongs
this.collectionName = collectedClassArg.name; this.collectionName = classNameArg;
this.smartdataDb = smartDataDbArg; this.smartdataDb = smartDataDbArg;
// tell the db class about it (important since Db uses different systems under the hood) // tell the db class about it (important since Db uses different systems under the hood)
this.smartdataDb.addTable(this); this.smartdataDb.addCollection(this);
} }
/** /**
@ -63,9 +67,9 @@ export class SmartdataCollection<T> {
}); });
if (!wantedCollection) { if (!wantedCollection) {
await this.smartdataDb.mongoDb.createCollection(this.collectionName); await this.smartdataDb.mongoDb.createCollection(this.collectionName);
console.log(`Successfully initiated Collection ${this.collectionName}`);
} }
this.mongoDbCollection = await this.smartdataDb.mongoDb.collection(this.collectionName); this.mongoDbCollection = this.smartdataDb.mongoDb.collection(this.collectionName);
// console.log(`Successfully initiated Collection ${this.collectionName}`);
} }
} }
@ -127,11 +131,12 @@ export class SmartdataCollection<T> {
} }
updateableObject[key] = saveableObject[key]; updateableObject[key] = saveableObject[key];
} }
this.mongoDbCollection.updateOne( const result = await this.mongoDbCollection.updateOne(
identifiableObject, identifiableObject,
{ $set: updateableObject }, { $set: updateableObject },
{ upsert: true } { upsert: true }
); );
return result;
} }
public async delete(dbDocArg: T & SmartDataDbDoc<T, unknown>): Promise<any> { public async delete(dbDocArg: T & SmartDataDbDoc<T, unknown>): Promise<any> {

View File

@ -0,0 +1,22 @@
import * as plugins from './smartdata.plugins';
import { SmartdataCollection } from './smartdata.classes.collection';
import { SmartdataDb } from './smartdata.classes.db';
export class CollectionFactory {
public collections: {[key: string]: SmartdataCollection<any>} = {};
public getCollection = (nameArg: string, dbArg: SmartdataDb | (() => SmartdataDb)): SmartdataCollection<any> => {
if (!this.collections[nameArg]) {
this.collections[nameArg] = (() => {
if (dbArg instanceof SmartdataDb) {
// tslint:disable-next-line: no-string-literal
return new SmartdataCollection(nameArg, dbArg);
} else {
dbArg = dbArg();
return new SmartdataCollection(nameArg, dbArg);
}
})();
}
return this.collections[nameArg];
}
}

View File

@ -32,6 +32,8 @@ export class SmartdataDb {
const finalConnectionUrl = this.smartdataOptions.mongoDbUrl const finalConnectionUrl = this.smartdataOptions.mongoDbUrl
.replace('<USERNAME>', this.smartdataOptions.mongoDbUser) .replace('<USERNAME>', this.smartdataOptions.mongoDbUser)
.replace('<username>', this.smartdataOptions.mongoDbUser) .replace('<username>', this.smartdataOptions.mongoDbUser)
.replace('<USER>', this.smartdataOptions.mongoDbUser)
.replace('<user>', this.smartdataOptions.mongoDbUser)
.replace('<PASSWORD>', this.smartdataOptions.mongoDbPass) .replace('<PASSWORD>', this.smartdataOptions.mongoDbPass)
.replace('<password>', this.smartdataOptions.mongoDbPass) .replace('<password>', this.smartdataOptions.mongoDbPass)
.replace('<DBNAME>', this.smartdataOptions.mongoDbName) .replace('<DBNAME>', this.smartdataOptions.mongoDbName)
@ -40,6 +42,8 @@ export class SmartdataDb {
this.mongoDbClient = await plugins.mongodb.MongoClient.connect(finalConnectionUrl, { this.mongoDbClient = await plugins.mongodb.MongoClient.connect(finalConnectionUrl, {
useNewUrlParser: true, useNewUrlParser: true,
useUnifiedTopology: true, useUnifiedTopology: true,
maxPoolSize: 100,
maxIdleTimeMS: 10
}); });
this.mongoDb = this.mongoDbClient.db(this.smartdataOptions.mongoDbName); this.mongoDb = this.mongoDbClient.db(this.smartdataOptions.mongoDbName);
this.status = 'connected'; this.status = 'connected';
@ -57,7 +61,7 @@ export class SmartdataDb {
// handle table to class distribution // handle table to class distribution
public addTable(SmartdataCollectionArg: SmartdataCollection<any>) { public addCollection(SmartdataCollectionArg: SmartdataCollection<any>) {
this.smartdataCollectionMap.add(SmartdataCollectionArg); this.smartdataCollectionMap.add(SmartdataCollectionArg);
} }

View File

@ -12,7 +12,7 @@ export type TDocCreation = 'db' | 'new' | 'mixed';
*/ */
export function svDb() { export function svDb() {
return (target: SmartDataDbDoc<unknown, unknown>, key: string) => { return (target: SmartDataDbDoc<unknown, unknown>, key: string) => {
console.log(`called svDb() on ${key}`); console.log(`called svDb() on >${target.constructor.name}.${key}<`);
if (!target.saveableProperties) { if (!target.saveableProperties) {
target.saveableProperties = []; target.saveableProperties = [];
} }
@ -25,7 +25,7 @@ export function svDb() {
*/ */
export function unI() { export function unI() {
return (target: SmartDataDbDoc<unknown, unknown>, key: string) => { return (target: SmartDataDbDoc<unknown, unknown>, key: string) => {
console.log('called unI'); console.log(`called unI on >>${target.constructor.name}.${key}<<`);
// mark the index as unique // mark the index as unique
if (!target.uniqueIndexes) { if (!target.uniqueIndexes) {
@ -45,7 +45,8 @@ export class SmartDataDbDoc<T, TImplements> {
/** /**
* the collection object an Doc belongs to * the collection object an Doc belongs to
*/ */
public collection: SmartdataCollection<T>; public static collection: SmartdataCollection<any>;
public collection: SmartdataCollection<any>;
/** /**
* how the Doc in memory was created, may prove useful later. * how the Doc in memory was created, may prove useful later.
@ -75,32 +76,12 @@ export class SmartDataDbDoc<T, TImplements> {
/** /**
* class constructor * class constructor
*/ */
constructor() { constructor() {}
this.name = this.constructor['name'];
if (this.constructor['smartdataCollection']) {
// tslint:disable-next-line: no-string-literal
this.collection = this.constructor['smartdataCollection'];
// tslint:disable-next-line: no-string-literal
} else if (typeof this.constructor['smartdataDelayedCollection'] === 'function') {
// tslint:disable-next-line: no-string-literal
this.collection = this.constructor['smartdataDelayedCollection']();
} else {
console.error('Could not determine collection for DbDoc');
}
}
public static async getInstances<T>( public static async getInstances<T>(
filterArg: plugins.tsclass.typeFest.PartialDeep<T> filterArg: plugins.tsclass.typeFest.PartialDeep<T>
): Promise<T[]> { ): Promise<T[]> {
const self: any = this; // fool typesystem const foundDocs = await this.collection.find(filterArg);
let referenceMongoDBCollection: SmartdataCollection<T>;
if (self.smartdataCollection) {
referenceMongoDBCollection = self.smartdataCollection;
} else if (self.smartdataDelayedCollection) {
referenceMongoDBCollection = self.smartdataDelayedCollection();
}
const foundDocs = await referenceMongoDBCollection.find(filterArg);
const returnArray = []; const returnArray = [];
for (const item of foundDocs) { for (const item of foundDocs) {
const newInstance = new this(); const newInstance = new this();
@ -129,25 +110,26 @@ export class SmartDataDbDoc<T, TImplements> {
public async save() { public async save() {
// tslint:disable-next-line: no-this-assignment // tslint:disable-next-line: no-this-assignment
const self: any = this; const self: any = this;
let dbResult: any;
switch (this.creationStatus) { switch (this.creationStatus) {
case 'db': case 'db':
await this.collection.update(self); dbResult = await this.collection.update(self);
break; break;
case 'new': case 'new':
const writeResult = await this.collection.insert(self); dbResult = await this.collection.insert(self);
this.creationStatus = 'db'; this.creationStatus = 'db';
break; break;
default: default:
console.error('neither new nor in db?'); console.error('neither new nor in db?');
} }
return dbResult;
} }
/** /**
* deletes a document from the database * deletes a document from the database
*/ */
public async delete() { public async delete() {
const self: any = this; await this.collection.delete(this);
await this.collection.delete(self);
} }
/** /**