diff --git a/lib/cache.ts b/lib/cache.ts index ad2b07c..feb0254 100644 --- a/lib/cache.ts +++ b/lib/cache.ts @@ -78,9 +78,9 @@ export async function acquireLock( value: token, expire: new Date(now + ttl + CLOCK_SKEW_TOLERANCE), }, - $currentDate: { timestamp: true }, + $currentDate: { timestamp: (true as unknown) as Date }, }, - { upsert: true, returnOriginal: false } + { upsert: true, returnDocument: "after" } ); const v = r.value; if (Math.abs(v["timestamp"].getTime() - now) > CLOCK_SKEW_TOLERANCE) @@ -114,5 +114,5 @@ export async function releaseLock( _id: lockName, value: token, }); - if (res["result"]["n"] !== 1) throw new Error("Lock expired"); + if (res.deletedCount !== 1) throw new Error("Lock expired"); } diff --git a/lib/db.ts b/lib/db.ts index acd52dd..71ece72 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -17,7 +17,7 @@ * along with GenieACS. If not, see . */ -import { MongoClient, ObjectID, Collection, Db } from "mongodb"; +import { MongoClient, ObjectId, Collection, Db } from "mongodb"; import { get } from "./config"; import { decodeTag, encodeTag, escapeRegExp } from "./common"; import { parse } from "./common/expression-parser"; @@ -61,10 +61,7 @@ export function onConnect(callback: (db: Db) => Promise): void { } export async function connect(): Promise { - clientPromise = MongoClient.connect("" + get("MONGODB_CONNECTION_URL"), { - useNewUrlParser: true, - useUnifiedTopology: true, - }); + clientPromise = MongoClient.connect("" + get("MONGODB_CONNECTION_URL")); const client = await clientPromise; const db = client.db(); @@ -623,7 +620,7 @@ export async function saveDevice( upsert: isNew, }); - if (result.result.n !== 1) + if (!result.matchedCount && !result.upsertedCount) throw new Error(`Device ${deviceId} not found in database`); if (update2) { @@ -647,7 +644,7 @@ export async function getFaults( delete r.device; r.timestamp = +r.timestamp; r.provisions = JSON.parse(r.provisions); - faults[channel] = r; + faults[channel] = r as SessionFault; } return faults; @@ -688,13 +685,13 @@ export async function getDueTasks( if (task.timestamp >= timestamp) return [tasks, +task.timestamp]; task._id = String(task._id); - tasks.push(task); + tasks.push(task as Task); // For API compatibility if (task.name === "download" && task.file) { let q; - if (ObjectID.isValid(task.file)) - q = { _id: { $in: [task.file, new ObjectID(task.file)] } }; + if (ObjectId.isValid(task.file)) + q = { _id: { $in: [task.file, new ObjectId(task.file)] } }; else q = { _id: task.file }; const res = await filesCollection.find(q).toArray(); @@ -715,7 +712,7 @@ export async function clearTasks( taskIds: string[] ): Promise { await tasksCollection.deleteMany({ - _id: { $in: taskIds.map((id) => new ObjectID(id)) }, + _id: { $in: taskIds.map((id) => new ObjectId(id)) }, }); } @@ -732,14 +729,14 @@ export async function getOperations( delete r._id; // Workaround for a bug in v1.2.1 where operation object is saved without deserialization if (typeof r.provisions !== "string") { - operations[commandKey] = r; + operations[commandKey] = r as Operation; continue; } r.timestamp = +r.timestamp; if (r.args) r.args = JSON.parse(r.args); r.provisions = JSON.parse(r.provisions); r.retries = JSON.parse(r.retries); - operations[commandKey] = r; + operations[commandKey] = r as Operation; } return operations; } @@ -807,7 +804,7 @@ interface Permission { } export async function getPermissions(): Promise { - return permissionsCollection.find().toArray(); + return (permissionsCollection.find().toArray() as unknown) as Permission[]; } interface User { @@ -818,5 +815,5 @@ interface User { } export async function getUsers(): Promise { - return usersCollection.find().toArray(); + return (usersCollection.find().toArray() as unknown) as User[]; } diff --git a/lib/fs.ts b/lib/fs.ts index 7c41797..22a6f66 100644 --- a/lib/fs.ts +++ b/lib/fs.ts @@ -35,7 +35,7 @@ onConnect(async (db) => { }); const getFile = memoize( - (md5: string, size: number, filename: string): Promise => { + (uploadDate: number, size: number, filename: string): Promise => { return new Promise((resolve, reject) => { const buffer = Buffer.allocUnsafe(size); let i = 0; @@ -82,10 +82,14 @@ export async function listener( return; } - const buffer = await getFile(file.md5, file.length, filename); + const buffer = await getFile( + file["uploadDate"].getTime(), + file.length, + filename + ); response.writeHead(200, { - "Content-Type": file.contentType || "application/octet-stream", + "Content-Type": "application/octet-stream", "Content-Length": file.length, }); diff --git a/lib/local-cache.ts b/lib/local-cache.ts index e5207e0..66b1612 100644 --- a/lib/local-cache.ts +++ b/lib/local-cache.ts @@ -325,8 +325,6 @@ async function fetchFiles(): Promise { const id = r["filename"] || r["_id"].toString(); files[id] = {}; files[id].length = r["length"]; - files[id].md5 = r["md5"]; - files[id].contentType = r["contentType"]; } return files; diff --git a/lib/mongodb-functions.ts b/lib/mongodb-functions.ts index f933ac0..fe2920f 100644 --- a/lib/mongodb-functions.ts +++ b/lib/mongodb-functions.ts @@ -17,7 +17,7 @@ * along with GenieACS. If not, see . */ -import { ObjectID } from "mongodb"; +import { ObjectId } from "mongodb"; import { map, parse, stringify, parseList } from "./common/expression-parser"; import { likePatternToRegExp } from "./common/expression"; import { Expression, Fault, Task } from "./types"; @@ -90,7 +90,7 @@ export function processTasksFilter(filter: Expression): Expression { if (!isArray(exp)) return exp; if (["=", "<>", ">", ">=", "<", "<="].includes(exp[0])) { const e = exp.slice(); - if (e[1][0] === "PARAM" && e[1][1] === "_id") e[2] = new ObjectID(e[2]); + if (e[1][0] === "PARAM" && e[1][1] === "_id") e[2] = new ObjectId(e[2]); else if (e[1][0] === "PARAM" && e[1][1] === "timestamp") e[2] = new Date(e[2]); else if (e[1][0] === "PARAM" && e[1][1] === "expiry") diff --git a/lib/nbi.ts b/lib/nbi.ts index a03edfd..1c8e0c0 100644 --- a/lib/nbi.ts +++ b/lib/nbi.ts @@ -45,7 +45,7 @@ const PROVISIONS_REGEX = /^\/provisions\/([a-zA-Z0-9\-_%]+)\/?$/; const VIRTUAL_PARAMETERS_REGEX = /^\/virtual_parameters\/([a-zA-Z0-9\-_%]+)\/?$/; const FAULTS_REGEX = /^\/faults\/([a-zA-Z0-9\-_%:]+)\/?$/; -const collections = { +const collections: Record = { tasks: null as Collection, devices: null as Collection, presets: null as Collection, @@ -662,7 +662,7 @@ export function listener( }; filesBucket.delete((filename as unknown) as ObjectId, () => { const uploadStream = filesBucket.openUploadStreamWithId( - filename, + (filename as unknown) as ObjectId, filename, { metadata: metadata, @@ -813,13 +813,7 @@ export function listener( cur.sort(sort); } - if (urlParts.query.skip) - cur.skip(parseInt(urlParts.query.skip as string)); - - if (urlParts.query.limit) - cur.limit(parseInt(urlParts.query.limit as string)); - - cur.count(false, (err, total) => { + cur.count((err, total) => { if (err) return void throwError(err); response.writeHead(200, { @@ -832,6 +826,12 @@ export function listener( return; } + if (urlParts.query.skip) + cur.skip(parseInt(urlParts.query.skip as string)); + + if (urlParts.query.limit) + cur.limit(parseInt(urlParts.query.limit as string)); + response.write("[\n"); i = 0; cur.forEach( diff --git a/lib/types.ts b/lib/types.ts index 0defd88..1f41836 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -477,7 +477,7 @@ export interface VirtualParameters { } export interface Files { - [name: string]: { length: number; md5: string; contentType: string }; + [name: string]: { length: number }; } export interface Users { diff --git a/lib/ui/api-functions.ts b/lib/ui/api-functions.ts index b382a45..40823dd 100644 --- a/lib/ui/api-functions.ts +++ b/lib/ui/api-functions.ts @@ -17,7 +17,7 @@ * along with GenieACS. If not, see . */ -import { ObjectID } from "mongodb"; +import { ObjectId } from "mongodb"; import * as db from "./db"; import { del } from "../cache"; import { getUsers } from "../local-cache"; @@ -38,7 +38,7 @@ async function deleteFault(id): Promise { await Promise.all([ db.deleteFault(id), channel.startsWith("task_") - ? db.deleteTask(new ObjectID(channel.slice(5))) + ? db.deleteTask(new ObjectId(channel.slice(5))) : null, ]); @@ -108,7 +108,7 @@ export async function postTasks( const lastInform = Date.now(); const notInSession = await awaitSessionEnd(deviceId, 30000); if (!notInSession) { - await Promise.all(statuses.map((t) => db.deleteTask(new ObjectID(t._id)))); + await Promise.all(statuses.map((t) => db.deleteTask(new ObjectId(t._id)))); return { connectionRequest: "Session took too long to complete", tasks: statuses, @@ -120,7 +120,7 @@ export async function postTasks( const status = await connectionRequest(deviceId, device); if (status) { - await Promise.all(statuses.map((t) => db.deleteTask(new ObjectID(t._id)))); + await Promise.all(statuses.map((t) => db.deleteTask(new ObjectId(t._id)))); return { connectionRequest: status, tasks: statuses, @@ -129,7 +129,7 @@ export async function postTasks( const sessionStarted = await awaitSessionStart(deviceId, lastInform, timeout); if (!sessionStarted) { - await Promise.all(statuses.map((t) => db.deleteTask(new ObjectID(t._id)))); + await Promise.all(statuses.map((t) => db.deleteTask(new ObjectId(t._id)))); return { connectionRequest: "No contact from CPE", tasks: statuses, @@ -138,7 +138,7 @@ export async function postTasks( const sessionEnded = await awaitSessionEnd(deviceId, 120000); if (!sessionEnded) { - await Promise.all(statuses.map((t) => db.deleteTask(new ObjectID(t._id)))); + await Promise.all(statuses.map((t) => db.deleteTask(new ObjectId(t._id)))); return { connectionRequest: "Session took too long to complete", tasks: statuses, @@ -163,7 +163,7 @@ export async function postTasks( } } - await Promise.all(statuses.map((t) => db.deleteTask(new ObjectID(t._id)))); + await Promise.all(statuses.map((t) => db.deleteTask(new ObjectId(t._id)))); return { connectionRequest: "OK", tasks: statuses }; } diff --git a/lib/ui/db.ts b/lib/ui/db.ts index 50fb934..8167441 100644 --- a/lib/ui/db.ts +++ b/lib/ui/db.ts @@ -17,13 +17,13 @@ * along with GenieACS. If not, see . */ -import { Db, GridFSBucket, ObjectID } from "mongodb"; +import { Db, GridFSBucket, ObjectId } from "mongodb"; import { Script } from "vm"; import { onConnect } from "../db"; import * as mongodbFunctions from "../mongodb-functions"; import * as expression from "../common/expression"; import { QueryOptions, Expression } from "../types"; -import { Readable } from "stream"; +import { Readable, Writable } from "stream"; import { minimize } from "../common/boolean-expression"; const RESOURCE_COLLECTION = { @@ -208,7 +208,7 @@ function putResource(resource, id, object): Promise { function deleteResource( resource: string, - id: string | ObjectID + id: string | ObjectId ): Promise { return new Promise((resolve, reject) => { const collection = db.collection(RESOURCE_COLLECTION[resource] || resource); @@ -338,13 +338,17 @@ export function putFile( ): Promise { return new Promise((resolve, reject) => { const bucket = new GridFSBucket(db); - const uploadStream = bucket.openUploadStreamWithId(filename, filename, { - metadata: metadata, - }); + const uploadStream = bucket.openUploadStreamWithId( + (filename as unknown) as ObjectId, + filename, + { + metadata: metadata, + } + ); uploadStream.on("error", reject); contentStream.on("error", reject); uploadStream.on("finish", resolve); - contentStream.pipe(uploadStream); + contentStream.pipe(uploadStream as Writable); }); } @@ -362,6 +366,6 @@ export function deleteFault(id: string): Promise { return deleteResource("faults", id); } -export function deleteTask(id: ObjectID): Promise { +export function deleteTask(id: ObjectId): Promise { return deleteResource("tasks", id); } diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9948681..971a8c8 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -315,15 +315,6 @@ "@types/node": "*" } }, - "@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/codemirror": { "version": "0.0.108", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", @@ -497,21 +488,10 @@ "integrity": "sha512-QzVV70DqUhWfLFpMFDBI9rRxtzeUUpbhiFDpUJYSV92AePgl+Qfficgv2MOb1Ceb+lBOQU8+L+Hjf2UielQjEw==", "dev": true }, - "@types/mongodb": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.9.tgz", - "integrity": "sha512-2XSGr/+IOKeFQ5tU9ATcIiIr7bpHqWyOXNGLOOhp0kg2NnfEvoKZF1SZ25j4zvJRqM2WeSUjfWSvymFJ3HBGJQ==", - "dev": true, - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, "@types/node": { "version": "14.14.34", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", - "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==", - "dev": true + "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -577,6 +557,20 @@ "@types/estree": "*" } }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.17.0.tgz", @@ -1091,8 +1085,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "binary-extensions": { "version": "2.2.0", @@ -1100,15 +1093,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "blueimp-md5": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", @@ -1178,15 +1162,17 @@ } }, "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz", + "integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==", + "requires": { + "buffer": "^5.6.0" + } }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1726,11 +1712,6 @@ "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -3477,8 +3458,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.1.8", @@ -3835,11 +3815,6 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4186,8 +4161,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -4470,18 +4444,25 @@ } }, "mongodb": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", - "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.0.tgz", + "integrity": "sha512-Gx9U9MsFWgJ3E0v4oHAdWvYTGBznNYPCkhmD/3i/kPTY/URnPfHD5/6VoKUFrdgQTK3icFiM9976hVbqCRBO9Q==", "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", + "bson": "^4.4.0", + "denque": "^1.5.0", + "mongodb-connection-string-url": "^1.0.1", "saslprep": "^1.0.0" } }, + "mongodb-connection-string-url": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.1.2.tgz", + "integrity": "sha512-mp5lv4guWuykOpkwNNqQ0tKKytuJUjL/aC/bu/DqoJVWL5NSh4j/u+gJ+EiOdweLujHyq6JZZqcTVipHhL5xRg==", + "requires": { + "@types/whatwg-url": "^8.0.0", + "whatwg-url": "^8.4.0" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10065,11 +10046,6 @@ "parse-ms": "^2.1.0" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -10089,8 +10065,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { "version": "2.1.1", @@ -10234,27 +10209,6 @@ } } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -10300,15 +10254,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -10336,11 +10281,6 @@ } } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, "resolve-path": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", @@ -10735,6 +10675,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -10742,7 +10683,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true } } }, @@ -11095,6 +11037,14 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, "trim-off-newlines": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", @@ -11271,7 +11221,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "util.promisify": { "version": "1.0.1", @@ -11321,12 +11272,27 @@ "defaults": "^1.0.3" } }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, "well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", "dev": true }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 30a6d49..77fcc64 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "koa-router": "^10.0.0", "koa-static": "^5.0.0", "later": "^1.2.0", - "mongodb": "^3.6.3", + "mongodb": "^4.1.0", "parsimmon": "^1.16.0", "seedrandom": "^3.0.5" }, @@ -46,7 +46,6 @@ "@types/koa-router": "^7.4.1", "@types/koa-static": "^4.0.1", "@types/mithril": "^2.0.8", - "@types/mongodb": "^3.6.9", "@types/node": "^14.14.34", "@types/parsimmon": "^1.10.6", "@types/seedrandom": "^3.0.0", diff --git a/test/mongodb-functions.ts b/test/mongodb-functions.ts index e636d9c..8a59887 100644 --- a/test/mongodb-functions.ts +++ b/test/mongodb-functions.ts @@ -49,8 +49,16 @@ ava("convertOldPrecondition", (t) => { ]; t.plan(tests.length + 2 * shouldFailTests.length); - for (const test of tests) - t.is(stringify(mongodbFunctions.convertOldPrecondition(test[0])), test[1]); + for (const test of tests) { + t.is( + stringify( + mongodbFunctions.convertOldPrecondition( + test[0] as Record + ) + ), + test[1] + ); + } for (const test of shouldFailTests) { const func = (): void => {