From 28d72b128e3cfd702cb2c6d7a8a11d32d6f9f858 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 1 Apr 2023 10:42:20 +0100 Subject: [PATCH 01/95] Install nodemailer, update NPM packages, update mail template Signed-off-by: Fred Boniface --- package-lock.json | 2677 ++++++------------------------ package.json | 1 + src/mail-templates/register.html | 7 + src/services/mail.services.js | 2 +- 4 files changed, 516 insertions(+), 2171 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86daaf9..a3e7dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "owlboard", "version": "0.0.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -14,6 +14,7 @@ "express": "^4.18.2", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", + "nodemailer": "^6.9.1", "string-sanitizer-fix": "^2.0.1" } }, @@ -104,507 +105,502 @@ "optional": true }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", - "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.303.0.tgz", + "integrity": "sha512-LzNzpeyTppcmV/6SAQI3T/huOkMrUnFveplgVNwJxw+rVqmqmGV6z6vpg+oRICRDcjXWYiSiaClxxSVvOy0sDQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", - "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.303.0.tgz", + "integrity": "sha512-rybplTjq6aj7DttT+v8ycajT8BIFXqdo66lkQjO1YykEIyVTnY4L9McTyNFOZsvNmG1LMSqb95/eYP463Lp7fg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sts": "3.303.0", + "@aws-sdk/config-resolver": "3.303.0", + "@aws-sdk/credential-provider-node": "3.303.0", + "@aws-sdk/fetch-http-handler": "3.303.0", + "@aws-sdk/hash-node": "3.303.0", + "@aws-sdk/invalid-dependency": "3.303.0", + "@aws-sdk/middleware-content-length": "3.303.0", + "@aws-sdk/middleware-endpoint": "3.303.0", + "@aws-sdk/middleware-host-header": "3.303.0", + "@aws-sdk/middleware-logger": "3.303.0", + "@aws-sdk/middleware-recursion-detection": "3.303.0", + "@aws-sdk/middleware-retry": "3.303.0", + "@aws-sdk/middleware-serde": "3.303.0", + "@aws-sdk/middleware-signing": "3.303.0", + "@aws-sdk/middleware-stack": "3.303.0", + "@aws-sdk/middleware-user-agent": "3.303.0", + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/node-http-handler": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/smithy-client": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/util-base64": "3.303.0", + "@aws-sdk/util-body-length-browser": "3.303.0", + "@aws-sdk/util-body-length-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.303.0", + "@aws-sdk/util-defaults-mode-node": "3.303.0", + "@aws-sdk/util-endpoints": "3.303.0", + "@aws-sdk/util-retry": "3.303.0", + "@aws-sdk/util-user-agent-browser": "3.303.0", + "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", - "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.303.0.tgz", + "integrity": "sha512-LZ+Z6vGnEdqmxx0dqtZP97n5VX5uUKu4lJmDR3sdGolxAUqCY1FxHDZd9DzCFXR8rwoJK4VJTL+exzeVp4Ly/g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.303.0", + "@aws-sdk/fetch-http-handler": "3.303.0", + "@aws-sdk/hash-node": "3.303.0", + "@aws-sdk/invalid-dependency": "3.303.0", + "@aws-sdk/middleware-content-length": "3.303.0", + "@aws-sdk/middleware-endpoint": "3.303.0", + "@aws-sdk/middleware-host-header": "3.303.0", + "@aws-sdk/middleware-logger": "3.303.0", + "@aws-sdk/middleware-recursion-detection": "3.303.0", + "@aws-sdk/middleware-retry": "3.303.0", + "@aws-sdk/middleware-serde": "3.303.0", + "@aws-sdk/middleware-stack": "3.303.0", + "@aws-sdk/middleware-user-agent": "3.303.0", + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/node-http-handler": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/smithy-client": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/util-base64": "3.303.0", + "@aws-sdk/util-body-length-browser": "3.303.0", + "@aws-sdk/util-body-length-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.303.0", + "@aws-sdk/util-defaults-mode-node": "3.303.0", + "@aws-sdk/util-endpoints": "3.303.0", + "@aws-sdk/util-retry": "3.303.0", + "@aws-sdk/util-user-agent-browser": "3.303.0", + "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", - "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.303.0.tgz", + "integrity": "sha512-oOdDcBjxGiJ6mFWUMVr+A1hAzGRpcZ+oLAhCakpvpXCUG50PZSBFP+vOQXgHY/XNolqDg+IHq60oE9HoPzGleg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.303.0", + "@aws-sdk/fetch-http-handler": "3.303.0", + "@aws-sdk/hash-node": "3.303.0", + "@aws-sdk/invalid-dependency": "3.303.0", + "@aws-sdk/middleware-content-length": "3.303.0", + "@aws-sdk/middleware-endpoint": "3.303.0", + "@aws-sdk/middleware-host-header": "3.303.0", + "@aws-sdk/middleware-logger": "3.303.0", + "@aws-sdk/middleware-recursion-detection": "3.303.0", + "@aws-sdk/middleware-retry": "3.303.0", + "@aws-sdk/middleware-serde": "3.303.0", + "@aws-sdk/middleware-stack": "3.303.0", + "@aws-sdk/middleware-user-agent": "3.303.0", + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/node-http-handler": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/smithy-client": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/util-base64": "3.303.0", + "@aws-sdk/util-body-length-browser": "3.303.0", + "@aws-sdk/util-body-length-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.303.0", + "@aws-sdk/util-defaults-mode-node": "3.303.0", + "@aws-sdk/util-endpoints": "3.303.0", + "@aws-sdk/util-retry": "3.303.0", + "@aws-sdk/util-user-agent-browser": "3.303.0", + "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", - "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.303.0.tgz", + "integrity": "sha512-oda7mOfGyJZe62DZ5BVH3L84yeDM0Ja/fSpTjwV9hqFqzgtW83TCpiNegcJmvmGWDYaPmE2qpfDPqPzymB0sBg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-sdk-sts": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.303.0", + "@aws-sdk/credential-provider-node": "3.303.0", + "@aws-sdk/fetch-http-handler": "3.303.0", + "@aws-sdk/hash-node": "3.303.0", + "@aws-sdk/invalid-dependency": "3.303.0", + "@aws-sdk/middleware-content-length": "3.303.0", + "@aws-sdk/middleware-endpoint": "3.303.0", + "@aws-sdk/middleware-host-header": "3.303.0", + "@aws-sdk/middleware-logger": "3.303.0", + "@aws-sdk/middleware-recursion-detection": "3.303.0", + "@aws-sdk/middleware-retry": "3.303.0", + "@aws-sdk/middleware-sdk-sts": "3.303.0", + "@aws-sdk/middleware-serde": "3.303.0", + "@aws-sdk/middleware-signing": "3.303.0", + "@aws-sdk/middleware-stack": "3.303.0", + "@aws-sdk/middleware-user-agent": "3.303.0", + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/node-http-handler": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/smithy-client": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/util-base64": "3.303.0", + "@aws-sdk/util-body-length-browser": "3.303.0", + "@aws-sdk/util-body-length-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.303.0", + "@aws-sdk/util-defaults-mode-node": "3.303.0", + "@aws-sdk/util-endpoints": "3.303.0", + "@aws-sdk/util-retry": "3.303.0", + "@aws-sdk/util-user-agent-browser": "3.303.0", + "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", - "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.303.0.tgz", + "integrity": "sha512-uGZ47jcH86AwWcjZjuOL5jK5qE4izrEol8oF7KY214kjmavbKQstyUqmcwL2lr/YpDNFkCYgUxWRpduqVm8zmw==", "optional": true, "dependencies": { - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-config-provider": "3.295.0", + "@aws-sdk/util-middleware": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", - "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.303.0.tgz", + "integrity": "sha512-9MYsGJCNLsm61PW/JFm4y0Cv6aluCkZmE5D/g4vYnEFOZSKyK15m1a10RKGAh391fh6Bg1kU9WOoqkGk3Nyqng==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-cognito-identity": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", - "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.303.0.tgz", + "integrity": "sha512-rtXumfF4cGrVk9fWACeLCfdpmlzlDUkzwSR60/3enC5Antcxl3fFY5T1BzNFvz0mB0zcwm4kaAwIcljX67DNRA==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", - "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.303.0.tgz", + "integrity": "sha512-ruomcFkKUpJkZb87em698//A0AVpt1KN9dn8N8eVyOuvZzebVxSW4AJoVgOKd5Av4PVcZgEqRX0kOOVp0iTrWg==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", - "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.303.0.tgz", + "integrity": "sha512-4J50F6fEjQmAstSQOpJFG+rnbEqtwA7nDG6PxNm98VSTH2mYJV0YgBdvydfBKrKINAT4xYZta5Sc4WEIpSo0TA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.303.0", + "@aws-sdk/credential-provider-imds": "3.303.0", + "@aws-sdk/credential-provider-process": "3.303.0", + "@aws-sdk/credential-provider-sso": "3.303.0", + "@aws-sdk/credential-provider-web-identity": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", - "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.303.0.tgz", + "integrity": "sha512-OlKb7O2jDtrzkzLT/PUb5kxuGGTIyPn2alXzGT+7LdJ9/tP8KlqSVMtnH2UYPPdcc/daK16+MRNL5ylxmnRJ7Q==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.303.0", + "@aws-sdk/credential-provider-imds": "3.303.0", + "@aws-sdk/credential-provider-ini": "3.303.0", + "@aws-sdk/credential-provider-process": "3.303.0", + "@aws-sdk/credential-provider-sso": "3.303.0", + "@aws-sdk/credential-provider-web-identity": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", - "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.303.0.tgz", + "integrity": "sha512-1pxDYRscGlERAjFE5hSF1KQdcyOGzssuRTdLvez4I/mSIOAJLMmBAnmHGI/DME2LzDVrC9dklA6LHSC2sn3quQ==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", - "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.303.0.tgz", + "integrity": "sha512-/szzM1BzZGjHwV4mSiZo65cyDleJqnxM9Y4autg55mb3dFwcCiMGI6TGbdegumrNZZlCTeTA1lIhA9PdT4gDAQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/token-providers": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/token-providers": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", - "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.303.0.tgz", + "integrity": "sha512-qi5CP4ocseqdj3kMi0vgLx8XrdanLNvCAfgiEF6LjUJI88R2snZAYNUSd+Y2n04mKAalns+mUwfUN2JyL66d5g==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", - "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.303.0.tgz", + "integrity": "sha512-ueO8UKvYyzt2lexvIdg50TFC7EO2shRWbMWPsVi6Ul7euoQzthr/TPQts4OLZIt9XeIFd4s9dhFwYSobcRfVGw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/credential-provider-cognito-identity": "3.272.0", - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-cognito-identity": "3.303.0", + "@aws-sdk/client-sso": "3.303.0", + "@aws-sdk/client-sts": "3.303.0", + "@aws-sdk/credential-provider-cognito-identity": "3.303.0", + "@aws-sdk/credential-provider-env": "3.303.0", + "@aws-sdk/credential-provider-imds": "3.303.0", + "@aws-sdk/credential-provider-ini": "3.303.0", + "@aws-sdk/credential-provider-node": "3.303.0", + "@aws-sdk/credential-provider-process": "3.303.0", + "@aws-sdk/credential-provider-sso": "3.303.0", + "@aws-sdk/credential-provider-web-identity": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", - "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.303.0.tgz", + "integrity": "sha512-Bc6C86/KQOSWPa741h9QEVcApyignYV5vC5+zZjmKkcyPxrVxTmL3kTJidpVOtVfCmTIrNN/WhAVDzLBbh1ycQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/querystring-builder": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-base64": "3.303.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", - "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.303.0.tgz", + "integrity": "sha512-jSo4A/JxTabZ9jHrx7nhKIXnOmvPg/SSYnoHaFdVS5URJrNt1w+nSvW1wLGMEMOvu5+NU3bldBBSb+h0Ocwv1A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-buffer-from": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", - "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.303.0.tgz", + "integrity": "sha512-RXNcLxOrUJaMMqk5uIYEf6X9XCMockT27bS8Dde/0ms015VOo8Wn2hHU9wEmGeFvLccC2UU4gPzvmj74w70q2Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.303.0.tgz", + "integrity": "sha512-IitBTr+pou7v5BrYLFH/SbIf3g1LIgMhcI3bDXBq2FjzmDftj4bW8BOmg05b9YKf2TrrggvJ4yk/jH+yYFXoJQ==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", - "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.303.0.tgz", + "integrity": "sha512-0UL5TWSL1JRpjT6gjGsZXfia5oL7vxzj+CfMCqkP6gjVF69eRcgu426Xc6TJwDcr6jIFPeamDBTLyt9ZAAr6hg==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", - "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.303.0.tgz", + "integrity": "sha512-z2i8LJ6YTKbqXh9rY/KbXihvhq6P0JVI6SnkwT2hesJp0Nfldx85jsaLzj1+ioNKlQ+51u9UmBnO404DgNCAbg==", "optional": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-serde": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/util-middleware": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", - "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.303.0.tgz", + "integrity": "sha512-LUyhtjbuosrD0QAsBZJwT3yp146I7Xjehf42OP3dWbRuklMEilI0Res5K2/nknf3/ZKUj6sf7BbJoU8E+SpRiQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", - "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.303.0.tgz", + "integrity": "sha512-y2sqmmBdm4gXUL4SyN+ucfO/sxtOEDj2sB12ArRpDGyerfNLhAf7xpL4lXkjPx/7wTIjlBWoO2G/yK6t00P6fA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", - "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.303.0.tgz", + "integrity": "sha512-z3MTsZMtPg6hYWl6a0o07q7zgsDXPYeP14XFVMc8NXqiAyNcm/OYwanpXyNjsEKI/X0nlpJ/Rs+IRCbaIqV9Mw==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", - "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.303.0.tgz", + "integrity": "sha512-wxlqrdGOrCm2Jsra7YyfLyO34YRB/FNlXzwuJiZkqoAb/40ZAuFcWqDv41SP44y8liFXqfsMGuywJ7mK2cHvnA==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/service-error-classification": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "tslib": "^2.3.1", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/service-error-classification": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/util-retry": "3.303.0", + "tslib": "^2.5.0", "uuid": "^8.3.2" }, "engines": { @@ -612,440 +608,438 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", - "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.303.0.tgz", + "integrity": "sha512-igp7htNCUPhVL9Q6rJSgcx3qy/P2l2KAiS0oozOTaTXt3h0LbOusSXtwyA7qvLYeRthnw6msVW+rVBAW3Vo+3g==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-signing": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", - "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.303.0.tgz", + "integrity": "sha512-mmZozwYKgUgXkJrLVqgIYoOQ8DfKZS3pBBT3ZxWzv5Hz5M3oRqFgfVYljkeDM2CTvBweHpqVRTWqPDMcZisucg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", - "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.303.0.tgz", + "integrity": "sha512-rrLQcS2wFsUGj9Kyx78LRgRS8jwiixz/Nyv06SmcKhP680sweETpQz/EA+wcVEVRXmUI6vs4NtqXz36dU0X8Nw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/signature-v4": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-middleware": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", - "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.303.0.tgz", + "integrity": "sha512-6KmdroXLexzILGxF/Xq0cGBs+B8Ipm1pff8qnWCT6KldYp+Q40bVcJrExkVHDN1uOsOxu20ixW2yujOKS356zg==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", - "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.303.0.tgz", + "integrity": "sha512-ZVMVNxPRn2jXog3V4xWokSYoQxTKAdKlNoCfjqFplsF70r8sXfgZtOMF5ZhGo+Hgsx7GqpR/NWPKJtZD2nigpg==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-endpoints": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", - "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.303.0.tgz", + "integrity": "sha512-Ywbo9+2SkbdmNgCoxYJrv+YrFDtBH7hHtn2ywtzP4t57d4t0V/LNrNQsrAsXxqy48OS5r2ovOLHiqJS5jp1oyw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", - "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.303.0.tgz", + "integrity": "sha512-5Te+mwBIOiQr2nM7/SNVFkvYHOH/CswOmUMV4Gxc7YjuervhrYvVFs2P+lL+c8rfiVMTLWjnJ6JiL2JdJfYgnQ==", "optional": true, "dependencies": { - "@aws-sdk/abort-controller": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.303.0", + "@aws-sdk/protocol-http": "3.303.0", + "@aws-sdk/querystring-builder": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", - "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.303.0.tgz", + "integrity": "sha512-d1qbn0pCz+jvB0dcWMWuIlWYM8dWCg3185ngMgUQxkgUk7/kEbwGBsmT+xtZAMQcwcgPkSm8qeATEQ7ToiH8eQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", - "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.303.0.tgz", + "integrity": "sha512-eqblSsdmKBzgNl06dUnL4toq/OQgZyxVsxHCz2nI/xBk5lI/qAZIJyEgP2GmP8aoWwneAq33roG0VLZoxQ8exg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", - "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.303.0.tgz", + "integrity": "sha512-0eMp2gd7Ro0svJ6YVnp9cUiGtrc1d/HynyMfbDkLkqWJAnHMz7Oc1GjK5YyL1hdxm0W+JWZCPR0SovLiaboKDw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-uri-escape": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", - "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.303.0.tgz", + "integrity": "sha512-KNJSQiTFiA7W5eYCox8bLGM7kghC3Azad86HQhdsYO0jCoPxcgj8MeP6T7fPTIC4WcTwcWb7T1MpzoeBiKMOTQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", - "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.303.0.tgz", + "integrity": "sha512-eO13PzdtRO9C+g3tyFOpIblX2SbDrIbg2bNtB8JOfjVi3E1b5VsSTXXU/cKV+lbZ9XMzMn3VzGSvpo6AjzfpxA==", "optional": true, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", - "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.303.0.tgz", + "integrity": "sha512-yI84mnnh3pdQtIOo+oGWofaI0rvfhp3DOavB8KHIkQr+RcjF+fxsqbelRfVb25gx7yEWPNCMB8wM+HhklSEFJg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", - "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.303.0.tgz", + "integrity": "sha512-muw5yclLOgXPHIxv60mhO6R0GVjKbf+M6E/cWvIEVGq8Ke+mLMYNFYNdKP/f/8JgTtW2xwQ7pIK3U8x284ZqPw==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.303.0", + "@aws-sdk/types": "3.303.0", + "@aws-sdk/util-hex-encoding": "3.295.0", + "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/util-uri-escape": "3.303.0", + "@aws-sdk/util-utf8": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", - "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.303.0.tgz", + "integrity": "sha512-WDTC9ODdpRAXo8+Mtr5hsPJeR3y3LxfZZFg5dplJgkaxV+MFdnsUCxZfAZMnxcGy5Q2qTzlLLNk9CpadS72v+g==", "optional": true, "dependencies": { - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", - "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.303.0.tgz", + "integrity": "sha512-7G7VYbqyX0v6RTD/m7XmArZToMek4jYXR/TuuGHK6ifNJeMDwkU4BcoVDj37vvTPYp6qKU5IE+bE3XmPyVWnGQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso-oidc": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/shared-ini-file-loader": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", - "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.303.0.tgz", + "integrity": "sha512-H+Cy8JDTsK87MID6MJbV9ad5xdS9YvaLZSeveC2Zs1WNu2Rp6X9j+mg3EqDSmBKUQVAFRy2b+CSKkH3nnBMedw==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", - "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.303.0.tgz", + "integrity": "sha512-PXMXGhr89s0MiPTf8Ft/v3sPzh2geSrFhTVSO/01blfBQqtuu0JMqORhLheOdi16AhQNVlYHDW2tWdx7/T+KsA==", "optional": true, "dependencies": { - "@aws-sdk/querystring-parser": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-parser": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.303.0.tgz", + "integrity": "sha512-oj+p/GHHPcZEKjiiOHU/CyNQeh8i+8dfMMzU+VGdoK5jHaVG8h2b+V7GPf7I4wDkG2ySCK5b5Jw5NUHwdTJ13Q==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.303.0.tgz", + "integrity": "sha512-T643m0pKzgjAvPFy4W8zL+aszG3T22U8hb6stlMvT0z++Smv8QfIvkIkXjWyH2KlOt5GKliHwdOv8SAi0FSMJQ==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.303.0.tgz", + "integrity": "sha512-/hS8z6e18Le60hJr2TUIFoUjUiAsnQsuDn6DxX74GXhMOHeSwZDJ9jHF39quYkNMmAE37GrVH4MI9vE0pN27qw==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.303.0.tgz", + "integrity": "sha512-hUU+NW+SW6RNojtAKnnmz+tDShVKlEx2YsS4a5fSfrKRUes+zWz10cxVX0RQfysd3R6tdSHhbjsSj8eCIybheg==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "version": "3.295.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.295.0.tgz", + "integrity": "sha512-/5Dl1aV2yI8YQjqwmg4RTnl/E9NmNsx7HIwBZt+dTcOrM0LMUwczQBFFcLyqCj/qv5y+VsvLoAAA/OiBT7hb3w==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", - "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.303.0.tgz", + "integrity": "sha512-jtZgCKelFe4/SHDHQu9ydbYttxSfqSlQojA5qxTJxLvzryIB+/GTHQ+sYWyMyzaD489W9elt1/cSsXd4LtPK0A==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", - "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.303.0.tgz", + "integrity": "sha512-c86iyot/u9bCVcy/rlWL+0kdR51c7C2d2yDXvO9iFCdMKAs28Hw1ijGczVmOcUQ61zKNFSGYx+VekHXN9IWYOg==", "optional": true, "dependencies": { - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.303.0", + "@aws-sdk/credential-provider-imds": "3.303.0", + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/property-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", - "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.303.0.tgz", + "integrity": "sha512-dPg9+l3VY3nclWFiWAVNWek5lQwgdtY8oRYOgCeyntce9FlNrPQgCRTVr36D0iQ0aNCs0GWzfjgL+rIdCF66/w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "version": "3.295.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.295.0.tgz", + "integrity": "sha512-XJcoVo41kHzhe28PBm/rqt5mdCp8R6abwiW9ug1dA6FOoPUO8kBUxDv6xaOmA2hfRvd2ocFfBXaUCBqUowkGcQ==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", - "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "version": "3.295.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.295.0.tgz", + "integrity": "sha512-d/s+zhUx5Kh4l/ecMP/TBjzp1GR/g89Q4nWH6+wH5WgdHsK+LG+vmsk6mVNuP/8wsCofYG4NBqp5Ulbztbm9QA==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", - "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.303.0.tgz", + "integrity": "sha512-HAfBcbZw1+pY3dIEDM4jVpH1ViFcGH5s0q1dr+x4rcLGpMM3B4dH0HUgDPtycG8sw+nk+9jGgiEtgaCNOpJLGA==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", - "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.303.0.tgz", + "integrity": "sha512-RWwRNjoWMcpDouz69wPuFXWFVzwYtUkTbJfa46SjKl1IwqMHS4f9yjJfCwJIoLOW9M/o2JB7nD0Ij3gqqzajLw==", "optional": true, "dependencies": { - "@aws-sdk/service-error-classification": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/service-error-classification": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.303.0.tgz", + "integrity": "sha512-N3ULNuHCL3QzAlCTY+XRRkRQTYCTU8RRuzFCJX0pDpz9t2K+tLT7DbxqupWGNFGl5Xlulf1Is14J3BP/Dx91rA==", "optional": true, "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", - "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.303.0.tgz", + "integrity": "sha512-Kex3abpUrTX9z129jiI8sfjIUmQDwiWjhkvBkPmrwjFY/sZcnOcXj5nP2iwJ+k6CnA5ZK5PjZ6P62t+eJ5MTXw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.272.0", + "@aws-sdk/types": "3.303.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", - "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.303.0.tgz", + "integrity": "sha512-QYUg8F/Ho6AsVZaSSRMf/LWoEPDyOwgKZBw3AbKoH6RxAdAsdL1SXz5t4A6jHakP9TLVN2Yw2WRbHDe4LATASQ==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.303.0", + "@aws-sdk/types": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1060,13 +1054,13 @@ } }, "node_modules/@aws-sdk/util-utf8": { - "version": "3.254.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", - "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "version": "3.303.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.303.0.tgz", + "integrity": "sha512-tZXVuMOIONPOuOGBs/XRdzxv6jUvTM620dRFFIHZwlGiW8bo0x0LlonrzDAJZA4e9ZwmxJIj8Ji13WVRBGvZWg==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.303.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1082,9 +1076,9 @@ } }, "node_modules/@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "node_modules/@types/webidl-conversions": { "version": "7.0.0", @@ -1123,9 +1117,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.3.tgz", - "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1452,9 +1446,9 @@ ] }, "node_modules/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", "optional": true, "dependencies": { "strnum": "^1.0.5" @@ -1781,6 +1775,14 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2137,1670 +2139,5 @@ "node": ">=4.0" } } - }, - "dependencies": { - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "optional": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "optional": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "optional": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "optional": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "optional": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-sdk/abort-controller": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", - "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", - "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", - "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", - "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", - "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-sdk-sts": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/config-resolver": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", - "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", - "optional": true, - "requires": { - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", - "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", - "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-imds": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", - "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", - "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", - "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", - "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", - "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", - "optional": true, - "requires": { - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/token-providers": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", - "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", - "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/credential-provider-cognito-identity": "3.272.0", - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/fetch-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", - "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/hash-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", - "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/invalid-dependency": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", - "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-content-length": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", - "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-endpoint": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", - "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", - "optional": true, - "requires": { - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", - "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", - "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", - "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", - "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/service-error-classification": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", - "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", - "optional": true, - "requires": { - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-serde": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", - "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", - "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-stack": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", - "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", - "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/node-config-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", - "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/node-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", - "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", - "optional": true, - "requires": { - "@aws-sdk/abort-controller": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/property-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", - "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/protocol-http": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", - "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/querystring-builder": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", - "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/querystring-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", - "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/service-error-classification": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", - "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", - "optional": true - }, - "@aws-sdk/shared-ini-file-loader": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", - "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/signature-v4": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", - "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", - "optional": true, - "requires": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/smithy-client": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", - "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", - "optional": true, - "requires": { - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/token-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", - "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", - "optional": true, - "requires": { - "@aws-sdk/client-sso-oidc": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/types": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", - "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/url-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", - "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", - "optional": true, - "requires": { - "@aws-sdk/querystring-parser": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", - "optional": true, - "requires": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "optional": true, - "requires": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-defaults-mode-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", - "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", - "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", - "optional": true, - "requires": { - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", - "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", - "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-middleware": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", - "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", - "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", - "optional": true, - "requires": { - "@aws-sdk/service-error-classification": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", - "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", - "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-utf8": { - "version": "3.254.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", - "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", - "optional": true, - "requires": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" - }, - "@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.3.tgz", - "integrity": "sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } - } - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true - }, - "bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "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==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "ldbs-json": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldbs-json/-/ldbs-json-1.2.1.tgz", - "integrity": "sha512-AUnpgaBwElAkdMCyG7mL7gByZQKeY+tnjzF9sfIzYpGFRbIh6E6SV1ApP8AGcLUtoIXOqc5pVKKqy+WHPml8MQ==", - "requires": { - "node-fetch": "^2.6.0", - "xml2js": "^0.4.22" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mongodb": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", - "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", - "requires": { - "@aws-sdk/credential-providers": "^3.186.0", - "bson": "^4.7.0", - "mongodb-connection-string-url": "^2.5.4", - "saslprep": "^1.0.3", - "socks": "^2.7.1" - } - }, - "mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "string-sanitizer-fix": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string-sanitizer-fix/-/string-sanitizer-fix-2.0.1.tgz", - "integrity": "sha512-I5RSqL5vDfKnoAbpFP2mU0QAh7Gc1KoeIg02N+5+NBfDB/MiSddgNNXfmWND7+BBwy3zub6s/ZWRbZICZKUA0g==" - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "requires": { - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "optional": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } } } diff --git a/package.json b/package.json index e9e4f34..dfd30da 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "express": "^4.18.2", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", + "nodemailer": "^6.9.1", "string-sanitizer-fix": "^2.0.1" }, "name": "owlboard", diff --git a/src/mail-templates/register.html b/src/mail-templates/register.html index 2f0ebbb..80384e7 100644 --- a/src/mail-templates/register.html +++ b/src/mail-templates/register.html @@ -10,6 +10,13 @@

Register for OwlBoard

+

Use the link below to register for OwlBoard (Staff Version)

+ Register +
+

The registration will apply only to the device you click this link on, + you can use the same email to register on other devices but you will + need a separate registration link. +

diff --git a/src/services/mail.services.js b/src/services/mail.services.js index ee1a4dc..0dd6998 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,5 +1,5 @@ const log = require('../utils/log.utils') -const mail = require('some-mail-module') +const mail = require('node-mailer') async function sendTest() { // Send test mail message -- 2.34.1 From bd574498199b6a35c1927306547291dc23825429 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 1 Apr 2023 11:06:30 +0100 Subject: [PATCH 02/95] Add to mail.services Signed-off-by: Fred Boniface --- src/services/mail.services.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 0dd6998..56262ee 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,7 +1,17 @@ const log = require('../utils/log.utils') -const mail = require('node-mailer') +const fs = require('fs') +const mail = require('node-mailer'); //>> Probs wrong + async function sendTest() { // Send test mail message return; +} + +async function sendRegister() { + return; +} + +async function sendAlert() { + return; } \ No newline at end of file -- 2.34.1 From 81d3838588d67989c207ca3df8ae708730a520b9 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 1 Apr 2023 14:44:06 +0100 Subject: [PATCH 03/95] Tidy app.js code --- app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app.js b/app.js index 73a3756..6472d0b 100644 --- a/app.js +++ b/app.js @@ -47,7 +47,6 @@ app.use((err, req, res, next) => { // Express Submodules: app.use(express.json()); //JSON Parsing for POST Requests - //STATIC CONTENT NO LONGER SERVED FROM NODE app.use(compression()) // Compress API Data if supported by client // Express Routes -- 2.34.1 From 062efd940f12d0dbbbadc4c3c39555066a7dbb74 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 1 Apr 2023 15:09:29 +0100 Subject: [PATCH 04/95] Beef out mail.services --- src/services/mail.services.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 56262ee..10dae8b 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -2,9 +2,34 @@ const log = require('../utils/log.utils') const fs = require('fs') const mail = require('node-mailer'); //>> Probs wrong +const fromAdrr = process.env.OWL_EML_FROM +const smtpUser = process.env.OWL_EML_USER +const smtpPass = process.env.OWL_EML_PASS +const smtpHost = process.env.OWL_EML_HOST +const smtpPort = process.env.OWL_EML_PORT -async function sendTest() { +const options = { + host: smtpHost, + port: smtpPort, + secure: true, + auth: { + user: smtpUser, + pass: smtpPass + } +} + +let transporter = nodemailer.createTransport(options) + +async function sendTest(to, subject, plaintext, html) { + log.out(`mailServices.sendTest: Sending test message to: ${to}, subject: ${subject}`, "info") // Send test mail message + let res = await transporter.sendMail({ + from: fromAdrr, + to: to, + subject: subject, + text: plaintext, + html: html + }); return; } @@ -14,4 +39,10 @@ async function sendRegister() { async function sendAlert() { return; +} + +module.exports = { + sendTest, + sendRegister, + sendAlert } \ No newline at end of file -- 2.34.1 From 769946f818810831df14a90136d88a404d1502a6 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 1 Apr 2023 15:11:26 +0100 Subject: [PATCH 05/95] Fix nodemailer 'require' name --- src/services/mail.services.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 10dae8b..eeb7e1f 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -7,6 +7,7 @@ const smtpUser = process.env.OWL_EML_USER const smtpPass = process.env.OWL_EML_PASS const smtpHost = process.env.OWL_EML_HOST const smtpPort = process.env.OWL_EML_PORT +// The 'secure' option is not optional to ensure it is not accidentally omitted const options = { host: smtpHost, @@ -18,7 +19,7 @@ const options = { } } -let transporter = nodemailer.createTransport(options) +let transporter = mail.createTransport(options) async function sendTest(to, subject, plaintext, html) { log.out(`mailServices.sendTest: Sending test message to: ${to}, subject: ${subject}`, "info") -- 2.34.1 From 184b7e50c34ea3785d0ba48ee16cc244f23cc76b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 11:03:22 +0100 Subject: [PATCH 06/95] Bump version and add dev tag --- src/configs/version.configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/version.configs.js b/src/configs/version.configs.js index 7a10988..2beee8d 100644 --- a/src/configs/version.configs.js +++ b/src/configs/version.configs.js @@ -1,6 +1,6 @@ const version = { api: ["/api/v1/",], - app: "1.1.5" + app: "1.2.0-dev" }; module.exports = version; \ No newline at end of file -- 2.34.1 From f03f02ede9b39c04530e211bd0df270f5e2717ea Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 11:45:32 +0100 Subject: [PATCH 07/95] Continued email testing --- src/mail-templates/register.html | 35 +++++++++++++++++++------------- src/mail-templates/test.html | 28 +++++++++++++++++++++++++ src/mail-templates/test.txt | 7 +++++++ src/services/mail.services.js | 14 ++++++------- 4 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 src/mail-templates/test.html create mode 100644 src/mail-templates/test.txt diff --git a/src/mail-templates/register.html b/src/mail-templates/register.html index 80384e7..72a2425 100644 --- a/src/mail-templates/register.html +++ b/src/mail-templates/register.html @@ -1,23 +1,30 @@ OwlBoard - Register + - +
- - + + + +
- - -

Register for OwlBoard

-

Use the link below to register for OwlBoard (Staff Version)

- Register -
-

The registration will apply only to the device you click this link on, - you can use the same email to register on other devices but you will - need a separate registration link. -

-
+ +
+

Register for OwlBoard

+

Use the link below to register for OwlBoard (Staff Version)

+ Register +
+

The registration will apply only to the device you click this link on, + you can use the same email address to register on other devices but you will + need a separate registration link. +

+
diff --git a/src/mail-templates/test.html b/src/mail-templates/test.html new file mode 100644 index 0000000..0473daa --- /dev/null +++ b/src/mail-templates/test.html @@ -0,0 +1,28 @@ + + + OwlBoard - Register + + + + + + + + + + +
+ +
+

Testing OwlBoard

+

This is a test message from OwlBoard (Testing version)

+ Not a Link +
+

There is nothing important here

+
+ + \ No newline at end of file diff --git a/src/mail-templates/test.txt b/src/mail-templates/test.txt new file mode 100644 index 0000000..9d5d6be --- /dev/null +++ b/src/mail-templates/test.txt @@ -0,0 +1,7 @@ +OwlBoard + +This is a test message from OwlBoard + +It can safely be disregarded, apologies if it has reached you by mistake + +OwlBoard does not store any email addresses so any mistake has been caused by manual entry. \ No newline at end of file diff --git a/src/services/mail.services.js b/src/services/mail.services.js index eeb7e1f..b2d72e6 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,18 +1,18 @@ const log = require('../utils/log.utils') const fs = require('fs') -const mail = require('node-mailer'); //>> Probs wrong +const mail = require('nodemailer'); //>> Probs wrong const fromAdrr = process.env.OWL_EML_FROM const smtpUser = process.env.OWL_EML_USER const smtpPass = process.env.OWL_EML_PASS const smtpHost = process.env.OWL_EML_HOST const smtpPort = process.env.OWL_EML_PORT -// The 'secure' option is not optional to ensure it is not accidentally omitted +// The 'secure' option is set to false as the SMTP server used only supports STARTTLS and will not accept TLS or no encryption const options = { host: smtpHost, port: smtpPort, - secure: true, + secure: false, auth: { user: smtpUser, pass: smtpPass @@ -21,17 +21,17 @@ const options = { let transporter = mail.createTransport(options) -async function sendTest(to, subject, plaintext, html) { +async function sendTest(to, subject, html) { log.out(`mailServices.sendTest: Sending test message to: ${to}, subject: ${subject}`, "info") // Send test mail message let res = await transporter.sendMail({ from: fromAdrr, to: to, - subject: subject, - text: plaintext, + subject: "Test Message from OwlBoard", + text: "OwlBoard Test Message - See HTML", html: html }); - return; + return res; } async function sendRegister() { -- 2.34.1 From fceee0b4ead3976054d7d93f8cbd23332122b518 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 14:41:14 +0100 Subject: [PATCH 08/95] Create 'sendTest' function for mail service --- .../register.html | 0 .../test.html | 0 .../test.txt | 0 package-lock.json | 4 ++-- package.json | 7 ++++--- src/services/kube.services.js | 4 ++++ src/services/mail.services.js | 21 +++++++++++++------ 7 files changed, 25 insertions(+), 11 deletions(-) rename {src/mail-templates => mail-templates}/register.html (100%) rename {src/mail-templates => mail-templates}/test.html (100%) rename {src/mail-templates => mail-templates}/test.txt (100%) diff --git a/src/mail-templates/register.html b/mail-templates/register.html similarity index 100% rename from src/mail-templates/register.html rename to mail-templates/register.html diff --git a/src/mail-templates/test.html b/mail-templates/test.html similarity index 100% rename from src/mail-templates/test.html rename to mail-templates/test.html diff --git a/src/mail-templates/test.txt b/mail-templates/test.txt similarity index 100% rename from src/mail-templates/test.txt rename to mail-templates/test.txt diff --git a/package-lock.json b/package-lock.json index a3e7dea..1045357 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "owlboard", - "version": "0.0.1", + "version": "1.2.0-dev", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "owlboard", - "version": "0.0.1", + "version": "1.2.0-dev", "license": "GPL-3.0-or-later", "dependencies": { "axios": "^1.2.1", diff --git a/package.json b/package.json index dfd30da..fb6934b 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,16 @@ }, "name": "owlboard", "description": "OwlBoard is an API and PWA for live rail departure board in the UK.", - "version": "0.0.1", + "version": "1.2.0-dev", "main": "express.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node app.js" + "start": "node app.js", + "run": "node app.js" }, "repository": { "type": "git", - "url": "https://git.fjla.uk/fred.boniface/owlboard.git" + "url": "https://git.fjla.uk/owlboard/backend.git" }, "author": "Fred Boniface", "license": "GPL-3.0-or-later" diff --git a/src/services/kube.services.js b/src/services/kube.services.js index 9eb5388..f065f76 100644 --- a/src/services/kube.services.js +++ b/src/services/kube.services.js @@ -1,3 +1,6 @@ +const testing = require('../services/mail.services') +const log = require('../utils/log.utils') + async function getAlive(){ log.out(`kubeServices.getAlive: alive hook checked`, "info") return {code: 200, state: {state: "alive",noise: "twit-twoo"}} @@ -5,6 +8,7 @@ async function getAlive(){ async function getReady(){ log.out(`kubeServices.getReady: ready hook checked`, "info") + testing.sendTest("fred@fjla.uk"); return "not_implemented"; }; diff --git a/src/services/mail.services.js b/src/services/mail.services.js index b2d72e6..8eacc2b 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,5 +1,5 @@ const log = require('../utils/log.utils') -const fs = require('fs') +const fs = require('fs/promises') const mail = require('nodemailer'); //>> Probs wrong const fromAdrr = process.env.OWL_EML_FROM @@ -21,16 +21,25 @@ const options = { let transporter = mail.createTransport(options) -async function sendTest(to, subject, html) { - log.out(`mailServices.sendTest: Sending test message to: ${to}, subject: ${subject}`, "info") +async function sendTest(to, cc, bcc) { + log.out(`mailServices.sendTest: Sending test message to: ${to}`, "info") + let tHtml = fs.readFile('mail-templates/test.html', 'utf-8'); + let tTxt = fs.readFile('mail-templates/test.txt', 'ascii') // Send test mail message - let res = await transporter.sendMail({ + try { + var res = await transporter.sendMail({ from: fromAdrr, to: to, + cc: cc, + bcc: bcc, subject: "Test Message from OwlBoard", - text: "OwlBoard Test Message - See HTML", - html: html + text: await tTxt, + html: await tHtml }); + } catch(err) { + log.out(err, "warn") + var res = "failed" + } return res; } -- 2.34.1 From 79d3ff2d9cd643f02105256a7eb081ece6c67c58 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 17:17:12 +0100 Subject: [PATCH 09/95] Finalise register mail templates --- mail-templates/register.html | 27 +++++++++++++++++------ mail-templates/register.txt | 6 ++++++ src/services/mail.services.js | 40 ++++++++++++++++++++++++----------- 3 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 mail-templates/register.txt diff --git a/mail-templates/register.html b/mail-templates/register.html index 72a2425..27a9776 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -1,14 +1,20 @@ OwlBoard - Register + - +

+
@@ -17,15 +23,22 @@

Register for OwlBoard

-

Use the link below to register for OwlBoard (Staff Version)

- Register
-

The registration will apply only to the device you click this link on, - you can use the same email address to register on other devices but you will - need a separate registration link. +

Use the link below to register for OwlBoard (Staff Version)

+
+ Register +


+

Alternatively visit owlboard.info/reg and paste in your access code:

+

>>ACCESSCODE<<

+

This registration is for one device only, you can register again using the + same email address for other devices and access OwlBoard from both. +

+

If you did not request to sign up to OwlBoard (Staff Version), you can + safely ignore this email.

+
\ No newline at end of file diff --git a/mail-templates/register.txt b/mail-templates/register.txt new file mode 100644 index 0000000..5a0a5e8 --- /dev/null +++ b/mail-templates/register.txt @@ -0,0 +1,6 @@ +Complete your OwlBoard (Staff) Registration using the link below. + +https://owlboard.info/ref/auto.html?>>ACCESSCODE<< + +Alternatively visit https://owlboard.info/ref/ and paste in your access code: +>>ACCESSCODE<< \ No newline at end of file diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 8eacc2b..1d2e436 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -7,24 +7,21 @@ const smtpUser = process.env.OWL_EML_USER const smtpPass = process.env.OWL_EML_PASS const smtpHost = process.env.OWL_EML_HOST const smtpPort = process.env.OWL_EML_PORT -// The 'secure' option is set to false as the SMTP server used only supports STARTTLS and will not accept TLS or no encryption -const options = { +let transporter = mail.createTransport({ host: smtpHost, port: smtpPort, - secure: false, + secure: false, // Must be false for STARTTLS on port 587 auth: { user: smtpUser, pass: smtpPass } -} - -let transporter = mail.createTransport(options) +}) async function sendTest(to, cc, bcc) { log.out(`mailServices.sendTest: Sending test message to: ${to}`, "info") - let tHtml = fs.readFile('mail-templates/test.html', 'utf-8'); - let tTxt = fs.readFile('mail-templates/test.txt', 'ascii') + let tHtml = fs.readFile('mail-templates/register.html', 'utf-8'); + let tTxt = fs.readFile('mail-templates/register.txt', 'utf-8'); // Send test mail message try { var res = await transporter.sendMail({ @@ -33,8 +30,8 @@ async function sendTest(to, cc, bcc) { cc: cc, bcc: bcc, subject: "Test Message from OwlBoard", - text: await tTxt, - html: await tHtml + text: (await tTxt).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Tue, 4 Apr 2023 20:34:36 +0100 Subject: [PATCH 10/95] Adjust email tempates Signed-off-by: Fred Boniface --- mail-templates/register.html | 3 +-- mail-templates/register.txt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 27a9776..1f06b8c 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -28,8 +28,7 @@
Register


-

Alternatively visit owlboard.info/reg and paste in your access code:

-

>>ACCESSCODE<<

+

Alternatively copy and paste the link "https://owlboard.info/reg/auto.html?>>ACCESSCODE<<

This registration is for one device only, you can register again using the same email address for other devices and access OwlBoard from both.

diff --git a/mail-templates/register.txt b/mail-templates/register.txt index 5a0a5e8..255ffeb 100644 --- a/mail-templates/register.txt +++ b/mail-templates/register.txt @@ -2,5 +2,4 @@ Complete your OwlBoard (Staff) Registration using the link below. https://owlboard.info/ref/auto.html?>>ACCESSCODE<< -Alternatively visit https://owlboard.info/ref/ and paste in your access code: ->>ACCESSCODE<< \ No newline at end of file +Alternatively you can copy and paste the above link. \ No newline at end of file -- 2.34.1 From e8a069f78875c8671bb1068ad13b9449977d9288 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 20:35:12 +0100 Subject: [PATCH 11/95] Fix incorrect links in email templates Signed-off-by: Fred Boniface --- mail-templates/register.html | 4 ++-- mail-templates/register.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 1f06b8c..9200063 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -26,9 +26,9 @@

Use the link below to register for OwlBoard (Staff Version)


- Register + Register


-

Alternatively copy and paste the link "https://owlboard.info/reg/auto.html?>>ACCESSCODE<<

+

Alternatively copy and paste the link "https://owlboard.info/reg/auth.html?>>ACCESSCODE<<

This registration is for one device only, you can register again using the same email address for other devices and access OwlBoard from both.

diff --git a/mail-templates/register.txt b/mail-templates/register.txt index 255ffeb..41e1e2c 100644 --- a/mail-templates/register.txt +++ b/mail-templates/register.txt @@ -1,5 +1,5 @@ Complete your OwlBoard (Staff) Registration using the link below. -https://owlboard.info/ref/auto.html?>>ACCESSCODE<< +https://owlboard.info/ref/auth.html?>>ACCESSCODE<< Alternatively you can copy and paste the above link. \ No newline at end of file -- 2.34.1 From 25640c2e78d623ace0b76c13048ee43ebc44980c Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 21:28:34 +0100 Subject: [PATCH 12/95] Bump major versions due to dbmanager incompat Signed-off-by: Fred Boniface --- src/configs/version.configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/version.configs.js b/src/configs/version.configs.js index 2beee8d..e8e12a5 100644 --- a/src/configs/version.configs.js +++ b/src/configs/version.configs.js @@ -1,6 +1,6 @@ const version = { api: ["/api/v1/",], - app: "1.2.0-dev" + app: "2.0.0-dev" }; module.exports = version; \ No newline at end of file -- 2.34.1 From 14e0a93d867b4a534cb751f851452b64713675c2 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 21:28:46 +0100 Subject: [PATCH 13/95] Add initial registration functions Signed-off-by: Fred Boniface --- app.js | 1 + package-lock.json | 554 ++++++++++++++++++++++++++++ package.json | 1 + src/controllers/auth.controllers.js | 14 + src/routes/auth.routes.js | 7 + src/services/auth.services.js | 42 +++ src/services/dbAccess.services.js | 23 +- src/utils/auth.utils.js | 24 ++ 8 files changed, 665 insertions(+), 1 deletion(-) create mode 100644 src/controllers/auth.controllers.js create mode 100644 src/routes/auth.routes.js create mode 100644 src/services/auth.services.js create mode 100644 src/utils/auth.utils.js diff --git a/app.js b/app.js index 6472d0b..ab77945 100644 --- a/app.js +++ b/app.js @@ -20,6 +20,7 @@ const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints const findRtr = require('./src/routes/find.routes'); // /find endpoints const issueRtr = require('./src/routes/issue.routes') // /issue endpoints const statRtr = require('./src/routes/stats.routes'); // /stat endpoints +const auth = require('./src/routes/auth.routes'); // /auth endpoints // Set Server Configurations const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" diff --git a/package-lock.json b/package-lock.json index 1045357..45be9c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "GPL-3.0-or-later", "dependencies": { "axios": "^1.2.1", + "bcrypt": "^5.1.0", "compression": "^1.7.4", "express": "^4.18.2", "ldbs-json": "^1.2.1", @@ -1075,6 +1076,25 @@ "tslib": "^2.3.1" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -1094,6 +1114,11 @@ "@types/webidl-conversions": "*" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1106,6 +1131,63 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1126,6 +1208,11 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1145,6 +1232,19 @@ } ] }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -1182,6 +1282,15 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "optional": true }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/bson": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", @@ -1236,6 +1345,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1275,6 +1400,16 @@ "node": ">= 0.8.0" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1342,6 +1477,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1359,11 +1499,24 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1526,11 +1679,57 @@ "node": ">= 0.6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -1544,6 +1743,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1566,6 +1784,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1581,6 +1804,39 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1611,6 +1867,15 @@ } ] }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1629,6 +1894,14 @@ "node": ">= 0.10" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/ldbs-json": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ldbs-json/-/ldbs-json-1.2.1.tgz", @@ -1641,6 +1914,39 @@ "node": ">=7.6" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1698,6 +2004,59 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mongodb": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", @@ -1737,6 +2096,11 @@ "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node_modules/node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -1783,6 +2147,39 @@ "node": ">=6.0.0" } }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -1810,6 +2207,14 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1818,6 +2223,14 @@ "node": ">= 0.8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -1892,6 +2305,33 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1919,6 +2359,20 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1961,6 +2415,11 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -1979,6 +2438,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -2018,17 +2482,84 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-sanitizer-fix": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string-sanitizer-fix/-/string-sanitizer-fix-2.0.1.tgz", "integrity": "sha512-I5RSqL5vDfKnoAbpFP2mU0QAh7Gc1KoeIg02N+5+NBfDB/MiSddgNNXfmWND7+BBwy3zub6s/ZWRbZICZKUA0g==" }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "optional": true }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2074,6 +2605,11 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2119,6 +2655,19 @@ "node": ">=12" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -2138,6 +2687,11 @@ "engines": { "node": ">=4.0" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index fb6934b..38921f5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "dependencies": { "axios": "^1.2.1", + "bcrypt": "^5.1.0", "compression": "^1.7.4", "express": "^4.18.2", "ldbs-json": "^1.2.1", diff --git a/src/controllers/auth.controllers.js b/src/controllers/auth.controllers.js new file mode 100644 index 0000000..4df90a4 --- /dev/null +++ b/src/controllers/auth.controllers.js @@ -0,0 +1,14 @@ +const auth = require('../services/auth.services'); + +async function register(req, res, next){ + try { + res.json(await auth.addUser(req.body)) + } catch (err) { + console.error(`Controller Error`, err.message); + next(err); + } +} + +module.exports = { + register +} \ No newline at end of file diff --git a/src/routes/auth.routes.js b/src/routes/auth.routes.js new file mode 100644 index 0000000..3c2f96e --- /dev/null +++ b/src/routes/auth.routes.js @@ -0,0 +1,7 @@ +const express = require('express'); +const router = express.Router(); +const authController = require('../controllers/auth.controllers'); + +router.post('/register', authController.register); + +module.exports = router; \ No newline at end of file diff --git a/src/services/auth.services.js b/src/services/auth.services.js new file mode 100644 index 0000000..024d255 --- /dev/null +++ b/src/services/auth.services.js @@ -0,0 +1,42 @@ +const axios = require('axios') +const log = require('../utils/log.utils') +const util = require('../utils/auth.utils') +const db = require('../services/dbAccess.services') + +async function createRegKey(){ + const uuid = util.generateKey(); + return uuid.token; +} + +async function regUser(req) { + if (util.checkRequest(req.key) == true) { + apiKey = await db.addUser(hash) + return {status: 201, message: "User added", api_key: apiKey} + } else { + return {status: 401, message: "Unautorised"} + } +} + +async function sendToGitea(body) { + let key = process.env.OWL_GIT_ISSUEBOT + let url = process.env.OWL_GIT_APIENDPOINT + let opts = { + headers: { + Authorization: key + } + } + var res = await axios.post(url, body, opts) + // Need to read the output from the POST and pass the result upwards to the client. + if (res.status == 201) { + log.out("issueService.sendToGitea: Issue sent to Gitea", "info") + return {status: res.status,message:"issue created"} + } else { + log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, "err") + return {status: res.status,message:"issue not created"} + } +} + +module.exports = { + regUser, + createRegKey +} \ No newline at end of file diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index d17b5fd..605df9f 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -33,7 +33,28 @@ async function increment(target) { return; } +async function addUser(uuid, domain) { + log.out(`dbAccess.addUser: Adding user to database`) + let doc = {uuid: uuid, domain: domain, atime: new Date} + await client.connect(); + let col = db.collection("users"); + res = col.insertOne(doc); + return res; +} + +async function userAtime(uuid) { + log.out(`dbAccess.userAtime: Updating access time for user`) + let q = {uuid: uuid}; + let n = {$set: {uuid: uuid, atime: new Date}}; + await client.connect(); + let col = db.collection("users"); + res = col.updateOne(q, n, {upsert: true}) + return res; +} + module.exports = { query, - increment + increment, + addUser, + userAtime } \ No newline at end of file diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js new file mode 100644 index 0000000..e41bee1 --- /dev/null +++ b/src/utils/auth.utils.js @@ -0,0 +1,24 @@ +const log = require('../utils/log.utils'); +const crypto = require('crypto') +const db = require('../services/dbAccess.services') + +// Checks users registration key against issued keys +async function checkUser(key) { + q = {uuid: key}; + res = db.query(q); + log.out(`authUtils.checkUser: DB Query answer: ${await res}`) + return await res +} + +// Creates an API key for a user +async function generateKey() { + const saltRounds = 10 + const token = crypto.randomUUID() + const hash = bcrypt.hash(token, saltRounds); + return {user_key: token, hash_key: await hash} +}; + +module.export = { + checkUser, + generateKey +} \ No newline at end of file -- 2.34.1 From 330e8e02a0a3f9420b07cad1e01c6accc781838e Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:12:38 +0100 Subject: [PATCH 14/95] Add request and register functions Signed-off-by: Fred Boniface --- src/services/auth.services.js | 38 ++++++++++++------------------- src/services/dbAccess.services.js | 12 +++++++++- src/utils/auth.utils.js | 7 ++---- src/utils/checkauth.utils.js | 0 src/utils/sanitizer.utils.js | 8 ++++++- 5 files changed, 34 insertions(+), 31 deletions(-) delete mode 100644 src/utils/checkauth.utils.js diff --git a/src/services/auth.services.js b/src/services/auth.services.js index 024d255..e4a4248 100644 --- a/src/services/auth.services.js +++ b/src/services/auth.services.js @@ -1,41 +1,31 @@ -const axios = require('axios') const log = require('../utils/log.utils') const util = require('../utils/auth.utils') const db = require('../services/dbAccess.services') +const mail = require('../services/mail.services') +const clean = require('../utils/sanitizer.utils') +const domList= require('../configs/domains.configs') -async function createRegKey(){ - const uuid = util.generateKey(); - return uuid.token; +async function createRegKey(eml){ + const domain = clean.splitDomain(eml) // Obtain mail domain as that is all that needs storing + if (domain in domList.valid) { + const uuid = util.generateKey(); + db.addRegReq(await uuid, await domain) + mail.sendRegister("mail", "uuid"); + return 201 + } else { + return 401 + } } async function regUser(req) { if (util.checkRequest(req.key) == true) { - apiKey = await db.addUser(hash) + apiKey = await db.addUser(await util.generateKey()) return {status: 201, message: "User added", api_key: apiKey} } else { return {status: 401, message: "Unautorised"} } } -async function sendToGitea(body) { - let key = process.env.OWL_GIT_ISSUEBOT - let url = process.env.OWL_GIT_APIENDPOINT - let opts = { - headers: { - Authorization: key - } - } - var res = await axios.post(url, body, opts) - // Need to read the output from the POST and pass the result upwards to the client. - if (res.status == 201) { - log.out("issueService.sendToGitea: Issue sent to Gitea", "info") - return {status: res.status,message:"issue created"} - } else { - log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, "err") - return {status: res.status,message:"issue not created"} - } -} - module.exports = { regUser, createRegKey diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 605df9f..a7ee618 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -42,6 +42,15 @@ async function addUser(uuid, domain) { return res; } +async function addRegReq(uuid) { + log.out(`dbAccess.addRegReq: Adding registration request`) + let doc = {uuid: uuid, time: new Date} + await client.connect(); + let col = db.collection("registrations"); + res = col.insertOne(doc); + return res; +} + async function userAtime(uuid) { log.out(`dbAccess.userAtime: Updating access time for user`) let q = {uuid: uuid}; @@ -56,5 +65,6 @@ module.exports = { query, increment, addUser, - userAtime + userAtime, + addRegReq } \ No newline at end of file diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index e41bee1..98d84fa 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -5,17 +5,14 @@ const db = require('../services/dbAccess.services') // Checks users registration key against issued keys async function checkUser(key) { q = {uuid: key}; - res = db.query(q); + res = db.query("registrations", q); log.out(`authUtils.checkUser: DB Query answer: ${await res}`) return await res } // Creates an API key for a user async function generateKey() { - const saltRounds = 10 - const token = crypto.randomUUID() - const hash = bcrypt.hash(token, saltRounds); - return {user_key: token, hash_key: await hash} + return crypto.randomUUID() }; module.export = { diff --git a/src/utils/checkauth.utils.js b/src/utils/checkauth.utils.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index 28aade0..3c3db19 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -38,8 +38,14 @@ function cleanNrcc(input) { return rmPara; } +async function splitDomain(mail) { + split = mail.split("@") + return split[1] +} + module.exports = { cleanApiEndpointTxt, cleanApiEndpointNum, - cleanNrcc + cleanNrcc, + splitDomain } \ No newline at end of file -- 2.34.1 From f5d46a38d768a010ce972fea20f58a92ed972143 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:15:51 +0100 Subject: [PATCH 15/95] Added comments for further development Signed-off-by: Fred Boniface --- src/services/auth.services.js | 9 +++++---- src/services/dbAccess.services.js | 6 +++--- src/utils/auth.utils.js | 4 ++-- src/utils/sanitizer.utils.js | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/services/auth.services.js b/src/services/auth.services.js index e4a4248..6b7c3d6 100644 --- a/src/services/auth.services.js +++ b/src/services/auth.services.js @@ -1,4 +1,4 @@ -const log = require('../utils/log.utils') +const log = require('../utils/log.utils') // Currently no logging on this page const util = require('../utils/auth.utils') const db = require('../services/dbAccess.services') const mail = require('../services/mail.services') @@ -6,19 +6,20 @@ const clean = require('../utils/sanitizer.utils') const domList= require('../configs/domains.configs') async function createRegKey(eml){ - const domain = clean.splitDomain(eml) // Obtain mail domain as that is all that needs storing + const domain = clean.splitDomain(eml) if (domain in domList.valid) { const uuid = util.generateKey(); db.addRegReq(await uuid, await domain) mail.sendRegister("mail", "uuid"); - return 201 + return 201 // These returns still need handling } else { - return 401 + return 401 // As above } } async function regUser(req) { if (util.checkRequest(req.key) == true) { + // Run DB Query to get the email domain to store alongside the api_key apiKey = await db.addUser(await util.generateKey()) return {status: 201, message: "User added", api_key: apiKey} } else { diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index a7ee618..8006551 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -33,7 +33,7 @@ async function increment(target) { return; } -async function addUser(uuid, domain) { +async function addUser(uuid, domain) { // Needs testing log.out(`dbAccess.addUser: Adding user to database`) let doc = {uuid: uuid, domain: domain, atime: new Date} await client.connect(); @@ -42,7 +42,7 @@ async function addUser(uuid, domain) { return res; } -async function addRegReq(uuid) { +async function addRegReq(uuid) { // Needs testing log.out(`dbAccess.addRegReq: Adding registration request`) let doc = {uuid: uuid, time: new Date} await client.connect(); @@ -51,7 +51,7 @@ async function addRegReq(uuid) { return res; } -async function userAtime(uuid) { +async function userAtime(uuid) { // Needs testing log.out(`dbAccess.userAtime: Updating access time for user`) let q = {uuid: uuid}; let n = {$set: {uuid: uuid, atime: new Date}}; diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index 98d84fa..fdaf571 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -3,7 +3,7 @@ const crypto = require('crypto') const db = require('../services/dbAccess.services') // Checks users registration key against issued keys -async function checkUser(key) { +async function checkUser(key) { // Needs testing q = {uuid: key}; res = db.query("registrations", q); log.out(`authUtils.checkUser: DB Query answer: ${await res}`) @@ -11,7 +11,7 @@ async function checkUser(key) { } // Creates an API key for a user -async function generateKey() { +async function generateKey() { // Needs testing return crypto.randomUUID() }; diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index 3c3db19..c1fdbaa 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -38,7 +38,7 @@ function cleanNrcc(input) { return rmPara; } -async function splitDomain(mail) { +async function splitDomain(mail) { // Needs testing split = mail.split("@") return split[1] } -- 2.34.1 From bea1b68a9d35c905a202bbbe73483616e72587ec Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:19:45 +0100 Subject: [PATCH 16/95] npm update Signed-off-by: Fred Boniface --- package-lock.json | 1304 +++++++++++++-------------------------------- package.json | 1 - 2 files changed, 375 insertions(+), 930 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45be9c5..37d5ef9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "license": "GPL-3.0-or-later", "dependencies": { "axios": "^1.2.1", - "bcrypt": "^5.1.0", "compression": "^1.7.4", "express": "^4.18.2", "ldbs-json": "^1.2.1", @@ -106,12 +105,12 @@ "optional": true }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.303.0.tgz", - "integrity": "sha512-LzNzpeyTppcmV/6SAQI3T/huOkMrUnFveplgVNwJxw+rVqmqmGV6z6vpg+oRICRDcjXWYiSiaClxxSVvOy0sDQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.306.0.tgz", + "integrity": "sha512-ewCvdUrMJMlnkNaqXdG7L2H6O7CDI036y6lkTU8gQqa2lCzZvqBkzz6R5NbWqb8TJPi69Z7lXEITgk2b0+pl6w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -119,44 +118,44 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.303.0.tgz", - "integrity": "sha512-rybplTjq6aj7DttT+v8ycajT8BIFXqdo66lkQjO1YykEIyVTnY4L9McTyNFOZsvNmG1LMSqb95/eYP463Lp7fg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.306.0.tgz", + "integrity": "sha512-jYDs8yjEU0cyb/nZj2C6nz300lR8dOq+SqsxgdqgW9R46AGL6J4pPAY3/PRFHyC3LsRP3y/qC5w5UD/8Q0UuWg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.303.0", - "@aws-sdk/config-resolver": "3.303.0", - "@aws-sdk/credential-provider-node": "3.303.0", - "@aws-sdk/fetch-http-handler": "3.303.0", - "@aws-sdk/hash-node": "3.303.0", - "@aws-sdk/invalid-dependency": "3.303.0", - "@aws-sdk/middleware-content-length": "3.303.0", - "@aws-sdk/middleware-endpoint": "3.303.0", - "@aws-sdk/middleware-host-header": "3.303.0", - "@aws-sdk/middleware-logger": "3.303.0", - "@aws-sdk/middleware-recursion-detection": "3.303.0", - "@aws-sdk/middleware-retry": "3.303.0", - "@aws-sdk/middleware-serde": "3.303.0", - "@aws-sdk/middleware-signing": "3.303.0", - "@aws-sdk/middleware-stack": "3.303.0", - "@aws-sdk/middleware-user-agent": "3.303.0", - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/node-http-handler": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/smithy-client": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/client-sts": "3.306.0", + "@aws-sdk/config-resolver": "3.306.0", + "@aws-sdk/credential-provider-node": "3.306.0", + "@aws-sdk/fetch-http-handler": "3.306.0", + "@aws-sdk/hash-node": "3.306.0", + "@aws-sdk/invalid-dependency": "3.306.0", + "@aws-sdk/middleware-content-length": "3.306.0", + "@aws-sdk/middleware-endpoint": "3.306.0", + "@aws-sdk/middleware-host-header": "3.306.0", + "@aws-sdk/middleware-logger": "3.306.0", + "@aws-sdk/middleware-recursion-detection": "3.306.0", + "@aws-sdk/middleware-retry": "3.306.0", + "@aws-sdk/middleware-serde": "3.306.0", + "@aws-sdk/middleware-signing": "3.306.0", + "@aws-sdk/middleware-stack": "3.306.0", + "@aws-sdk/middleware-user-agent": "3.306.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/node-http-handler": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/smithy-client": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", "@aws-sdk/util-base64": "3.303.0", "@aws-sdk/util-body-length-browser": "3.303.0", "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.303.0", - "@aws-sdk/util-defaults-mode-node": "3.303.0", - "@aws-sdk/util-endpoints": "3.303.0", - "@aws-sdk/util-retry": "3.303.0", - "@aws-sdk/util-user-agent-browser": "3.303.0", - "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.306.0", + "@aws-sdk/util-defaults-mode-node": "3.306.0", + "@aws-sdk/util-endpoints": "3.306.0", + "@aws-sdk/util-retry": "3.306.0", + "@aws-sdk/util-user-agent-browser": "3.306.0", + "@aws-sdk/util-user-agent-node": "3.306.0", "@aws-sdk/util-utf8": "3.303.0", "tslib": "^2.5.0" }, @@ -165,41 +164,41 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.303.0.tgz", - "integrity": "sha512-LZ+Z6vGnEdqmxx0dqtZP97n5VX5uUKu4lJmDR3sdGolxAUqCY1FxHDZd9DzCFXR8rwoJK4VJTL+exzeVp4Ly/g==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.306.0.tgz", + "integrity": "sha512-uqfLUOP9LlBoqXe3P250TPX3fGrabfRt9Q9rlLFK0fVBI7HPIQ/wsPplLoPrMeT04qQmTI03UnVKMNza3GqyIg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.303.0", - "@aws-sdk/fetch-http-handler": "3.303.0", - "@aws-sdk/hash-node": "3.303.0", - "@aws-sdk/invalid-dependency": "3.303.0", - "@aws-sdk/middleware-content-length": "3.303.0", - "@aws-sdk/middleware-endpoint": "3.303.0", - "@aws-sdk/middleware-host-header": "3.303.0", - "@aws-sdk/middleware-logger": "3.303.0", - "@aws-sdk/middleware-recursion-detection": "3.303.0", - "@aws-sdk/middleware-retry": "3.303.0", - "@aws-sdk/middleware-serde": "3.303.0", - "@aws-sdk/middleware-stack": "3.303.0", - "@aws-sdk/middleware-user-agent": "3.303.0", - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/node-http-handler": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/smithy-client": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/config-resolver": "3.306.0", + "@aws-sdk/fetch-http-handler": "3.306.0", + "@aws-sdk/hash-node": "3.306.0", + "@aws-sdk/invalid-dependency": "3.306.0", + "@aws-sdk/middleware-content-length": "3.306.0", + "@aws-sdk/middleware-endpoint": "3.306.0", + "@aws-sdk/middleware-host-header": "3.306.0", + "@aws-sdk/middleware-logger": "3.306.0", + "@aws-sdk/middleware-recursion-detection": "3.306.0", + "@aws-sdk/middleware-retry": "3.306.0", + "@aws-sdk/middleware-serde": "3.306.0", + "@aws-sdk/middleware-stack": "3.306.0", + "@aws-sdk/middleware-user-agent": "3.306.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/node-http-handler": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/smithy-client": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", "@aws-sdk/util-base64": "3.303.0", "@aws-sdk/util-body-length-browser": "3.303.0", "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.303.0", - "@aws-sdk/util-defaults-mode-node": "3.303.0", - "@aws-sdk/util-endpoints": "3.303.0", - "@aws-sdk/util-retry": "3.303.0", - "@aws-sdk/util-user-agent-browser": "3.303.0", - "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.306.0", + "@aws-sdk/util-defaults-mode-node": "3.306.0", + "@aws-sdk/util-endpoints": "3.306.0", + "@aws-sdk/util-retry": "3.306.0", + "@aws-sdk/util-user-agent-browser": "3.306.0", + "@aws-sdk/util-user-agent-node": "3.306.0", "@aws-sdk/util-utf8": "3.303.0", "tslib": "^2.5.0" }, @@ -208,41 +207,41 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.303.0.tgz", - "integrity": "sha512-oOdDcBjxGiJ6mFWUMVr+A1hAzGRpcZ+oLAhCakpvpXCUG50PZSBFP+vOQXgHY/XNolqDg+IHq60oE9HoPzGleg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.306.0.tgz", + "integrity": "sha512-O27yrApCkbC0/uPRb1aHkENpFSqrkPbXRi76NF/8T97qC8bngRpy6yeafcQRrp9NGQSF/m9xbPWYsQuiurqedw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.303.0", - "@aws-sdk/fetch-http-handler": "3.303.0", - "@aws-sdk/hash-node": "3.303.0", - "@aws-sdk/invalid-dependency": "3.303.0", - "@aws-sdk/middleware-content-length": "3.303.0", - "@aws-sdk/middleware-endpoint": "3.303.0", - "@aws-sdk/middleware-host-header": "3.303.0", - "@aws-sdk/middleware-logger": "3.303.0", - "@aws-sdk/middleware-recursion-detection": "3.303.0", - "@aws-sdk/middleware-retry": "3.303.0", - "@aws-sdk/middleware-serde": "3.303.0", - "@aws-sdk/middleware-stack": "3.303.0", - "@aws-sdk/middleware-user-agent": "3.303.0", - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/node-http-handler": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/smithy-client": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/config-resolver": "3.306.0", + "@aws-sdk/fetch-http-handler": "3.306.0", + "@aws-sdk/hash-node": "3.306.0", + "@aws-sdk/invalid-dependency": "3.306.0", + "@aws-sdk/middleware-content-length": "3.306.0", + "@aws-sdk/middleware-endpoint": "3.306.0", + "@aws-sdk/middleware-host-header": "3.306.0", + "@aws-sdk/middleware-logger": "3.306.0", + "@aws-sdk/middleware-recursion-detection": "3.306.0", + "@aws-sdk/middleware-retry": "3.306.0", + "@aws-sdk/middleware-serde": "3.306.0", + "@aws-sdk/middleware-stack": "3.306.0", + "@aws-sdk/middleware-user-agent": "3.306.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/node-http-handler": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/smithy-client": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", "@aws-sdk/util-base64": "3.303.0", "@aws-sdk/util-body-length-browser": "3.303.0", "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.303.0", - "@aws-sdk/util-defaults-mode-node": "3.303.0", - "@aws-sdk/util-endpoints": "3.303.0", - "@aws-sdk/util-retry": "3.303.0", - "@aws-sdk/util-user-agent-browser": "3.303.0", - "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.306.0", + "@aws-sdk/util-defaults-mode-node": "3.306.0", + "@aws-sdk/util-endpoints": "3.306.0", + "@aws-sdk/util-retry": "3.306.0", + "@aws-sdk/util-user-agent-browser": "3.306.0", + "@aws-sdk/util-user-agent-node": "3.306.0", "@aws-sdk/util-utf8": "3.303.0", "tslib": "^2.5.0" }, @@ -251,44 +250,44 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.303.0.tgz", - "integrity": "sha512-oda7mOfGyJZe62DZ5BVH3L84yeDM0Ja/fSpTjwV9hqFqzgtW83TCpiNegcJmvmGWDYaPmE2qpfDPqPzymB0sBg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.306.0.tgz", + "integrity": "sha512-LivDrH0OnAZDC3EB6hVrrl25itlMLn/C/epwDjpnH2Qdq+gjbZ0ElVNu8XOX4qaXoo0zyV5pztnzwD/A76mX2g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.303.0", - "@aws-sdk/credential-provider-node": "3.303.0", - "@aws-sdk/fetch-http-handler": "3.303.0", - "@aws-sdk/hash-node": "3.303.0", - "@aws-sdk/invalid-dependency": "3.303.0", - "@aws-sdk/middleware-content-length": "3.303.0", - "@aws-sdk/middleware-endpoint": "3.303.0", - "@aws-sdk/middleware-host-header": "3.303.0", - "@aws-sdk/middleware-logger": "3.303.0", - "@aws-sdk/middleware-recursion-detection": "3.303.0", - "@aws-sdk/middleware-retry": "3.303.0", - "@aws-sdk/middleware-sdk-sts": "3.303.0", - "@aws-sdk/middleware-serde": "3.303.0", - "@aws-sdk/middleware-signing": "3.303.0", - "@aws-sdk/middleware-stack": "3.303.0", - "@aws-sdk/middleware-user-agent": "3.303.0", - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/node-http-handler": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/smithy-client": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/config-resolver": "3.306.0", + "@aws-sdk/credential-provider-node": "3.306.0", + "@aws-sdk/fetch-http-handler": "3.306.0", + "@aws-sdk/hash-node": "3.306.0", + "@aws-sdk/invalid-dependency": "3.306.0", + "@aws-sdk/middleware-content-length": "3.306.0", + "@aws-sdk/middleware-endpoint": "3.306.0", + "@aws-sdk/middleware-host-header": "3.306.0", + "@aws-sdk/middleware-logger": "3.306.0", + "@aws-sdk/middleware-recursion-detection": "3.306.0", + "@aws-sdk/middleware-retry": "3.306.0", + "@aws-sdk/middleware-sdk-sts": "3.306.0", + "@aws-sdk/middleware-serde": "3.306.0", + "@aws-sdk/middleware-signing": "3.306.0", + "@aws-sdk/middleware-stack": "3.306.0", + "@aws-sdk/middleware-user-agent": "3.306.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/node-http-handler": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/smithy-client": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", "@aws-sdk/util-base64": "3.303.0", "@aws-sdk/util-body-length-browser": "3.303.0", "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.303.0", - "@aws-sdk/util-defaults-mode-node": "3.303.0", - "@aws-sdk/util-endpoints": "3.303.0", - "@aws-sdk/util-retry": "3.303.0", - "@aws-sdk/util-user-agent-browser": "3.303.0", - "@aws-sdk/util-user-agent-node": "3.303.0", + "@aws-sdk/util-defaults-mode-browser": "3.306.0", + "@aws-sdk/util-defaults-mode-node": "3.306.0", + "@aws-sdk/util-endpoints": "3.306.0", + "@aws-sdk/util-retry": "3.306.0", + "@aws-sdk/util-user-agent-browser": "3.306.0", + "@aws-sdk/util-user-agent-node": "3.306.0", "@aws-sdk/util-utf8": "3.303.0", "fast-xml-parser": "4.1.2", "tslib": "^2.5.0" @@ -298,14 +297,14 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.303.0.tgz", - "integrity": "sha512-uGZ47jcH86AwWcjZjuOL5jK5qE4izrEol8oF7KY214kjmavbKQstyUqmcwL2lr/YpDNFkCYgUxWRpduqVm8zmw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.306.0.tgz", + "integrity": "sha512-kpqHu6LvNMYxullm+tLCsY6KQ2mZUxZTdyWJKTYLZCTxj4HcGJxf4Jxj9dwFAZVl/clcVPGWcHJaQJjyjwzBzw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "@aws-sdk/util-config-provider": "3.295.0", - "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/util-middleware": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -313,14 +312,14 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.303.0.tgz", - "integrity": "sha512-9MYsGJCNLsm61PW/JFm4y0Cv6aluCkZmE5D/g4vYnEFOZSKyK15m1a10RKGAh391fh6Bg1kU9WOoqkGk3Nyqng==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.306.0.tgz", + "integrity": "sha512-fjmTDTscMztA28YcmsFfrW95/yJ3Qn9kcNHsSv3iKHXb5qHAZRDANBKmymitpV3cRfkXhOhpgPqCoByjNi3I6w==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/client-cognito-identity": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -328,13 +327,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.303.0.tgz", - "integrity": "sha512-rtXumfF4cGrVk9fWACeLCfdpmlzlDUkzwSR60/3enC5Antcxl3fFY5T1BzNFvz0mB0zcwm4kaAwIcljX67DNRA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.306.0.tgz", + "integrity": "sha512-DTH+aMvMu+LAoWW+yfPkWzFXt/CPNFQ7+/4xiMnc7FWf+tjt+HZIrPECAV2rBVppNCkh7PC+xDSN61PFvBYOsw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -342,15 +341,15 @@ } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.303.0.tgz", - "integrity": "sha512-ruomcFkKUpJkZb87em698//A0AVpt1KN9dn8N8eVyOuvZzebVxSW4AJoVgOKd5Av4PVcZgEqRX0kOOVp0iTrWg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.306.0.tgz", + "integrity": "sha512-WdrNhq2MwvjZk2I8Of+bZ/qWHG2hREQpwlBiG3tMeEkuywx7M1x3Rt0eHgiR1sTcm05kxNn0rB4OeWOeek37cA==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -358,19 +357,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.303.0.tgz", - "integrity": "sha512-4J50F6fEjQmAstSQOpJFG+rnbEqtwA7nDG6PxNm98VSTH2mYJV0YgBdvydfBKrKINAT4xYZta5Sc4WEIpSo0TA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.306.0.tgz", + "integrity": "sha512-6VvP0YmXVd+pCnlD2iTDhNvO2Ikzyk9Ade/t5R1eZ4Vf1gKhDiNA2/AgDt9XlzQHk7iw1okTmYCeQsK1j+7+NQ==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.303.0", - "@aws-sdk/credential-provider-imds": "3.303.0", - "@aws-sdk/credential-provider-process": "3.303.0", - "@aws-sdk/credential-provider-sso": "3.303.0", - "@aws-sdk/credential-provider-web-identity": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/credential-provider-env": "3.306.0", + "@aws-sdk/credential-provider-imds": "3.306.0", + "@aws-sdk/credential-provider-process": "3.306.0", + "@aws-sdk/credential-provider-sso": "3.306.0", + "@aws-sdk/credential-provider-web-identity": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -378,20 +377,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.303.0.tgz", - "integrity": "sha512-OlKb7O2jDtrzkzLT/PUb5kxuGGTIyPn2alXzGT+7LdJ9/tP8KlqSVMtnH2UYPPdcc/daK16+MRNL5ylxmnRJ7Q==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.306.0.tgz", + "integrity": "sha512-HYuMmABRzbVWo03CElRUa+T+yenyUmLkwNCVAAvIRmbr9TnLT/bJbplXpUSzgSCS6T3TgwbQ9zf9xY9tX+gHzA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.303.0", - "@aws-sdk/credential-provider-imds": "3.303.0", - "@aws-sdk/credential-provider-ini": "3.303.0", - "@aws-sdk/credential-provider-process": "3.303.0", - "@aws-sdk/credential-provider-sso": "3.303.0", - "@aws-sdk/credential-provider-web-identity": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/credential-provider-env": "3.306.0", + "@aws-sdk/credential-provider-imds": "3.306.0", + "@aws-sdk/credential-provider-ini": "3.306.0", + "@aws-sdk/credential-provider-process": "3.306.0", + "@aws-sdk/credential-provider-sso": "3.306.0", + "@aws-sdk/credential-provider-web-identity": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -399,14 +398,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.303.0.tgz", - "integrity": "sha512-1pxDYRscGlERAjFE5hSF1KQdcyOGzssuRTdLvez4I/mSIOAJLMmBAnmHGI/DME2LzDVrC9dklA6LHSC2sn3quQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.306.0.tgz", + "integrity": "sha512-2RezGskHqJeHtGbK7CqhGNAoqXgQJb7FfPFqwUQ9oVDZS8f145jVwajjHcc7Qn3IwGoqylMF3uXIljUv89uDzA==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -414,16 +413,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.303.0.tgz", - "integrity": "sha512-/szzM1BzZGjHwV4mSiZo65cyDleJqnxM9Y4autg55mb3dFwcCiMGI6TGbdegumrNZZlCTeTA1lIhA9PdT4gDAQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.306.0.tgz", + "integrity": "sha512-6msBUisMdOzk0ywJQNunZIb0rVMaA6GTx7ek8aCuWInX+lJm0oEPPVp+b3ewwVheih1rRC2bgNk8eAjfC9YcKw==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/token-providers": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/client-sso": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/token-providers": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -431,13 +430,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.303.0.tgz", - "integrity": "sha512-qi5CP4ocseqdj3kMi0vgLx8XrdanLNvCAfgiEF6LjUJI88R2snZAYNUSd+Y2n04mKAalns+mUwfUN2JyL66d5g==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.306.0.tgz", + "integrity": "sha512-MOQGQaOtdo4zLQZ1bRjD2n1PUzfNty+sKe+1wlm5bIqTN93UX3S8f0QznucZr7uJxI4Z14ZLwuYeAUV4Tgchlw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -445,24 +444,24 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.303.0.tgz", - "integrity": "sha512-ueO8UKvYyzt2lexvIdg50TFC7EO2shRWbMWPsVi6Ul7euoQzthr/TPQts4OLZIt9XeIFd4s9dhFwYSobcRfVGw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.306.0.tgz", + "integrity": "sha512-QKICU6m3onOSuANJfElKFSAZYI4CqJY9X4gtsebPN8ueroT1LEMgd2GdGodyLgbVa2sxze39IfKNC5+gASk3Bg==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.303.0", - "@aws-sdk/client-sso": "3.303.0", - "@aws-sdk/client-sts": "3.303.0", - "@aws-sdk/credential-provider-cognito-identity": "3.303.0", - "@aws-sdk/credential-provider-env": "3.303.0", - "@aws-sdk/credential-provider-imds": "3.303.0", - "@aws-sdk/credential-provider-ini": "3.303.0", - "@aws-sdk/credential-provider-node": "3.303.0", - "@aws-sdk/credential-provider-process": "3.303.0", - "@aws-sdk/credential-provider-sso": "3.303.0", - "@aws-sdk/credential-provider-web-identity": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/client-cognito-identity": "3.306.0", + "@aws-sdk/client-sso": "3.306.0", + "@aws-sdk/client-sts": "3.306.0", + "@aws-sdk/credential-provider-cognito-identity": "3.306.0", + "@aws-sdk/credential-provider-env": "3.306.0", + "@aws-sdk/credential-provider-imds": "3.306.0", + "@aws-sdk/credential-provider-ini": "3.306.0", + "@aws-sdk/credential-provider-node": "3.306.0", + "@aws-sdk/credential-provider-process": "3.306.0", + "@aws-sdk/credential-provider-sso": "3.306.0", + "@aws-sdk/credential-provider-web-identity": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -470,25 +469,25 @@ } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.303.0.tgz", - "integrity": "sha512-Bc6C86/KQOSWPa741h9QEVcApyignYV5vC5+zZjmKkcyPxrVxTmL3kTJidpVOtVfCmTIrNN/WhAVDzLBbh1ycQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.306.0.tgz", + "integrity": "sha512-T8OODOnPpDqkXS+XSMIkd6hf90h833JLN93wq3ibbyD/WvGveufFFHsbsNyccE9+CSv/BjEuN5QbHqTKTp3BlA==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/querystring-builder": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/querystring-builder": "3.306.0", + "@aws-sdk/types": "3.306.0", "@aws-sdk/util-base64": "3.303.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.303.0.tgz", - "integrity": "sha512-jSo4A/JxTabZ9jHrx7nhKIXnOmvPg/SSYnoHaFdVS5URJrNt1w+nSvW1wLGMEMOvu5+NU3bldBBSb+h0Ocwv1A==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.306.0.tgz", + "integrity": "sha512-EcSLd6gKoDEEBPZqEv+Ky9gIyefwyyrAJGILGKoYBmcOIY7Y0xKId0hxCa9/1xvWTaVC1u+rA06DGgksZOa78w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "@aws-sdk/util-buffer-from": "3.303.0", "@aws-sdk/util-utf8": "3.303.0", "tslib": "^2.5.0" @@ -498,12 +497,12 @@ } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.303.0.tgz", - "integrity": "sha512-RXNcLxOrUJaMMqk5uIYEf6X9XCMockT27bS8Dde/0ms015VOo8Wn2hHU9wEmGeFvLccC2UU4gPzvmj74w70q2Q==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.306.0.tgz", + "integrity": "sha512-9Mkcr+qG7QR4R5bJcA8bBNd8E2x6WaZStsQ3QeFbdQr3V3Tunvra/KlCFsEL55GgU8BZt5isOaHqq7uxs5ILtQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" } }, @@ -520,13 +519,13 @@ } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.303.0.tgz", - "integrity": "sha512-0UL5TWSL1JRpjT6gjGsZXfia5oL7vxzj+CfMCqkP6gjVF69eRcgu426Xc6TJwDcr6jIFPeamDBTLyt9ZAAr6hg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.306.0.tgz", + "integrity": "sha512-JbONf2Ms+/DVRcpFNsKGdOQU94Js56KV+AhlPJmCwLxfyWvQjTt0KxFC1Dd+cjeNEXUduvBarrehgsqFlWnoHQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -534,15 +533,15 @@ } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.303.0.tgz", - "integrity": "sha512-z2i8LJ6YTKbqXh9rY/KbXihvhq6P0JVI6SnkwT2hesJp0Nfldx85jsaLzj1+ioNKlQ+51u9UmBnO404DgNCAbg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.306.0.tgz", + "integrity": "sha512-i3QRiwgkcsuVN55O7l8I/QGwCypGRZXdYkPjU56LI2w2oiZ82f/nVMNXVc+ZFm2YH7WbCE+5jguw2J7HXdOlyQ==", "optional": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/url-parser": "3.303.0", - "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/middleware-serde": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/url-parser": "3.306.0", + "@aws-sdk/util-middleware": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -550,13 +549,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.303.0.tgz", - "integrity": "sha512-LUyhtjbuosrD0QAsBZJwT3yp146I7Xjehf42OP3dWbRuklMEilI0Res5K2/nknf3/ZKUj6sf7BbJoU8E+SpRiQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.306.0.tgz", + "integrity": "sha512-mHDHK9E+c7HwMlrCJ+VFSB6tkq8oJVkYEHCvPkdrnzN/g9P/d/UhPIeGapZXMbAIZEaLpEGqs536mYzeRKZG8A==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -564,12 +563,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.303.0.tgz", - "integrity": "sha512-y2sqmmBdm4gXUL4SyN+ucfO/sxtOEDj2sB12ArRpDGyerfNLhAf7xpL4lXkjPx/7wTIjlBWoO2G/yK6t00P6fA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.306.0.tgz", + "integrity": "sha512-1FRHp/QB0Lb+CgP+c9CYW6BZh+q+5pnuOKo/Rd6hjYiM+kT1G/cWdXnMJQBR4rbTCTixbqCnObNJ1EyP/ofQhQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -577,13 +576,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.303.0.tgz", - "integrity": "sha512-z3MTsZMtPg6hYWl6a0o07q7zgsDXPYeP14XFVMc8NXqiAyNcm/OYwanpXyNjsEKI/X0nlpJ/Rs+IRCbaIqV9Mw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.306.0.tgz", + "integrity": "sha512-Hpj42ZLmwCy/CtVxi57NTeOEPoUJlivF3VIgowZ9JhaF61cakVKyrJ+f3jwXciDUtuYrdKm5Wf6prW6apWo0YA==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -591,16 +590,16 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.303.0.tgz", - "integrity": "sha512-wxlqrdGOrCm2Jsra7YyfLyO34YRB/FNlXzwuJiZkqoAb/40ZAuFcWqDv41SP44y8liFXqfsMGuywJ7mK2cHvnA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.306.0.tgz", + "integrity": "sha512-eMyfr/aeurXXDz4x+WVrvLI8fVDP6klJOjziBEWZ/MUNP/hTFhkiQsMVbvT6O4Pspp7+FgCSdcUPG6Os2gK+CQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/service-error-classification": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/util-middleware": "3.303.0", - "@aws-sdk/util-retry": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/service-error-classification": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/util-middleware": "3.306.0", + "@aws-sdk/util-retry": "3.306.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -609,13 +608,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.303.0.tgz", - "integrity": "sha512-igp7htNCUPhVL9Q6rJSgcx3qy/P2l2KAiS0oozOTaTXt3h0LbOusSXtwyA7qvLYeRthnw6msVW+rVBAW3Vo+3g==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.306.0.tgz", + "integrity": "sha512-2rSAR3nc5faYuEnh1KxQMCMCkEkJyaDfA3zwWLqZ+/TBCH0PlPkBv+Z9yXmteEki0vI5Hr+e+atTutJZoyG13g==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/middleware-signing": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -623,12 +622,12 @@ } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.303.0.tgz", - "integrity": "sha512-mmZozwYKgUgXkJrLVqgIYoOQ8DfKZS3pBBT3ZxWzv5Hz5M3oRqFgfVYljkeDM2CTvBweHpqVRTWqPDMcZisucg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.306.0.tgz", + "integrity": "sha512-M3gyPLPduZXMvdgt4XEpVO+3t0ZVPdgeQQwG6JnXv0dgyUizshYs4lrVOAb1KwF6StsmkrAgSN+I273elLiKjA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -636,16 +635,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.303.0.tgz", - "integrity": "sha512-rrLQcS2wFsUGj9Kyx78LRgRS8jwiixz/Nyv06SmcKhP680sweETpQz/EA+wcVEVRXmUI6vs4NtqXz36dU0X8Nw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.306.0.tgz", + "integrity": "sha512-JhpSriN4xa4a/p5gAPL0OWFKJF4eWYU3K+LLlXBNGMbxg/qNL4skgT4dMFe3ii9EW8kI+r6tpvSgC+lP7/Tyng==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/signature-v4": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/signature-v4": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/util-middleware": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -653,9 +652,9 @@ } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.303.0.tgz", - "integrity": "sha512-6KmdroXLexzILGxF/Xq0cGBs+B8Ipm1pff8qnWCT6KldYp+Q40bVcJrExkVHDN1uOsOxu20ixW2yujOKS356zg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.306.0.tgz", + "integrity": "sha512-G//a6MVSxyFVpOMZ+dzT3+w7XblOd2tRJ5g+/okjn3pNBLbo5o9Hu33K/bz0SQjT/m5mU2F9m0wcdCPYbRPysg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -665,14 +664,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.303.0.tgz", - "integrity": "sha512-ZVMVNxPRn2jXog3V4xWokSYoQxTKAdKlNoCfjqFplsF70r8sXfgZtOMF5ZhGo+Hgsx7GqpR/NWPKJtZD2nigpg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.306.0.tgz", + "integrity": "sha512-tP6I+Lbs68muPfdMA6Rfc+8fYo49nEn9A3RMiOU2COClWsmiZatpbK9UYlqIOxeGB/s2jI7hXmQq6tT2LStLSg==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/types": "3.303.0", - "@aws-sdk/util-endpoints": "3.303.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/types": "3.306.0", + "@aws-sdk/util-endpoints": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -680,14 +679,14 @@ } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.303.0.tgz", - "integrity": "sha512-Ywbo9+2SkbdmNgCoxYJrv+YrFDtBH7hHtn2ywtzP4t57d4t0V/LNrNQsrAsXxqy48OS5r2ovOLHiqJS5jp1oyw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.306.0.tgz", + "integrity": "sha512-+m+ALxNx5E1zLPPijO1pAbT5tnofLzZFWlnSYBEiOIwzaRU44rLYDqAhgXJkMMbOECkffDrv6ym0oWJIwJI+DA==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -695,15 +694,15 @@ } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.303.0.tgz", - "integrity": "sha512-5Te+mwBIOiQr2nM7/SNVFkvYHOH/CswOmUMV4Gxc7YjuervhrYvVFs2P+lL+c8rfiVMTLWjnJ6JiL2JdJfYgnQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.306.0.tgz", + "integrity": "sha512-qvNSIVdGf0pnWEXsAulIqXk7LML25Zc1yxbujxoAj8oX5y+mDhzQdHKrMgc0FuI4RKoEd9px4DYoUbmTWrrxwA==", "optional": true, "dependencies": { - "@aws-sdk/abort-controller": "3.303.0", - "@aws-sdk/protocol-http": "3.303.0", - "@aws-sdk/querystring-builder": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/abort-controller": "3.306.0", + "@aws-sdk/protocol-http": "3.306.0", + "@aws-sdk/querystring-builder": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -711,12 +710,12 @@ } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.303.0.tgz", - "integrity": "sha512-d1qbn0pCz+jvB0dcWMWuIlWYM8dWCg3185ngMgUQxkgUk7/kEbwGBsmT+xtZAMQcwcgPkSm8qeATEQ7ToiH8eQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.306.0.tgz", + "integrity": "sha512-37PnbjpANjHys0Y+DVmKUz1JbSGZ/mAndZeplTUsFDUtbNwJRw/fDyWUvGC82JWB4gNSP5muWscFvetZnK2l8A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -724,12 +723,12 @@ } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.303.0.tgz", - "integrity": "sha512-eqblSsdmKBzgNl06dUnL4toq/OQgZyxVsxHCz2nI/xBk5lI/qAZIJyEgP2GmP8aoWwneAq33roG0VLZoxQ8exg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.306.0.tgz", + "integrity": "sha512-6Z8bqB8Ydz/qG7+lJzjwsjIca2w2zp4nZ2HjxMoUm0NBbVXGDx7H9qy9eOUqEiCbdXbsfK2BmVQreLhFLt056Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -737,12 +736,12 @@ } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.303.0.tgz", - "integrity": "sha512-0eMp2gd7Ro0svJ6YVnp9cUiGtrc1d/HynyMfbDkLkqWJAnHMz7Oc1GjK5YyL1hdxm0W+JWZCPR0SovLiaboKDw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.306.0.tgz", + "integrity": "sha512-kvz6fLwE4KojTxbphuo9JPwKKuhau2mmSurnqhtf77t9+0cOh2uzyYhIUtOFewpLj+qGoh4b2EODlJqczc7IKg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "@aws-sdk/util-uri-escape": "3.303.0", "tslib": "^2.5.0" }, @@ -751,12 +750,12 @@ } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.303.0.tgz", - "integrity": "sha512-KNJSQiTFiA7W5eYCox8bLGM7kghC3Azad86HQhdsYO0jCoPxcgj8MeP6T7fPTIC4WcTwcWb7T1MpzoeBiKMOTQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.306.0.tgz", + "integrity": "sha512-YjOdLcyS/8sNkFPgnxyUx+cM/P2XFGCA2WjQ0e9AXX8xFFkmnY6U5w2EknQ5zyvKy+R/KAV0KAMJBUB+ofjg0A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -764,21 +763,21 @@ } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.303.0.tgz", - "integrity": "sha512-eO13PzdtRO9C+g3tyFOpIblX2SbDrIbg2bNtB8JOfjVi3E1b5VsSTXXU/cKV+lbZ9XMzMn3VzGSvpo6AjzfpxA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.306.0.tgz", + "integrity": "sha512-lmXIVHWU5J60GmmTgyj79kupWYg5ntyNrUPt1P9FYTsXz+tdk4YYH7/2IxZ1XjBr4jEsN56gfSI0cfT07ztQJA==", "optional": true, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.303.0.tgz", - "integrity": "sha512-yI84mnnh3pdQtIOo+oGWofaI0rvfhp3DOavB8KHIkQr+RcjF+fxsqbelRfVb25gx7yEWPNCMB8wM+HhklSEFJg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.306.0.tgz", + "integrity": "sha512-mDmBRN+Y0+EBD5megId97UIJGV/rmRsAds22qy0mmVdD3X7qlxn974btXVgfZyda6qw/pX6hgi8X99Qj6Wjb0w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -786,15 +785,15 @@ } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.303.0.tgz", - "integrity": "sha512-muw5yclLOgXPHIxv60mhO6R0GVjKbf+M6E/cWvIEVGq8Ke+mLMYNFYNdKP/f/8JgTtW2xwQ7pIK3U8x284ZqPw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.306.0.tgz", + "integrity": "sha512-yoQTo6wLirKHg34Zhm8tKmfEaK8fOn+psVdMtRs2vGq3uzKLb+YW5zywnujoVwBvygQTWxiDMwRxDduWAisccA==", "optional": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "@aws-sdk/util-hex-encoding": "3.295.0", - "@aws-sdk/util-middleware": "3.303.0", + "@aws-sdk/util-middleware": "3.306.0", "@aws-sdk/util-uri-escape": "3.303.0", "@aws-sdk/util-utf8": "3.303.0", "tslib": "^2.5.0" @@ -804,13 +803,13 @@ } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.303.0.tgz", - "integrity": "sha512-WDTC9ODdpRAXo8+Mtr5hsPJeR3y3LxfZZFg5dplJgkaxV+MFdnsUCxZfAZMnxcGy5Q2qTzlLLNk9CpadS72v+g==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.306.0.tgz", + "integrity": "sha512-AFdNkto0Md6laio9t70WtvocoZqVcAydbY5csimXQh+lhKVmy/C+ZcKarDvaa0JD6PjSHb4snYzcINFpHW5LJQ==", "optional": true, "dependencies": { - "@aws-sdk/middleware-stack": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/middleware-stack": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -818,15 +817,15 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.303.0.tgz", - "integrity": "sha512-7G7VYbqyX0v6RTD/m7XmArZToMek4jYXR/TuuGHK6ifNJeMDwkU4BcoVDj37vvTPYp6qKU5IE+bE3XmPyVWnGQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.306.0.tgz", + "integrity": "sha512-GQlUx9u+fHLjOJedudLM//j7RSZAip57n59bjn/I3TRVjDs065opNu2xSWMPm1n46kPx6VA5z+DktvuFeAblxQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/shared-ini-file-loader": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/client-sso-oidc": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/shared-ini-file-loader": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -834,9 +833,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.303.0.tgz", - "integrity": "sha512-H+Cy8JDTsK87MID6MJbV9ad5xdS9YvaLZSeveC2Zs1WNu2Rp6X9j+mg3EqDSmBKUQVAFRy2b+CSKkH3nnBMedw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.306.0.tgz", + "integrity": "sha512-RnyknWWpQcRmNH7AsNr89sdhOoltCU/4YEwBMw34Eh+/36l7HfA5PdEKbsOkO7MO4+2g5qmmm/AHcnHRvymApg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -846,13 +845,13 @@ } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.303.0.tgz", - "integrity": "sha512-PXMXGhr89s0MiPTf8Ft/v3sPzh2geSrFhTVSO/01blfBQqtuu0JMqORhLheOdi16AhQNVlYHDW2tWdx7/T+KsA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.306.0.tgz", + "integrity": "sha512-mhyOjtycZgxKYo2CoDhDQONuRd5TLfEwmyGWVgFrfubF0LejQ3rkBRLC5zT9TBZ8RJHNlqU2oGdsZCy3JV6Rlw==", "optional": true, "dependencies": { - "@aws-sdk/querystring-parser": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/querystring-parser": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" } }, @@ -916,13 +915,13 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.303.0.tgz", - "integrity": "sha512-jtZgCKelFe4/SHDHQu9ydbYttxSfqSlQojA5qxTJxLvzryIB+/GTHQ+sYWyMyzaD489W9elt1/cSsXd4LtPK0A==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.306.0.tgz", + "integrity": "sha512-XczPC/klGngMNDcNvThloyeKoPoG61ts1tZVcDbyRaOqmoMH80fn+c6Ah4A/BPzbo8wm1MIA9kqeJI0ypps6qQ==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -931,16 +930,16 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.303.0.tgz", - "integrity": "sha512-c86iyot/u9bCVcy/rlWL+0kdR51c7C2d2yDXvO9iFCdMKAs28Hw1ijGczVmOcUQ61zKNFSGYx+VekHXN9IWYOg==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.306.0.tgz", + "integrity": "sha512-0hs/cS7Pu4sEO78n0Uv7ybBEFq5j23TOu3QNH+YMzF8n4yuQtaMwNM8DI2s03/pVGXYsPzO7036jREGcu+enXw==", "optional": true, "dependencies": { - "@aws-sdk/config-resolver": "3.303.0", - "@aws-sdk/credential-provider-imds": "3.303.0", - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/property-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/config-resolver": "3.306.0", + "@aws-sdk/credential-provider-imds": "3.306.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/property-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -948,12 +947,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.303.0.tgz", - "integrity": "sha512-dPg9+l3VY3nclWFiWAVNWek5lQwgdtY8oRYOgCeyntce9FlNrPQgCRTVr36D0iQ0aNCs0GWzfjgL+rIdCF66/w==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.306.0.tgz", + "integrity": "sha512-aPTqU4VGhec8LDhKZrfA3/sBHTYRa0favKEo8aEa/vIZJTNBAFlUhvr5z7peAr8gBOtZZcElzX8PiK3jjn3ILw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -985,9 +984,9 @@ } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.303.0.tgz", - "integrity": "sha512-HAfBcbZw1+pY3dIEDM4jVpH1ViFcGH5s0q1dr+x4rcLGpMM3B4dH0HUgDPtycG8sw+nk+9jGgiEtgaCNOpJLGA==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.306.0.tgz", + "integrity": "sha512-14CSm1mTrfSNBGbkZu8vSjXYg7DUMfZc74IinOajcFtTswa/6SyiyhU9DK0a837qqwxSfFGpnE2thVeJIF/7FA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -997,12 +996,12 @@ } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.303.0.tgz", - "integrity": "sha512-RWwRNjoWMcpDouz69wPuFXWFVzwYtUkTbJfa46SjKl1IwqMHS4f9yjJfCwJIoLOW9M/o2JB7nD0Ij3gqqzajLw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.306.0.tgz", + "integrity": "sha512-zcgTEIehQAIAm4vBNWfXZpDNbIrDM095vZmpbozQwK/pfDqMGvq7j3r9atKuEGTtoomoGoYwj3x/KEhO6JXJLg==", "optional": true, "dependencies": { - "@aws-sdk/service-error-classification": "3.303.0", + "@aws-sdk/service-error-classification": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -1022,24 +1021,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.303.0.tgz", - "integrity": "sha512-Kex3abpUrTX9z129jiI8sfjIUmQDwiWjhkvBkPmrwjFY/sZcnOcXj5nP2iwJ+k6CnA5ZK5PjZ6P62t+eJ5MTXw==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.306.0.tgz", + "integrity": "sha512-uZAtpvCasUdWRlB/nEjN0gf6G7810hT50VyWjpd6mQW78myV8M5fu/R03UFAZ+D8fhqqIdzR/IXDY1QUGp8bCA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.303.0", + "@aws-sdk/types": "3.306.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.303.0.tgz", - "integrity": "sha512-QYUg8F/Ho6AsVZaSSRMf/LWoEPDyOwgKZBw3AbKoH6RxAdAsdL1SXz5t4A6jHakP9TLVN2Yw2WRbHDe4LATASQ==", + "version": "3.306.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.306.0.tgz", + "integrity": "sha512-zLp9wIx7FZ0qFLimYW3lJ1uJM5gqxmmcQjNimUaUq/4a1caDkaiF/QeyyMFva+wIjyHRv22P5abUBjIEZrs5WA==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.303.0", - "@aws-sdk/types": "3.303.0", + "@aws-sdk/node-config-provider": "3.306.0", + "@aws-sdk/types": "3.306.0", "tslib": "^2.5.0" }, "engines": { @@ -1076,25 +1075,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -1114,11 +1094,6 @@ "@types/webidl-conversions": "*" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1131,63 +1106,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1208,11 +1126,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1232,19 +1145,6 @@ } ] }, - "node_modules/bcrypt": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", - "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.10", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -1282,15 +1182,6 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "optional": true }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/bson": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", @@ -1345,22 +1236,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1400,16 +1275,6 @@ "node": ">= 0.8.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1477,11 +1342,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1499,24 +1359,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1679,57 +1526,11 @@ "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -1743,25 +1544,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1784,11 +1566,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1804,39 +1581,6 @@ "node": ">= 0.8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1867,15 +1611,6 @@ } ] }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1894,14 +1629,6 @@ "node": ">= 0.10" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, "node_modules/ldbs-json": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ldbs-json/-/ldbs-json-1.2.1.tgz", @@ -1914,39 +1641,6 @@ "node": ">=7.6" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2004,65 +1698,12 @@ "node": ">= 0.6" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mongodb": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", - "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.15.0.tgz", + "integrity": "sha512-1iM2fF2fSNVrecOq4pW9zaJHFNuk63RX3SsppIjC2df8JkBv6odGOIu9FuqnI6gQD0KAF2az4zZdQdabqGSLDQ==", "dependencies": { - "bson": "^4.7.0", + "bson": "^4.7.2", "mongodb-connection-string-url": "^2.5.4", "socks": "^2.7.1" }, @@ -2096,11 +1737,6 @@ "node": ">= 0.6" } }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, "node_modules/node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -2147,39 +1783,6 @@ "node": ">=6.0.0" } }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2207,14 +1810,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2223,14 +1818,6 @@ "node": ">= 0.8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -2305,33 +1892,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2359,20 +1919,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -2415,11 +1961,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2438,11 +1979,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -2482,84 +2018,17 @@ "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-sanitizer-fix": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string-sanitizer-fix/-/string-sanitizer-fix-2.0.1.tgz", "integrity": "sha512-I5RSqL5vDfKnoAbpFP2mU0QAh7Gc1KoeIg02N+5+NBfDB/MiSddgNNXfmWND7+BBwy3zub6s/ZWRbZICZKUA0g==" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "optional": true }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2605,11 +2074,6 @@ "node": ">= 0.8" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2655,19 +2119,6 @@ "node": ">=12" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -2687,11 +2138,6 @@ "engines": { "node": ">=4.0" } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index 38921f5..fb6934b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "dependencies": { "axios": "^1.2.1", - "bcrypt": "^5.1.0", "compression": "^1.7.4", "express": "^4.18.2", "ldbs-json": "^1.2.1", -- 2.34.1 From fd454029dcf19365af111ed97009231962ef198e Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:20:09 +0100 Subject: [PATCH 17/95] Fix module.exports order Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 6fdd698..6e06605 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,5 +1,3 @@ -module.exports = valid - const valid = [ "owlboard.info", "fjla.uk", @@ -7,4 +5,6 @@ const valid = [ "swrailway.com", "firstrail.com", "networkrail.co.uk" -] \ No newline at end of file +] + +module.exports = valid \ No newline at end of file -- 2.34.1 From e982e3ad10dbb49cd2551bd3a74008f794a50dd1 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:20:59 +0100 Subject: [PATCH 18/95] Remove fjla.uk from valid domains Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 6e06605..659ec56 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,6 +1,5 @@ const valid = [ "owlboard.info", - "fjla.uk", "gwr.com", "swrailway.com", "firstrail.com", -- 2.34.1 From b69e34e2b552ba20fd6aa1fc55bdecd2c84ac475 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 4 Apr 2023 22:22:05 +0100 Subject: [PATCH 19/95] More comments Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 2 ++ src/services/auth.services.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 659ec56..0b93a75 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -6,4 +6,6 @@ const valid = [ "networkrail.co.uk" ] +// Use Network Rail Control contact book to add domains + module.exports = valid \ No newline at end of file diff --git a/src/services/auth.services.js b/src/services/auth.services.js index 6b7c3d6..b2dc8d0 100644 --- a/src/services/auth.services.js +++ b/src/services/auth.services.js @@ -7,7 +7,7 @@ const domList= require('../configs/domains.configs') async function createRegKey(eml){ const domain = clean.splitDomain(eml) - if (domain in domList.valid) { + if (domain in domList.valid) { // Don't know if this is correct const uuid = util.generateKey(); db.addRegReq(await uuid, await domain) mail.sendRegister("mail", "uuid"); -- 2.34.1 From 1064db3d2fd6fafa538699ac37784b360ca1652d Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 00:58:48 +0100 Subject: [PATCH 20/95] Add authentication middleware Signed-off-by: Fred Boniface --- app.js | 10 ++++++++-- src/middlewares/auth.middlewares.js | 25 +++++++++++++++++++++++++ src/utils/auth.utils.js | 12 ++++++++---- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 src/middlewares/auth.middlewares.js diff --git a/app.js b/app.js index ab77945..789962e 100644 --- a/app.js +++ b/app.js @@ -9,7 +9,10 @@ console.log(`Initialising OwlBoard`) // External Requires const express = require('express'); const app = express(); + +// Middleware const compression = require('compression') +const authenticate= require('./src/middlewares/auth.middlewares') // Internal Requires const log = require('./src/utils/log.utils'); // Log Helper @@ -46,11 +49,11 @@ app.use((err, req, res, next) => { return; }); -// Express Submodules: +// Middleware: app.use(express.json()); //JSON Parsing for POST Requests app.use(compression()) // Compress API Data if supported by client -// Express Routes +// Unauthenticated Routes app.use('/api/v1/list', listRtr); app.use('/api/v1/ldb', ldbRtr); app.use('/api/v1/kube', kubeRtr); @@ -58,6 +61,9 @@ app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); app.use('/api/v1/stats', statRtr) +// Authented Routes +app.use('/api/v1/ldbs', authenticate) + // Start Express app.listen(srvPort, srvListen, (error) =>{ if(!error) { diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js new file mode 100644 index 0000000..c740895 --- /dev/null +++ b/src/middlewares/auth.middlewares.js @@ -0,0 +1,25 @@ +const utils = require('../utils/auth.utils') +const log = require('../utils/log.utils') + +module.exports = async function authCheck(req, res, next) { + log.out(`authMiddlewares: Checking authentication`, "INFO") + try { + var uuid = req.headers.uuid + } catch(err) { + log.out(`authMiddlewares: No authentication attempted`, "INFO") + err.status = 401 + return next(err) + } + try { + var result = await utils.isAuthed(uuid) | false + if (!result) { + const err = new Error("Unauthorised"); + err.status = 401 + return next(err) + } else { + return next() + } + } catch(err) { + return next(err) + } +} \ No newline at end of file diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index fdaf571..72e3145 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -3,11 +3,15 @@ const crypto = require('crypto') const db = require('../services/dbAccess.services') // Checks users registration key against issued keys -async function checkUser(key) { // Needs testing +async function isAuthed(key) { // Needs testing + return false; q = {uuid: key}; res = db.query("registrations", q); log.out(`authUtils.checkUser: DB Query answer: ${await res}`) - return await res + + // Do something here to determine if authorised or not and simply return a BOOL + + return } // Creates an API key for a user @@ -15,7 +19,7 @@ async function generateKey() { // Needs testing return crypto.randomUUID() }; -module.export = { - checkUser, +module.exports = { + isAuthed, generateKey } \ No newline at end of file -- 2.34.1 From dd96e95ce5fb66ab4c14f3ef7210d7a210106dfd Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 01:08:14 +0100 Subject: [PATCH 21/95] Add better error codes Signed-off-by: Fred Boniface --- UpNext.md | 3 ++- src/controllers/kube.controllers.js | 1 + src/controllers/ldb.controllers.js | 1 + src/controllers/list.controllers.js | 3 +++ src/controllers/stats.controllers.js | 4 +++- src/routes/ldbs.routes.js | 19 +++++++++++++++++++ 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/routes/ldbs.routes.js diff --git a/UpNext.md b/UpNext.md index 959ad6b..c7a1fe3 100644 --- a/UpNext.md +++ b/UpNext.md @@ -1,3 +1,4 @@ # What to do next: -* Rewrite sanitizing functions to remove external dependancy. \ No newline at end of file +* Rewrite sanitizing functions to remove external dependancy. +* Change /api/v1/auth endpoints to /api/v1/register endpoints - auth is done in middleware \ No newline at end of file diff --git a/src/controllers/kube.controllers.js b/src/controllers/kube.controllers.js index 2253aef..6d983cb 100644 --- a/src/controllers/kube.controllers.js +++ b/src/controllers/kube.controllers.js @@ -23,6 +23,7 @@ async function getTime(req, res, next){ res.json(await kube.getTime(req.body)) } catch (err) { console.error(`Unknown Error`, err.message); + err.status = 503 next(err); } } diff --git a/src/controllers/ldb.controllers.js b/src/controllers/ldb.controllers.js index 2c6917e..0261c67 100644 --- a/src/controllers/ldb.controllers.js +++ b/src/controllers/ldb.controllers.js @@ -6,6 +6,7 @@ async function get(req, res, next){ res.json(await ldb.get(req.body, id)) } catch (err) { console.error(`Unknown Error`, err.message); + err.status = 500 next(err); } } diff --git a/src/controllers/list.controllers.js b/src/controllers/list.controllers.js index 63fd1c4..1a59b3b 100644 --- a/src/controllers/list.controllers.js +++ b/src/controllers/list.controllers.js @@ -5,6 +5,7 @@ async function getStations(req, res, next){ res.json(await list.getStations(req.body)) } catch (err) { console.error(`Controller Error`, err.message); + err.status = 500 next(err); } } @@ -14,6 +15,7 @@ async function getCorpus(req, res, next){ res.json(await list.getCorpus(req.body)) } catch (err) { console.error(`Controller Error`, err.message); + err.status = 500 next(err); } } @@ -23,6 +25,7 @@ async function hits(req, res, next) { res.json(await list.hits()) } catch (err) { console.error(`Controller Error`, err); + err.status = 500 next(err); } } diff --git a/src/controllers/stats.controllers.js b/src/controllers/stats.controllers.js index f42e0f6..daabff5 100644 --- a/src/controllers/stats.controllers.js +++ b/src/controllers/stats.controllers.js @@ -5,9 +5,11 @@ async function get(req, res, next) { res.json(await stat.hits()) } catch (err) { console.error(`Controller Error`, err); + err.status = 500 next(err); } } module.exports = { - get} \ No newline at end of file + get +} \ No newline at end of file diff --git a/src/routes/ldbs.routes.js b/src/routes/ldbs.routes.js new file mode 100644 index 0000000..591bd45 --- /dev/null +++ b/src/routes/ldbs.routes.js @@ -0,0 +1,19 @@ +const express = require('express'); +const router = express.Router(); +const ldbController = require('../controllers/ldb.controllers'); + +/* GET programming languages. */ +//router.get('/', programmingLanguagesController.get); + +/* POST programming language */ +//router.post('/', programmingLanguagesController.create); + +/* PUT programming language */ +//router.put('/:id', programmingLanguagesController.update); + +/* DELETE programming language */ +//router.delete('/:id', programmingLanguagesController.remove); + +router.get('/:id', ldbController.get); + +module.exports = router; \ No newline at end of file -- 2.34.1 From 7d0b9f9d446a170cabe0291788bed376c245860e Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 01:09:50 +0100 Subject: [PATCH 22/95] Add comments Signed-off-by: Fred Boniface --- src/services/auth.services.js | 2 +- src/utils/auth.utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/auth.services.js b/src/services/auth.services.js index b2dc8d0..20054ad 100644 --- a/src/services/auth.services.js +++ b/src/services/auth.services.js @@ -5,7 +5,7 @@ const mail = require('../services/mail.services') const clean = require('../utils/sanitizer.utils') const domList= require('../configs/domains.configs') -async function createRegKey(eml){ +async function createRegKey(eml){ // Needs moving to register.services const domain = clean.splitDomain(eml) if (domain in domList.valid) { // Don't know if this is correct const uuid = util.generateKey(); diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index 72e3145..37a0d14 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -15,7 +15,7 @@ async function isAuthed(key) { // Needs testing } // Creates an API key for a user -async function generateKey() { // Needs testing +async function generateKey() { // Needs testing & moving to 'register.utils' return crypto.randomUUID() }; -- 2.34.1 From f512f7db3f3e50bc91a2d9fce9761765ac812fb7 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 11:27:01 +0100 Subject: [PATCH 23/95] Refactoring mail code Signed-off-by: Fred Boniface --- src/services/kube.services.js | 6 +- src/services/mail.services.js | 65 ++++--------------- ...{auth.services.js => register.services.js} | 23 +++++-- src/utils/auth.utils.js | 24 ++++++- 4 files changed, 56 insertions(+), 62 deletions(-) rename src/services/{auth.services.js => register.services.js} (52%) diff --git a/src/services/kube.services.js b/src/services/kube.services.js index f065f76..ec2c2f9 100644 --- a/src/services/kube.services.js +++ b/src/services/kube.services.js @@ -8,7 +8,11 @@ async function getAlive(){ async function getReady(){ log.out(`kubeServices.getReady: ready hook checked`, "info") - testing.sendTest("fred@fjla.uk"); + testing.send({ + to: "fred@fjla.uk", + subject: "OwlBoard Test", + txt: "This is a test message from OwlBoard (testing)" + }); return "not_implemented"; }; diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 1d2e436..e3fa3f6 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,8 +1,7 @@ const log = require('../utils/log.utils') -const fs = require('fs/promises') const mail = require('nodemailer'); //>> Probs wrong -const fromAdrr = process.env.OWL_EML_FROM +const fromAddr = process.env.OWL_EML_FROM const smtpUser = process.env.OWL_EML_USER const smtpPass = process.env.OWL_EML_PASS const smtpHost = process.env.OWL_EML_HOST @@ -18,57 +17,19 @@ let transporter = mail.createTransport({ } }) -async function sendTest(to, cc, bcc) { - log.out(`mailServices.sendTest: Sending test message to: ${to}`, "info") - let tHtml = fs.readFile('mail-templates/register.html', 'utf-8'); - let tTxt = fs.readFile('mail-templates/register.txt', 'utf-8'); - // Send test mail message - try { - var res = await transporter.sendMail({ - from: fromAdrr, - to: to, - cc: cc, - bcc: bcc, - subject: "Test Message from OwlBoard", - text: (await tTxt).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE<>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Wed, 5 Apr 2023 12:40:58 +0100 Subject: [PATCH 24/95] Adjust mail.send function Signed-off-by: Fred Boniface --- src/services/register.services.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/services/register.services.js b/src/services/register.services.js index 7144b13..456b218 100644 --- a/src/services/register.services.js +++ b/src/services/register.services.js @@ -15,17 +15,11 @@ async function createRegKey(eml){ if (await message == false) { // This error should be handled in the upstream function const err = new Error("Message generation error"); log.out(`registerServices.createRegKey: Error generating registration email`, "err") - return 500 + return 500; } - try { // Send the email - await mail.send(message); - } catch(err){ // HTTP 500 if sen failed - return 500 - } - return 201 // These returns still need handling - } else { - return 401 // As above + return await mail.send(message); } + return 401; } async function regUser(req) { -- 2.34.1 From c4b1816c309b978797d85f17a1e5132a2635093b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 13:59:35 +0100 Subject: [PATCH 25/95] Adjust registration email template Signed-off-by: Fred Boniface --- mail-templates/register.html | 2 +- mail-templates/register.txt | 4 +++- mail-templates/test.html | 28 ---------------------------- mail-templates/test.txt | 7 ------- 4 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 mail-templates/test.html delete mode 100644 mail-templates/test.txt diff --git a/mail-templates/register.html b/mail-templates/register.html index 9200063..591372f 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -33,7 +33,7 @@ same email address for other devices and access OwlBoard from both.

If you did not request to sign up to OwlBoard (Staff Version), you can - safely ignore this email. + safely ignore this email. The link will expire after 30 minutes.

diff --git a/mail-templates/register.txt b/mail-templates/register.txt index 41e1e2c..099f009 100644 --- a/mail-templates/register.txt +++ b/mail-templates/register.txt @@ -2,4 +2,6 @@ Complete your OwlBoard (Staff) Registration using the link below. https://owlboard.info/ref/auth.html?>>ACCESSCODE<< -Alternatively you can copy and paste the above link. \ No newline at end of file +Alternatively you can copy and paste the above link. + +The link will expire after 30 minutes. \ No newline at end of file diff --git a/mail-templates/test.html b/mail-templates/test.html deleted file mode 100644 index 0473daa..0000000 --- a/mail-templates/test.html +++ /dev/null @@ -1,28 +0,0 @@ - - - OwlBoard - Register - - - - - - - - - - -
- -
-

Testing OwlBoard

-

This is a test message from OwlBoard (Testing version)

- Not a Link -
-

There is nothing important here

-
- - \ No newline at end of file diff --git a/mail-templates/test.txt b/mail-templates/test.txt deleted file mode 100644 index 9d5d6be..0000000 --- a/mail-templates/test.txt +++ /dev/null @@ -1,7 +0,0 @@ -OwlBoard - -This is a test message from OwlBoard - -It can safely be disregarded, apologies if it has reached you by mistake - -OwlBoard does not store any email addresses so any mistake has been caused by manual entry. \ No newline at end of file -- 2.34.1 From c8e19414d1b096aafa1b7e6197f1b09bcc14022f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 14:05:04 +0100 Subject: [PATCH 26/95] Fix registration functions Signed-off-by: Fred Boniface --- src/services/register.services.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/services/register.services.js b/src/services/register.services.js index 456b218..d135c32 100644 --- a/src/services/register.services.js +++ b/src/services/register.services.js @@ -1,16 +1,16 @@ -const log = require('../utils/log.utils') // Currently no logging on this page -const auth = require('../utils/auth.utils') -const db = require('./dbAccess.services') -const mail = require('./mail.services') -const clean = require('../utils/sanitizer.utils') -const domList= require('../configs/domains.configs') +const log = require('../utils/log.utils') // Currently no logging on this page +const auth = require('../utils/auth.utils') +const db = require('./dbAccess.services') +const mail = require('./mail.services') +const clean = require('../utils/sanitizer.utils') +const domList = require('../configs/domains.configs') async function createRegKey(eml){ - const domain = clean.splitDomain(eml) + const domain = await clean.splitDomain(eml) log.out(`registerServices: New registration request from domain: ${domain}`, "info") - if (domain in domList.valid) { // Don't know if this is correct + if (domList.valid.includes(domain)) { // Needs testing const uuid = auth.generateKey(); - db.addRegReq(await uuid, await domain) + db.addRegReq(await uuid, domain) const message = auth.generateConfirmationEmail(eml, uuid) if (await message == false) { // This error should be handled in the upstream function const err = new Error("Message generation error"); -- 2.34.1 From f9a6a467990c956ba97b68a11fe71e2c43d14b26 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 14:05:46 +0100 Subject: [PATCH 27/95] Remove redundant comments Signed-off-by: Fred Boniface --- src/services/register.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/register.services.js b/src/services/register.services.js index d135c32..b60d9a8 100644 --- a/src/services/register.services.js +++ b/src/services/register.services.js @@ -1,4 +1,4 @@ -const log = require('../utils/log.utils') // Currently no logging on this page +const log = require('../utils/log.utils') const auth = require('../utils/auth.utils') const db = require('./dbAccess.services') const mail = require('./mail.services') -- 2.34.1 From 853d3bfec8078d20ab1d3a6fce3c3c2e2c637e3b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 14:13:13 +0100 Subject: [PATCH 28/95] Add auth test route (Only in app.js) Signed-off-by: Fred Boniface --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 789962e..66f0c15 100644 --- a/app.js +++ b/app.js @@ -49,7 +49,7 @@ app.use((err, req, res, next) => { return; }); -// Middleware: +// Global Middleware: app.use(express.json()); //JSON Parsing for POST Requests app.use(compression()) // Compress API Data if supported by client @@ -63,6 +63,7 @@ app.use('/api/v1/stats', statRtr) // Authented Routes app.use('/api/v1/ldbs', authenticate) +app.use('/api/v1/auth/test', authenticate) // Start Express app.listen(srvPort, srvListen, (error) =>{ -- 2.34.1 From 8fdac022d7341d5f33b0f5af7841e358aa2421dd Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 14:13:47 +0100 Subject: [PATCH 29/95] Add notes Signed-off-by: Fred Boniface --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 66f0c15..f5b077c 100644 --- a/app.js +++ b/app.js @@ -63,7 +63,7 @@ app.use('/api/v1/stats', statRtr) // Authented Routes app.use('/api/v1/ldbs', authenticate) -app.use('/api/v1/auth/test', authenticate) +app.use('/api/v1/auth/test', authenticate) // Returns 401 if auth failed, 404 if successful. // Start Express app.listen(srvPort, srvListen, (error) =>{ -- 2.34.1 From 38cf679da764e605f35bfdc8ae00d89571ed64c4 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 20:53:07 +0100 Subject: [PATCH 30/95] Transform the register.request function stack It now works in dev environment pending testing --- app.js | 3 ++- src/configs/domains.configs.js | 4 +-- src/controllers/auth.controllers.js | 14 ---------- src/controllers/registration.controllers.js | 26 +++++++++++++++++++ src/routes/auth.routes.js | 7 ----- src/routes/registration.routes.js | 8 ++++++ ...r.services.js => registration.services.js} | 20 +++++++++----- 7 files changed, 51 insertions(+), 31 deletions(-) delete mode 100644 src/controllers/auth.controllers.js create mode 100644 src/controllers/registration.controllers.js delete mode 100644 src/routes/auth.routes.js create mode 100644 src/routes/registration.routes.js rename src/services/{register.services.js => registration.services.js} (59%) diff --git a/app.js b/app.js index f5b077c..5c128bb 100644 --- a/app.js +++ b/app.js @@ -23,7 +23,7 @@ const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints const findRtr = require('./src/routes/find.routes'); // /find endpoints const issueRtr = require('./src/routes/issue.routes') // /issue endpoints const statRtr = require('./src/routes/stats.routes'); // /stat endpoints -const auth = require('./src/routes/auth.routes'); // /auth endpoints +const regRtr = require('./src/routes/registration.routes'); // /auth endpoints // Set Server Configurations const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" @@ -60,6 +60,7 @@ app.use('/api/v1/kube', kubeRtr); app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); app.use('/api/v1/stats', statRtr) +app.use('/api/v1/register', regRtr) // Authented Routes app.use('/api/v1/ldbs', authenticate) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 0b93a75..f7a3e79 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,4 +1,4 @@ -const valid = [ +module.exports = valid = [ "owlboard.info", "gwr.com", "swrailway.com", @@ -8,4 +8,4 @@ const valid = [ // Use Network Rail Control contact book to add domains -module.exports = valid \ No newline at end of file +// module.exports = valid \ No newline at end of file diff --git a/src/controllers/auth.controllers.js b/src/controllers/auth.controllers.js deleted file mode 100644 index 4df90a4..0000000 --- a/src/controllers/auth.controllers.js +++ /dev/null @@ -1,14 +0,0 @@ -const auth = require('../services/auth.services'); - -async function register(req, res, next){ - try { - res.json(await auth.addUser(req.body)) - } catch (err) { - console.error(`Controller Error`, err.message); - next(err); - } -} - -module.exports = { - register -} \ No newline at end of file diff --git a/src/controllers/registration.controllers.js b/src/controllers/registration.controllers.js new file mode 100644 index 0000000..f81706e --- /dev/null +++ b/src/controllers/registration.controllers.js @@ -0,0 +1,26 @@ +const reg = require('../services/registration.services'); + +async function register(req, res, next) { + try { + let response = await reg.addUser(req.body) + res.status(response.status).json(response) + } catch (err) { + console.error(`Controller Error`, err.message) + next(err) + } +} + +async function request(req, res, next) { + try { + let response = await reg.createRegKey(req.body) + res.status(response.status).json(response) + } catch (err) { + console.error(err) + next(err) + } +} + +module.exports = { + register, + request +} \ No newline at end of file diff --git a/src/routes/auth.routes.js b/src/routes/auth.routes.js deleted file mode 100644 index 3c2f96e..0000000 --- a/src/routes/auth.routes.js +++ /dev/null @@ -1,7 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const authController = require('../controllers/auth.controllers'); - -router.post('/register', authController.register); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/registration.routes.js b/src/routes/registration.routes.js new file mode 100644 index 0000000..afee9cd --- /dev/null +++ b/src/routes/registration.routes.js @@ -0,0 +1,8 @@ +const express = require('express'); +const router = express.Router(); +const regController = require('../controllers/registration.controllers'); + +router.post('/request', regController.request); +router.post('/register', regController.register) + +module.exports = router; \ No newline at end of file diff --git a/src/services/register.services.js b/src/services/registration.services.js similarity index 59% rename from src/services/register.services.js rename to src/services/registration.services.js index b60d9a8..b390f5d 100644 --- a/src/services/register.services.js +++ b/src/services/registration.services.js @@ -3,23 +3,29 @@ const auth = require('../utils/auth.utils') const db = require('./dbAccess.services') const mail = require('./mail.services') const clean = require('../utils/sanitizer.utils') -const domList = require('../configs/domains.configs') +const domains = require('../configs/domains.configs') -async function createRegKey(eml){ - const domain = await clean.splitDomain(eml) +async function createRegKey(body){ + log.out(`registerServices.createRegKey: Incoming request`, "INFO") + log.out(`registerServices.createRegKey: ${JSON.stringify(domains)}`) + const domain = await clean.splitDomain(body.email) log.out(`registerServices: New registration request from domain: ${domain}`, "info") - if (domList.valid.includes(domain)) { // Needs testing + if (domains.includes(domain)) { // Needs testing + log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) const uuid = auth.generateKey(); db.addRegReq(await uuid, domain) - const message = auth.generateConfirmationEmail(eml, uuid) + const message = auth.generateConfirmationEmail(body.email, uuid) if (await message == false) { // This error should be handled in the upstream function const err = new Error("Message generation error"); log.out(`registerServices.createRegKey: Error generating registration email`, "err") return 500; } - return await mail.send(message); + if (await mail.send(message) == true) { + return {status: 201, message: "email sent"} + } + return {status: 500, message: "server error, email send failed"} } - return 401; + return {status: 403, message: "forbidden, domain is not on whitelist"} } async function regUser(req) { -- 2.34.1 From 379b35b6f7c26061d897fab604f596e3bde49413 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 21:36:33 +0100 Subject: [PATCH 31/95] Update mail template --- mail-templates/register.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail-templates/register.txt b/mail-templates/register.txt index 099f009..a7d725e 100644 --- a/mail-templates/register.txt +++ b/mail-templates/register.txt @@ -4,4 +4,4 @@ https://owlboard.info/ref/auth.html?>>ACCESSCODE<< Alternatively you can copy and paste the above link. -The link will expire after 30 minutes. \ No newline at end of file +If you did not request to register to OwlBoard then you can safely ignore this email. The link will expire after 30 minutes. \ No newline at end of file -- 2.34.1 From 1cc7e19681acb7da5d1b9f35f7273b164c0755de Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 21:39:28 +0100 Subject: [PATCH 32/95] Ensure domain is stored alongside reg request --- src/services/dbAccess.services.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 8006551..c8d6ce8 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -42,9 +42,9 @@ async function addUser(uuid, domain) { // Needs testing return res; } -async function addRegReq(uuid) { // Needs testing +async function addRegReq(uuid, domain) { // Needs testing log.out(`dbAccess.addRegReq: Adding registration request`) - let doc = {uuid: uuid, time: new Date} + let doc = {uuid: uuid, time: new Date, domain: domain} await client.connect(); let col = db.collection("registrations"); res = col.insertOne(doc); -- 2.34.1 From 214658443d503bbcf6dd7f2f64d546e03a0151b6 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 5 Apr 2023 21:40:15 +0100 Subject: [PATCH 33/95] Adjust valid domains list --- src/configs/domains.configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index f7a3e79..af5ed62 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -3,7 +3,7 @@ module.exports = valid = [ "gwr.com", "swrailway.com", "firstrail.com", - "networkrail.co.uk" + "networkrail.co.uk", ] // Use Network Rail Control contact book to add domains -- 2.34.1 From 833be3433317376029c7ffd9f3e8766041250315 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 19:42:47 +0100 Subject: [PATCH 34/95] More work on reg services Signed-off-by: Fred Boniface --- src/services/registration.services.js | 5 +++-- src/utils/auth.utils.js | 30 ++++++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/services/registration.services.js b/src/services/registration.services.js index b390f5d..b43bb96 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -29,9 +29,10 @@ async function createRegKey(body){ } async function regUser(req) { - if (util.checkRequest(req.key) == true) { + let res = auth.checkRequest(req.key) + if (res.status) { // Run DB Query to get the email domain to store alongside the api_key - apiKey = await db.addUser(await util.generateKey()) + apiKey = await db.addUser(await util.generateKey(), res.domain) return {status: 201, message: "User added", api_key: apiKey} } else { return {status: 401, message: "Unautorised"} diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index b88a075..4903b2f 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -4,15 +4,28 @@ const db = require('../services/dbAccess.services'); const fs = require('fs/promises') // Checks users registration key against issued keys -async function isAuthed(key) { // Needs testing - return false; - q = {uuid: key}; - res = db.query("registrations", q); +async function isAuthed(uuid) { // Needs testing + q = {uuid: uuid}; + res = db.query("users", q); log.out(`authUtils.checkUser: DB Query answer: ${await res}`) - // Do something here to determine if authorised or not and simply return a BOOL - - return + if (res[0].domain) { + db.userAtime(uuid) + return true + } + return false +} + +// Checks whether a registration request key is valid +async function checkRequest(key) { + let collection = "registrations" + let query = {uuid: key} + const res = await db.query(collection, query) + log.out(`authUtils.checkRequest: DB Query result: ${res}`, "info") + if (res[0].time) { + return {result: true, domain: res[0].date} + } + return {result: false} } // Creates an API key for a user @@ -39,5 +52,6 @@ async function generateConfirmationEmail(eml, uuid) { module.exports = { isAuthed, generateKey, - generateConfirmationEmail + generateConfirmationEmail, + checkRequest } \ No newline at end of file -- 2.34.1 From 9cba7e73991c7a170c6c6030639d3064cdeab92f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 20:17:30 +0100 Subject: [PATCH 35/95] Debug request/register flows Signed-off-by: Fred Boniface --- src/controllers/registration.controllers.js | 2 +- src/services/dbAccess.services.js | 7 +++++-- src/services/registration.services.js | 17 ++++++++++------- src/utils/auth.utils.js | 8 ++++---- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/controllers/registration.controllers.js b/src/controllers/registration.controllers.js index f81706e..9253c3f 100644 --- a/src/controllers/registration.controllers.js +++ b/src/controllers/registration.controllers.js @@ -2,7 +2,7 @@ const reg = require('../services/registration.services'); async function register(req, res, next) { try { - let response = await reg.addUser(req.body) + let response = await reg.regUser(req.body) res.status(response.status).json(response) } catch (err) { console.error(`Controller Error`, err.message) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index c8d6ce8..8dfbe19 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -38,8 +38,11 @@ async function addUser(uuid, domain) { // Needs testing let doc = {uuid: uuid, domain: domain, atime: new Date} await client.connect(); let col = db.collection("users"); - res = col.insertOne(doc); - return res; + res = await col.insertOne(doc); + if (res.insertedId) { + return true + } + return false } async function addRegReq(uuid, domain) { // Needs testing diff --git a/src/services/registration.services.js b/src/services/registration.services.js index b43bb96..f712083 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -29,14 +29,17 @@ async function createRegKey(body){ } async function regUser(req) { - let res = auth.checkRequest(req.key) - if (res.status) { - // Run DB Query to get the email domain to store alongside the api_key - apiKey = await db.addUser(await util.generateKey(), res.domain) - return {status: 201, message: "User added", api_key: apiKey} - } else { - return {status: 401, message: "Unautorised"} + log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`) + let res = await auth.checkRequest(req.uuid) + log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`) + if (res.result) { + let uuid = await auth.generateKey() + let apiKey = await db.addUser(uuid, res.domain) + if (apiKey) { + return {status: 201, message: "User added", api_key: uuid} + } } + return {status: 401, message: "Unautorised"} } module.exports = { diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index 4903b2f..d9eeb5e 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -6,8 +6,8 @@ const fs = require('fs/promises') // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing q = {uuid: uuid}; - res = db.query("users", q); - log.out(`authUtils.checkUser: DB Query answer: ${await res}`) + res = await db.query("users", q); + log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`) // Do something here to determine if authorised or not and simply return a BOOL if (res[0].domain) { db.userAtime(uuid) @@ -21,9 +21,9 @@ async function checkRequest(key) { let collection = "registrations" let query = {uuid: key} const res = await db.query(collection, query) - log.out(`authUtils.checkRequest: DB Query result: ${res}`, "info") + log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, "info") if (res[0].time) { - return {result: true, domain: res[0].date} + return {result: true, domain: res[0].domain} } return {result: false} } -- 2.34.1 From 90348f48f3b426ece8921132f5617113c84b32fa Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 20:36:25 +0100 Subject: [PATCH 36/95] Debugging req/reg functions Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 13 +++++++++++-- src/services/registration.services.js | 3 ++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 8dfbe19..84399b2 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -30,7 +30,6 @@ async function increment(target) { let update = {} update[target] = 1 col.updateOne({target: "counters"}, {$inc:update}) - return; } async function addUser(uuid, domain) { // Needs testing @@ -64,10 +63,20 @@ async function userAtime(uuid) { // Needs testing return res; } +// Deletes one single registration request entry from the DB +async function delRegReq(uuid) { + log.out(`dbAccess.delRegReq: Deleting a Registration Request`) + collection = "registrations" + await client.connect() + let col = db.collection(collection) + col.deleteOne({uuid: uuid}) +} + module.exports = { query, increment, addUser, userAtime, - addRegReq + addRegReq, + delRegReq } \ No newline at end of file diff --git a/src/services/registration.services.js b/src/services/registration.services.js index f712083..2e3813f 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -35,7 +35,8 @@ async function regUser(req) { if (res.result) { let uuid = await auth.generateKey() let apiKey = await db.addUser(uuid, res.domain) - if (apiKey) { + if (apiKey) { + db.delRegReq(req.uuid) return {status: 201, message: "User added", api_key: uuid} } } -- 2.34.1 From 04d7e17965c84db9cb12275d1958572feae5f42b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 20:40:51 +0100 Subject: [PATCH 37/95] Req/Reg functions work when testing. To test with frontend Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 84399b2..8d0db35 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -54,7 +54,7 @@ async function addRegReq(uuid, domain) { // Needs testing } async function userAtime(uuid) { // Needs testing - log.out(`dbAccess.userAtime: Updating access time for user`) + log.out(`dbAccess.userAtime: Updating access time for user`); let q = {uuid: uuid}; let n = {$set: {uuid: uuid, atime: new Date}}; await client.connect(); -- 2.34.1 From 3f7defcf8eae8e3f9bb849ad0035ceb68ca4674a Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 20:43:27 +0100 Subject: [PATCH 38/95] Making code look prettier Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 8d0db35..d68465f 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -1,4 +1,4 @@ -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils'); // Log Helper const dbUser = process.env.OWL_DB_USER || "owl" const dbPass = process.env.OWL_DB_PASS || "twittwoo" -- 2.34.1 From 096ce154dabc0073fd478f52e58ae42b2f1bb014 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 22:01:37 +0100 Subject: [PATCH 39/95] Add rate limiting and tidy up various code. Will need complete review long before merging to main. Signed-off-by: Fred Boniface --- app.js | 9 +++++++++ package-lock.json | 12 +++++++++++ package.json | 1 + src/middlewares/auth.middlewares.js | 2 +- src/services/mail.services.js | 2 +- src/services/registration.services.js | 29 +++++++++++++-------------- src/utils/auth.utils.js | 29 ++++++++++++--------------- src/utils/ldb.utils.js | 4 ++-- src/utils/log.utils.js | 4 +++- src/utils/sanitizer.utils.js | 4 ++-- 10 files changed, 58 insertions(+), 38 deletions(-) diff --git a/app.js b/app.js index 5c128bb..a744a97 100644 --- a/app.js +++ b/app.js @@ -12,6 +12,7 @@ const app = express(); // Middleware const compression = require('compression') +const rateLimit = require('express-rate-limit') const authenticate= require('./src/middlewares/auth.middlewares') // Internal Requires @@ -29,6 +30,13 @@ const regRtr = require('./src/routes/registration.routes'); // /auth end const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" const srvPort = process.env.OWL_SRV_PORT || 8460 +const limiter = rateLimit({ + windowMs: 15 * (60 * 1000), // 15 minutes + max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: true, // Disable the `X-RateLimit-*` headers +}) + // Print version number: log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, "init"); @@ -52,6 +60,7 @@ app.use((err, req, res, next) => { // Global Middleware: app.use(express.json()); //JSON Parsing for POST Requests app.use(compression()) // Compress API Data if supported by client +app.use(limiter) // Unauthenticated Routes app.use('/api/v1/list', listRtr); diff --git a/package-lock.json b/package-lock.json index 37d5ef9..47f9a94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "axios": "^1.2.1", "compression": "^1.7.4", "express": "^4.18.2", + "express-rate-limit": "^6.7.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1", @@ -1426,6 +1427,17 @@ "node": ">= 0.10.0" } }, + "node_modules/express-rate-limit": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", + "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "engines": { + "node": ">= 12.9.0" + }, + "peerDependencies": { + "express": "^4 || ^5" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", diff --git a/package.json b/package.json index fb6934b..0d4e876 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "axios": "^1.2.1", "compression": "^1.7.4", "express": "^4.18.2", + "express-rate-limit": "^6.7.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1", diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js index c740895..a97d0b0 100644 --- a/src/middlewares/auth.middlewares.js +++ b/src/middlewares/auth.middlewares.js @@ -11,7 +11,7 @@ module.exports = async function authCheck(req, res, next) { return next(err) } try { - var result = await utils.isAuthed(uuid) | false + var result = await utils.isAuthed(uuid) || false if (!result) { const err = new Error("Unauthorised"); err.status = 401 diff --git a/src/services/mail.services.js b/src/services/mail.services.js index e3fa3f6..0f30f3a 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -23,7 +23,7 @@ async function send(message){ // message is an object containing strings for: *t try { var res = await transporter.sendMail(message) } catch(err) { - log.out(`mailServices.send: Message send failed`, "err") + log.out(`mailServices.send: Message send failed: ${err}`, "err") return false; } log.out(`mailServices.send: SMTP Response: ${res.response}`) diff --git a/src/services/registration.services.js b/src/services/registration.services.js index 2e3813f..b47e301 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -5,17 +5,16 @@ const mail = require('./mail.services') const clean = require('../utils/sanitizer.utils') const domains = require('../configs/domains.configs') -async function createRegKey(body){ +async function createRegKey(body) { log.out(`registerServices.createRegKey: Incoming request`, "INFO") - log.out(`registerServices.createRegKey: ${JSON.stringify(domains)}`) - const domain = await clean.splitDomain(body.email) + const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email log.out(`registerServices: New registration request from domain: ${domain}`, "info") - if (domains.includes(domain)) { // Needs testing + if (domains.includes(domain)) { log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) - const uuid = auth.generateKey(); - db.addRegReq(await uuid, domain) - const message = auth.generateConfirmationEmail(body.email, uuid) - if (await message == false) { // This error should be handled in the upstream function + const uuid = await auth.generateKey(); + db.addRegReq(uuid, domain) + const message = await auth.generateConfirmationEmail(body.email, uuid) + if (!message) { const err = new Error("Message generation error"); log.out(`registerServices.createRegKey: Error generating registration email`, "err") return 500; @@ -28,19 +27,19 @@ async function createRegKey(body){ return {status: 403, message: "forbidden, domain is not on whitelist"} } -async function regUser(req) { - log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`) - let res = await auth.checkRequest(req.uuid) - log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`) +async function regUser(req) { // Add input validation + log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, "info") + const res = await auth.checkRequest(req.uuid) + log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, "info") if (res.result) { - let uuid = await auth.generateKey() - let apiKey = await db.addUser(uuid, res.domain) + const uuid = await auth.generateKey() + const apiKey = await db.addUser(uuid, res.domain) if (apiKey) { db.delRegReq(req.uuid) return {status: 201, message: "User added", api_key: uuid} } } - return {status: 401, message: "Unautorised"} + return {status: 401, message: "Unauthorised"} } module.exports = { diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index d9eeb5e..0864137 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -5,27 +5,24 @@ const fs = require('fs/promises') // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing - q = {uuid: uuid}; - res = await db.query("users", q); - log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`) - // Do something here to determine if authorised or not and simply return a BOOL - if (res[0].domain) { - db.userAtime(uuid) - return true - } - return false + const q = {uuid: uuid} + const res = await db.query("users", q) + log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, "dbug") + const authorized = res && res[0] && res[0].domain; + if (authorized) db.userAtime(uuid) + return authorized } // Checks whether a registration request key is valid async function checkRequest(key) { - let collection = "registrations" - let query = {uuid: key} + const collection = "registrations" + const query = {uuid: key} const res = await db.query(collection, query) - log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, "info") - if (res[0].time) { - return {result: true, domain: res[0].domain} - } - return {result: false} + log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, "dbug") + const result = res.length > 0 && res[0].time + ? { result: true, domain: res[0].domain } + : { result: false }; + return result; } // Creates an API key for a user diff --git a/src/utils/ldb.utils.js b/src/utils/ldb.utils.js index a99b74d..c6c25e4 100644 --- a/src/utils/ldb.utils.js +++ b/src/utils/ldb.utils.js @@ -4,10 +4,10 @@ const san = require('../utils/sanitizer.utils') // Sanitiser async function checkCrs(input){ var INPUT = input.toUpperCase() - log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, "info") + log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, "dbug") var query = {'$or':[{'3ALPHA':INPUT},{'TIPLOC':INPUT},{'STANOX':INPUT}]}; var result = await db.query("stations", query) - log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, "info") + log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, "dbug") return result } diff --git a/src/utils/log.utils.js b/src/utils/log.utils.js index db0b3f0..5271bf4 100644 --- a/src/utils/log.utils.js +++ b/src/utils/log.utils.js @@ -1,7 +1,9 @@ const environment = process.env.NODE_ENV; +const hideInProduction = ["info", "dbug"] + async function out(msg, level = 'othr') { - if (environment === "production" && level === "info") { + if (environment === "production" && hideInProduction.includes(level)) { return; } else { const time = new Date().toISOString(); diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index c1fdbaa..e0e6e7e 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -38,7 +38,7 @@ function cleanNrcc(input) { return rmPara; } -async function splitDomain(mail) { // Needs testing +async function getDomainFromEmail(mail) { // Needs testing split = mail.split("@") return split[1] } @@ -47,5 +47,5 @@ module.exports = { cleanApiEndpointTxt, cleanApiEndpointNum, cleanNrcc, - splitDomain + getDomainFromEmail } \ No newline at end of file -- 2.34.1 From 9c45ecfdf1a30bd301ee2458c0f665cf00a2d549 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 6 Apr 2023 22:15:57 +0100 Subject: [PATCH 40/95] Add proxy set: - Add app.set('trust proxy', 3) - Add route /api/v1/ip when in development mode Signed-off-by: Fred Boniface --- app.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app.js b/app.js index a744a97..593238f 100644 --- a/app.js +++ b/app.js @@ -5,6 +5,7 @@ // different license applies. console.log(`Initialising OwlBoard`) +const mode = process.env.NODE_ENV || "development" // External Requires const express = require('express'); @@ -38,6 +39,7 @@ const limiter = rateLimit({ }) // Print version number: +log.out(`app: Starting OwlBoard in ${mode} mode`, "init") log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, "init"); // Test for required vars: @@ -75,6 +77,12 @@ app.use('/api/v1/register', regRtr) app.use('/api/v1/ldbs', authenticate) app.use('/api/v1/auth/test', authenticate) // Returns 401 if auth failed, 404 if successful. +// Number of proxies: +app.set('trust proxy', 3) +mode === "development" + ? app.get('/api/v1/ip', (request, response) => response.send(request.ip)) + : null + // Start Express app.listen(srvPort, srvListen, (error) =>{ if(!error) { -- 2.34.1 From a213014a0b9b9c35f5885249445ccea9c829ef32 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 14:39:45 +0100 Subject: [PATCH 41/95] It is a silly idea leaving a 404 to mean successful Signed-off-by: Fred Boniface --- app.js | 28 ++++++++++++++-------------- src/middlewares/auth.middlewares.js | 4 +++- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app.js b/app.js index 593238f..d39fb3e 100644 --- a/app.js +++ b/app.js @@ -17,15 +17,15 @@ const rateLimit = require('express-rate-limit') const authenticate= require('./src/middlewares/auth.middlewares') // Internal Requires -const log = require('./src/utils/log.utils'); // Log Helper -const version = require('./src/configs/version.configs'); // Version Strings -const listRtr = require('./src/routes/list.routes'); // /list endpoints -const ldbRtr = require('./src/routes/ldb.routes'); // /ldb endpoints -const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints -const findRtr = require('./src/routes/find.routes'); // /find endpoints -const issueRtr = require('./src/routes/issue.routes') // /issue endpoints -const statRtr = require('./src/routes/stats.routes'); // /stat endpoints -const regRtr = require('./src/routes/registration.routes'); // /auth endpoints +const log = require('./src/utils/log.utils'); // Log Helper +const version = require('./src/configs/version.configs'); // Version Strings +const listRtr = require('./src/routes/list.routes'); // /list endpoints +const ldbRtr = require('./src/routes/ldb.routes'); // /ldb endpoints +const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints +const findRtr = require('./src/routes/find.routes'); // /find endpoints +const issueRtr = require('./src/routes/issue.routes'); // /issue endpoints +const statRtr = require('./src/routes/stats.routes'); // /stat endpoints +const regRtr = require('./src/routes/registration.routes'); // /registration endpoints // Set Server Configurations const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" @@ -70,17 +70,17 @@ app.use('/api/v1/ldb', ldbRtr); app.use('/api/v1/kube', kubeRtr); app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); -app.use('/api/v1/stats', statRtr) -app.use('/api/v1/register', regRtr) +app.use('/api/v1/stats', statRtr); +app.use('/api/v1/register', regRtr); // Authented Routes app.use('/api/v1/ldbs', authenticate) -app.use('/api/v1/auth/test', authenticate) // Returns 401 if auth failed, 404 if successful. +app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200)) // Returns 401 if auth failed, 200 if successful. // Number of proxies: -app.set('trust proxy', 3) +app.set('trust proxy', 4) mode === "development" - ? app.get('/api/v1/ip', (request, response) => response.send(request.ip)) + ? app.get('/api/v1/ip', (req, res) => res.send(req.ip)) : null // Start Express diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js index a97d0b0..2290340 100644 --- a/src/middlewares/auth.middlewares.js +++ b/src/middlewares/auth.middlewares.js @@ -6,7 +6,7 @@ module.exports = async function authCheck(req, res, next) { try { var uuid = req.headers.uuid } catch(err) { - log.out(`authMiddlewares: No authentication attempted`, "INFO") + log.out(`authMiddlewares: No authentication attempted`, "info") err.status = 401 return next(err) } @@ -15,8 +15,10 @@ module.exports = async function authCheck(req, res, next) { if (!result) { const err = new Error("Unauthorised"); err.status = 401 + log.out(`authMiddlewares: Authentication attempted with incorrect key`, "warn") return next(err) } else { + log.out(`authMiddlewares: User authenticated`, "info") return next() } } catch(err) { -- 2.34.1 From e96f72a2faf6aa097d7facb3d51fd302c7b6bd17 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 15:48:47 +0100 Subject: [PATCH 42/95] Debugging Signed-off-by: Fred Boniface --- src/services/registration.services.js | 2 ++ src/utils/sanitizer.utils.js | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/services/registration.services.js b/src/services/registration.services.js index b47e301..2db643b 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -7,6 +7,8 @@ const domains = require('../configs/domains.configs') async function createRegKey(body) { log.out(`registerServices.createRegKey: Incoming request`, "INFO") + if (!clean.checkEmailValid(body.mail)) {return {status: 400, message:"address format invalid"} + } const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email log.out(`registerServices: New registration request from domain: ${domain}`, "info") if (domains.includes(domain)) { diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index e0e6e7e..f8282a7 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -43,9 +43,18 @@ async function getDomainFromEmail(mail) { // Needs testing return split[1] } +async function checkEmailValid(mail) { + const regex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; + const result = mail.match(regex) + ? true + : false; log.out(`sanitizerUtils.checkEmailValid: Invalid email format used: ${mail}`,"warn") + return result; +} + module.exports = { cleanApiEndpointTxt, cleanApiEndpointNum, cleanNrcc, - getDomainFromEmail + getDomainFromEmail, + checkEmailValid } \ No newline at end of file -- 2.34.1 From 979048105ef8bd08fc03bbd272c95c652ca50679 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 17:00:15 +0100 Subject: [PATCH 43/95] Fix authentication functions Signed-off-by: Fred Boniface --- app.js | 2 +- src/services/registration.services.js | 2 -- src/utils/log.utils.js | 2 +- src/utils/sanitizer.utils.js | 9 --------- 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/app.js b/app.js index d39fb3e..3303e8b 100644 --- a/app.js +++ b/app.js @@ -75,7 +75,7 @@ app.use('/api/v1/register', regRtr); // Authented Routes app.use('/api/v1/ldbs', authenticate) -app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200)) // Returns 401 if auth failed, 200 if successful. +app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: "ok", message: "Authentication successful"})) // Returns 401 if auth failed, 200 if successful. // Number of proxies: app.set('trust proxy', 4) diff --git a/src/services/registration.services.js b/src/services/registration.services.js index 2db643b..b47e301 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -7,8 +7,6 @@ const domains = require('../configs/domains.configs') async function createRegKey(body) { log.out(`registerServices.createRegKey: Incoming request`, "INFO") - if (!clean.checkEmailValid(body.mail)) {return {status: 400, message:"address format invalid"} - } const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email log.out(`registerServices: New registration request from domain: ${domain}`, "info") if (domains.includes(domain)) { diff --git a/src/utils/log.utils.js b/src/utils/log.utils.js index 5271bf4..988f99e 100644 --- a/src/utils/log.utils.js +++ b/src/utils/log.utils.js @@ -3,7 +3,7 @@ const environment = process.env.NODE_ENV; const hideInProduction = ["info", "dbug"] async function out(msg, level = 'othr') { - if (environment === "production" && hideInProduction.includes(level)) { + if (environment === "production" && hideInProduction.includes(level.toLowerCase())) { return; } else { const time = new Date().toISOString(); diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index f8282a7..491188f 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -43,18 +43,9 @@ async function getDomainFromEmail(mail) { // Needs testing return split[1] } -async function checkEmailValid(mail) { - const regex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; - const result = mail.match(regex) - ? true - : false; log.out(`sanitizerUtils.checkEmailValid: Invalid email format used: ${mail}`,"warn") - return result; -} - module.exports = { cleanApiEndpointTxt, cleanApiEndpointNum, cleanNrcc, getDomainFromEmail, - checkEmailValid } \ No newline at end of file -- 2.34.1 From b45aacc25a4e23cda60c949c6647afc1f978630d Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 17:38:23 +0100 Subject: [PATCH 44/95] Add additional domains Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 36 ++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index af5ed62..f7704c3 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,11 +1,35 @@ module.exports = valid = [ "owlboard.info", + "avantiwestcoast.co.uk", + "btp.police.uk", + "c2crail.net", + "chilternrailways.co.uk", + "crosscountrytrains.co.uk", + "eastmidlandsrailway.co.uk", + "abellio.co.uk", + "tfl.gov.uk", + "mtrel.co.uk", + "eurostar.com", + "eurotunnel.com", + "ffwhr.com", "gwr.com", + "hitachirail-eu.com", + "greateranglia.co.uk", + "heathrow.com", + "hs2.org.uk", "swrailway.com", - "firstrail.com", + "lsltoc.co.uk", + "lner.co.uk", + "arrivarl.co.uk", + "tube.tfl.gov.uk", + "lumo.co.uk", + "merseyrail.org", + "nrcommcentre.com", "networkrail.co.uk", -] - -// Use Network Rail Control contact book to add domains - -// module.exports = valid \ No newline at end of file + "northernrailway.co.uk", + "scotrail.co.uk", + "southeasternrailway.co.uk", + "tpeexpress.co.uk", + "tfwrail.wales", + "wmtrains.co.uk", +] \ No newline at end of file -- 2.34.1 From 5af612264613ef3b1197091d4acedfa638592f03 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 17:53:49 +0100 Subject: [PATCH 45/95] Add requireJson middleware --- src/middlewares/requireJson.middlewares.js | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/middlewares/requireJson.middlewares.js diff --git a/src/middlewares/requireJson.middlewares.js b/src/middlewares/requireJson.middlewares.js new file mode 100644 index 0000000..a4d0707 --- /dev/null +++ b/src/middlewares/requireJson.middlewares.js @@ -0,0 +1,9 @@ +const log = require('../utils/log.utils') + +module.exports = async function requireJson(req, res, next) { + if (req.headers['content-type'] !== 'application/json') { + res.status(400).send({status: 400, message: "Server requires JSON"}) + } else { + next() + } +} \ No newline at end of file -- 2.34.1 From 3288ddf206b71f6487d954113dba07c80640b066 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 18:06:47 +0100 Subject: [PATCH 46/95] Adjust middlewares --- src/middlewares/auth.middlewares.js | 6 +++--- src/middlewares/requireJson.middlewares.js | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js index 2290340..23f02c3 100644 --- a/src/middlewares/auth.middlewares.js +++ b/src/middlewares/auth.middlewares.js @@ -2,11 +2,11 @@ const utils = require('../utils/auth.utils') const log = require('../utils/log.utils') module.exports = async function authCheck(req, res, next) { - log.out(`authMiddlewares: Checking authentication`, "INFO") + log.out(`authMiddlewares: Checking authentication`, "dbug") try { var uuid = req.headers.uuid } catch(err) { - log.out(`authMiddlewares: No authentication attempted`, "info") + log.out(`authMiddlewares: No authentication attempted`, "dbug") err.status = 401 return next(err) } @@ -18,7 +18,7 @@ module.exports = async function authCheck(req, res, next) { log.out(`authMiddlewares: Authentication attempted with incorrect key`, "warn") return next(err) } else { - log.out(`authMiddlewares: User authenticated`, "info") + log.out(`authMiddlewares: User authenticated`, "dbug") return next() } } catch(err) { diff --git a/src/middlewares/requireJson.middlewares.js b/src/middlewares/requireJson.middlewares.js index a4d0707..fecdd42 100644 --- a/src/middlewares/requireJson.middlewares.js +++ b/src/middlewares/requireJson.middlewares.js @@ -2,6 +2,7 @@ const log = require('../utils/log.utils') module.exports = async function requireJson(req, res, next) { if (req.headers['content-type'] !== 'application/json') { + log.out(`requireJson.middlewares: Bad Request: Not in JSON format`) res.status(400).send({status: 400, message: "Server requires JSON"}) } else { next() -- 2.34.1 From 654855ed2e49d343ed4ed8d478ed923ecf9b4f71 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 21:22:20 +0100 Subject: [PATCH 47/95] Debugging Signed-off-by: Fred Boniface --- mail-templates/register.html | 8 +++++--- mail-templates/register.txt | 7 +++++-- src/services/registration.services.js | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 591372f..2adf820 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -26,15 +26,17 @@

Use the link below to register for OwlBoard (Staff Version)


- Register + Register


-

Alternatively copy and paste the link "https://owlboard.info/reg/auth.html?>>ACCESSCODE<<

+

Alternatively copy and paste the link "https://owlboard.info/auth.html?key=>>ACCESSCODE<<

This registration is for one device only, you can register again using the same email address for other devices and access OwlBoard from both.

If you did not request to sign up to OwlBoard (Staff Version), you can - safely ignore this email. The link will expire after 30 minutes. + safely ignore this email. Your email address has not been stored by us + will not be required again unless you wish to register again.

+

The registration link will expire after 30 minutes.

diff --git a/mail-templates/register.txt b/mail-templates/register.txt index a7d725e..1f0df84 100644 --- a/mail-templates/register.txt +++ b/mail-templates/register.txt @@ -1,7 +1,10 @@ Complete your OwlBoard (Staff) Registration using the link below. -https://owlboard.info/ref/auth.html?>>ACCESSCODE<< +https://owlboard.info/auth.html?key=>>ACCESSCODE<< Alternatively you can copy and paste the above link. -If you did not request to register to OwlBoard then you can safely ignore this email. The link will expire after 30 minutes. \ No newline at end of file +If you did not request to register to OwlBoard then you can safely ignore this email. +Your email address has not been stored by us and will not be required unless you wish to register again. + +The link will expire after 30 minutes. \ No newline at end of file diff --git a/src/services/registration.services.js b/src/services/registration.services.js index b47e301..dc16afa 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -28,6 +28,7 @@ async function createRegKey(body) { } async function regUser(req) { // Add input validation + log.out(`Read UUID: ${req.uuid}`, "dbug") log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, "info") const res = await auth.checkRequest(req.uuid) log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, "info") -- 2.34.1 From 725d12ddacd953e34e0b5dcb454db8472c11c2de Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 7 Apr 2023 22:34:10 +0100 Subject: [PATCH 48/95] Notes --- src/middlewares/requireJson.middlewares.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/middlewares/requireJson.middlewares.js b/src/middlewares/requireJson.middlewares.js index fecdd42..1b43ab5 100644 --- a/src/middlewares/requireJson.middlewares.js +++ b/src/middlewares/requireJson.middlewares.js @@ -7,4 +7,6 @@ module.exports = async function requireJson(req, res, next) { } else { next() } -} \ No newline at end of file +} + +// Possibly want to check the req type? \ No newline at end of file -- 2.34.1 From 9115211b8718743d42cb6359dcd759d150ebbe07 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 10 Apr 2023 20:12:25 +0100 Subject: [PATCH 49/95] Add API StatusCodes Signed-off-by: Fred Boniface --- src/configs/statusCodes.configs.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/configs/statusCodes.configs.js diff --git a/src/configs/statusCodes.configs.js b/src/configs/statusCodes.configs.js new file mode 100644 index 0000000..ace3c08 --- /dev/null +++ b/src/configs/statusCodes.configs.js @@ -0,0 +1,8 @@ +module.exports = statusCodes = { + 700: "no authentication attempt", + 701: "invalid credentials", + 702: "domain whitelisted", + 800: "location code not found", + 801: "unable to fetch location data", + 900: "invalid request format", +} \ No newline at end of file -- 2.34.1 From 155a3c588ce775c0e3b49c24830d779b10802e7f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 10 Apr 2023 20:19:37 +0100 Subject: [PATCH 50/95] Add error codes Signed-off-by: Fred Boniface --- .../{statusCodes.configs.js => errorCodes.configs.js} | 2 ++ src/services/registration.services.js | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) rename src/configs/{statusCodes.configs.js => errorCodes.configs.js} (72%) diff --git a/src/configs/statusCodes.configs.js b/src/configs/errorCodes.configs.js similarity index 72% rename from src/configs/statusCodes.configs.js rename to src/configs/errorCodes.configs.js index ace3c08..88e15d9 100644 --- a/src/configs/statusCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -2,7 +2,9 @@ module.exports = statusCodes = { 700: "no authentication attempt", 701: "invalid credentials", 702: "domain whitelisted", + 703: "registration request not found, maybe expired", 800: "location code not found", 801: "unable to fetch location data", 900: "invalid request format", + 950: "upstream server error", } \ No newline at end of file diff --git a/src/services/registration.services.js b/src/services/registration.services.js index dc16afa..6ede7a4 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -4,6 +4,7 @@ const db = require('./dbAccess.services') const mail = require('./mail.services') const clean = require('../utils/sanitizer.utils') const domains = require('../configs/domains.configs') +const errors = require('../configs/errorCodes.configs') async function createRegKey(body) { log.out(`registerServices.createRegKey: Incoming request`, "INFO") @@ -22,9 +23,9 @@ async function createRegKey(body) { if (await mail.send(message) == true) { return {status: 201, message: "email sent"} } - return {status: 500, message: "server error, email send failed"} + return {status: 500, errorCode: 950, errorMsg: errors[950]} } - return {status: 403, message: "forbidden, domain is not on whitelist"} + return {status: 403, errorCode: 702, errorMsg: errors[702]} } async function regUser(req) { // Add input validation @@ -40,7 +41,7 @@ async function regUser(req) { // Add input validation return {status: 201, message: "User added", api_key: uuid} } } - return {status: 401, message: "Unauthorised"} + return {status: 401, errorCode: 703, errorMsg: errors[703]} } module.exports = { -- 2.34.1 From 6c754255f6d90036f6813b13b8ada2c768ee11d5 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 10 Apr 2023 20:32:59 +0100 Subject: [PATCH 51/95] Add errorCodes Signed-off-by: Fred Boniface --- src/configs/errorCodes.configs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configs/errorCodes.configs.js b/src/configs/errorCodes.configs.js index 88e15d9..0e4b6a4 100644 --- a/src/configs/errorCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -1,10 +1,10 @@ module.exports = statusCodes = { 700: "no authentication attempt", 701: "invalid credentials", - 702: "domain whitelisted", + 702: "domain not whitelisted", 703: "registration request not found, maybe expired", 800: "location code not found", 801: "unable to fetch location data", 900: "invalid request format", 950: "upstream server error", -} \ No newline at end of file +} -- 2.34.1 From f1c616e9e0edbecbafd5f2159408478bde1e47d3 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 12 Apr 2023 13:09:33 +0100 Subject: [PATCH 52/95] Add resources for the ldbs endpoint Signed-off-by: Fred Boniface --- src/controllers/ldb.controllers.js | 2 +- src/controllers/ldbs.controllers copy.js | 16 ++++++++++++++++ src/routes/ldbs.routes.js | 4 ++-- src/services/ldb.services.js | 22 ++++++++++++++++++---- 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 src/controllers/ldbs.controllers copy.js diff --git a/src/controllers/ldb.controllers.js b/src/controllers/ldb.controllers.js index 0261c67..019cc95 100644 --- a/src/controllers/ldb.controllers.js +++ b/src/controllers/ldb.controllers.js @@ -3,7 +3,7 @@ const ldb = require('../services/ldb.services'); async function get(req, res, next){ try { var id = req.params.id - res.json(await ldb.get(req.body, id)) + res.json(await ldb.get(id)) } catch (err) { console.error(`Unknown Error`, err.message); err.status = 500 diff --git a/src/controllers/ldbs.controllers copy.js b/src/controllers/ldbs.controllers copy.js new file mode 100644 index 0000000..aa652c6 --- /dev/null +++ b/src/controllers/ldbs.controllers copy.js @@ -0,0 +1,16 @@ +const ldb = require('../services/ldb.services'); + +async function get(req, res, next){ + try { + var id = req.params.id + res.json(await ldb.get(id, true)) + } catch (err) { + console.error(`Unknown Error`, err.message); + err.status = 500 + next(err); + } +} + +module.exports = { + get +} \ No newline at end of file diff --git a/src/routes/ldbs.routes.js b/src/routes/ldbs.routes.js index 591bd45..2727ba0 100644 --- a/src/routes/ldbs.routes.js +++ b/src/routes/ldbs.routes.js @@ -1,6 +1,6 @@ const express = require('express'); const router = express.Router(); -const ldbController = require('../controllers/ldb.controllers'); +const ldbsController = require('../controllers/ldbs.controllers'); /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,6 +14,6 @@ const ldbController = require('../controllers/ldb.controllers'); /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/:id', ldbController.get); +router.get('/:id', ldbsController.get); module.exports = router; \ No newline at end of file diff --git a/src/services/ldb.services.js b/src/services/ldb.services.js index 13cde66..fa4b0d1 100644 --- a/src/services/ldb.services.js +++ b/src/services/ldb.services.js @@ -9,7 +9,7 @@ const db = require('../services/dbAccess.services') const ldbKey = process.env.OWL_LDB_KEY const ldbsvKey = process.env.OWL_LDB_SVKEY -async function get(body, id){ +async function get(id, staff=false){ var cleanId = san.cleanApiEndpointTxt(id); var obj = await util.checkCrs(cleanId); try { @@ -33,13 +33,27 @@ async function arrDepBoard(CRS){ crs: CRS.toUpperCase() } var api = new ldb(ldbKey,false) - var reply = api.call("GetArrDepBoardWithDetails", options, false, false) - return await reply + return await api.call("GetArrDepBoardWithDetails", options, false, false) } catch (err) { log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, "warn") return {GetStationBoardResult: "not available", Reason: `The CRS code ${CRS} is not valid`, Why: `Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.`}; } -}; +} + +async function arrDepBoardStaff(CRS) { + log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, "dbug") + try { + const options = { + numRows: 25, + crs: CRS.toUpperCase() + } + const api = new ldb(ldbsvKey,true) + return await api.call("Unknown") // Need to find out the syntax of this! + } catch (err) { + log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) + return {GetStationBoardResult: "not available", Reason: `The CRS code ${CRS} is not valid`, Why: `Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.`}; + } +} module.exports = { get -- 2.34.1 From ebd4d1e7a8c6612950666187b18e8bde0f84a511 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 12 Apr 2023 13:54:06 +0100 Subject: [PATCH 53/95] Add functions for staff API Call if I can get the API KEY! Signed-off-by: Fred Boniface --- src/services/ldb.services.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/services/ldb.services.js b/src/services/ldb.services.js index fa4b0d1..357e95f 100644 --- a/src/services/ldb.services.js +++ b/src/services/ldb.services.js @@ -10,29 +10,34 @@ const ldbKey = process.env.OWL_LDB_KEY const ldbsvKey = process.env.OWL_LDB_SVKEY async function get(id, staff=false){ - var cleanId = san.cleanApiEndpointTxt(id); - var obj = await util.checkCrs(cleanId); + const cleanId = san.cleanApiEndpointTxt(id); + const obj = await util.checkCrs(cleanId); try { - var crs = obj[0]['3ALPHA']; + const crs = obj[0]['3ALPHA']; log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, "info"); - var data = arrDepBoard(crs); - db.increment("ldbws"); - await data; + if (staff) { + const data = arrDepBoardStaff(crs) + db.increment("ldbsvws") + return await data + } else { + const data = arrDepBoard(crs); + db.increment("ldbws"); + return await data + } } catch (err) { log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, "info") - var data = {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'}; + return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'}; } - return data; } async function arrDepBoard(CRS){ log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, "info") try { - var options = { + const options = { numRows: 10, crs: CRS.toUpperCase() } - var api = new ldb(ldbKey,false) + const api = new ldb(ldbKey,false) return await api.call("GetArrDepBoardWithDetails", options, false, false) } catch (err) { log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, "warn") @@ -45,10 +50,11 @@ async function arrDepBoardStaff(CRS) { try { const options = { numRows: 25, - crs: CRS.toUpperCase() + crs: CRS.toUpperCase(), + getNonPassengerServices: true } const api = new ldb(ldbsvKey,true) - return await api.call("Unknown") // Need to find out the syntax of this! + return await api.call("GetArrDepBoardWithDetails", options, false, false) } catch (err) { log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) return {GetStationBoardResult: "not available", Reason: `The CRS code ${CRS} is not valid`, Why: `Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.`}; -- 2.34.1 From 4f4d84474cfbcceb65922ff73606b27b05f5ba17 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 18 Apr 2023 20:39:07 +0100 Subject: [PATCH 54/95] Run NPM Update Signed-off-by: Fred Boniface --- mail-templates/register.html | 2 +- package-lock.json | 977 +++++++++++++++++++---------------- package.json | 1 + 3 files changed, 544 insertions(+), 436 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 2adf820..1e5ab21 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -17,7 +17,7 @@ diff --git a/package-lock.json b/package-lock.json index 47f9a94..a9f6232 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "compression": "^1.7.4", "express": "^4.18.2", "express-rate-limit": "^6.7.0", + "html-minifier": "^4.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1", @@ -106,12 +107,12 @@ "optional": true }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.306.0.tgz", - "integrity": "sha512-ewCvdUrMJMlnkNaqXdG7L2H6O7CDI036y6lkTU8gQqa2lCzZvqBkzz6R5NbWqb8TJPi69Z7lXEITgk2b0+pl6w==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz", + "integrity": "sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -119,45 +120,45 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.306.0.tgz", - "integrity": "sha512-jYDs8yjEU0cyb/nZj2C6nz300lR8dOq+SqsxgdqgW9R46AGL6J4pPAY3/PRFHyC3LsRP3y/qC5w5UD/8Q0UuWg==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.315.0.tgz", + "integrity": "sha512-aI0qdd6KVwjbqr2aoJCmFzJ/GJBOmhfKDR73s3XUL7VReAkXB9Wht6cU4IaaSYXh4OacQWGonYF0Jg8z7JwV3A==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.306.0", - "@aws-sdk/config-resolver": "3.306.0", - "@aws-sdk/credential-provider-node": "3.306.0", - "@aws-sdk/fetch-http-handler": "3.306.0", - "@aws-sdk/hash-node": "3.306.0", - "@aws-sdk/invalid-dependency": "3.306.0", - "@aws-sdk/middleware-content-length": "3.306.0", - "@aws-sdk/middleware-endpoint": "3.306.0", - "@aws-sdk/middleware-host-header": "3.306.0", - "@aws-sdk/middleware-logger": "3.306.0", - "@aws-sdk/middleware-recursion-detection": "3.306.0", - "@aws-sdk/middleware-retry": "3.306.0", - "@aws-sdk/middleware-serde": "3.306.0", - "@aws-sdk/middleware-signing": "3.306.0", - "@aws-sdk/middleware-stack": "3.306.0", - "@aws-sdk/middleware-user-agent": "3.306.0", - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/node-http-handler": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/smithy-client": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", - "@aws-sdk/util-base64": "3.303.0", - "@aws-sdk/util-body-length-browser": "3.303.0", - "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.306.0", - "@aws-sdk/util-defaults-mode-node": "3.306.0", - "@aws-sdk/util-endpoints": "3.306.0", - "@aws-sdk/util-retry": "3.306.0", - "@aws-sdk/util-user-agent-browser": "3.306.0", - "@aws-sdk/util-user-agent-node": "3.306.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/client-sts": "3.315.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.315.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.315.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.315.0", + "@aws-sdk/util-defaults-mode-node": "3.315.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -165,42 +166,42 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.306.0.tgz", - "integrity": "sha512-uqfLUOP9LlBoqXe3P250TPX3fGrabfRt9Q9rlLFK0fVBI7HPIQ/wsPplLoPrMeT04qQmTI03UnVKMNza3GqyIg==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.315.0.tgz", + "integrity": "sha512-P3QOOyHQER7EDVCzXOsAaJE2p/qfdsSFsYv8k2S8LqEKGH0fViQ4Ph540uKlmaOt1kEhwH1wI6cLRMJJX9XV4Q==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.306.0", - "@aws-sdk/fetch-http-handler": "3.306.0", - "@aws-sdk/hash-node": "3.306.0", - "@aws-sdk/invalid-dependency": "3.306.0", - "@aws-sdk/middleware-content-length": "3.306.0", - "@aws-sdk/middleware-endpoint": "3.306.0", - "@aws-sdk/middleware-host-header": "3.306.0", - "@aws-sdk/middleware-logger": "3.306.0", - "@aws-sdk/middleware-recursion-detection": "3.306.0", - "@aws-sdk/middleware-retry": "3.306.0", - "@aws-sdk/middleware-serde": "3.306.0", - "@aws-sdk/middleware-stack": "3.306.0", - "@aws-sdk/middleware-user-agent": "3.306.0", - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/node-http-handler": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/smithy-client": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", - "@aws-sdk/util-base64": "3.303.0", - "@aws-sdk/util-body-length-browser": "3.303.0", - "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.306.0", - "@aws-sdk/util-defaults-mode-node": "3.306.0", - "@aws-sdk/util-endpoints": "3.306.0", - "@aws-sdk/util-retry": "3.306.0", - "@aws-sdk/util-user-agent-browser": "3.306.0", - "@aws-sdk/util-user-agent-node": "3.306.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.315.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.315.0", + "@aws-sdk/util-defaults-mode-node": "3.315.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -208,42 +209,42 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.306.0.tgz", - "integrity": "sha512-O27yrApCkbC0/uPRb1aHkENpFSqrkPbXRi76NF/8T97qC8bngRpy6yeafcQRrp9NGQSF/m9xbPWYsQuiurqedw==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.315.0.tgz", + "integrity": "sha512-OJgtmx6SpCWHBDCxBBi36Ro44uCqZBufGkThP/PVYrgVnRVnJ4V18d2wNGKmS37zKmCHHJPnhMPlGOgE2qyVPQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.306.0", - "@aws-sdk/fetch-http-handler": "3.306.0", - "@aws-sdk/hash-node": "3.306.0", - "@aws-sdk/invalid-dependency": "3.306.0", - "@aws-sdk/middleware-content-length": "3.306.0", - "@aws-sdk/middleware-endpoint": "3.306.0", - "@aws-sdk/middleware-host-header": "3.306.0", - "@aws-sdk/middleware-logger": "3.306.0", - "@aws-sdk/middleware-recursion-detection": "3.306.0", - "@aws-sdk/middleware-retry": "3.306.0", - "@aws-sdk/middleware-serde": "3.306.0", - "@aws-sdk/middleware-stack": "3.306.0", - "@aws-sdk/middleware-user-agent": "3.306.0", - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/node-http-handler": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/smithy-client": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", - "@aws-sdk/util-base64": "3.303.0", - "@aws-sdk/util-body-length-browser": "3.303.0", - "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.306.0", - "@aws-sdk/util-defaults-mode-node": "3.306.0", - "@aws-sdk/util-endpoints": "3.306.0", - "@aws-sdk/util-retry": "3.306.0", - "@aws-sdk/util-user-agent-browser": "3.306.0", - "@aws-sdk/util-user-agent-node": "3.306.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.315.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.315.0", + "@aws-sdk/util-defaults-mode-node": "3.315.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -251,45 +252,45 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.306.0.tgz", - "integrity": "sha512-LivDrH0OnAZDC3EB6hVrrl25itlMLn/C/epwDjpnH2Qdq+gjbZ0ElVNu8XOX4qaXoo0zyV5pztnzwD/A76mX2g==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.315.0.tgz", + "integrity": "sha512-e34plg6m0hScADIPiu5kCKoiJVXRLRiAuens+iwMse0oPUmrv41hdjgufwWGA/pcNkEGzMdVS88Z4khxB3LHBw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.306.0", - "@aws-sdk/credential-provider-node": "3.306.0", - "@aws-sdk/fetch-http-handler": "3.306.0", - "@aws-sdk/hash-node": "3.306.0", - "@aws-sdk/invalid-dependency": "3.306.0", - "@aws-sdk/middleware-content-length": "3.306.0", - "@aws-sdk/middleware-endpoint": "3.306.0", - "@aws-sdk/middleware-host-header": "3.306.0", - "@aws-sdk/middleware-logger": "3.306.0", - "@aws-sdk/middleware-recursion-detection": "3.306.0", - "@aws-sdk/middleware-retry": "3.306.0", - "@aws-sdk/middleware-sdk-sts": "3.306.0", - "@aws-sdk/middleware-serde": "3.306.0", - "@aws-sdk/middleware-signing": "3.306.0", - "@aws-sdk/middleware-stack": "3.306.0", - "@aws-sdk/middleware-user-agent": "3.306.0", - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/node-http-handler": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/smithy-client": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", - "@aws-sdk/util-base64": "3.303.0", - "@aws-sdk/util-body-length-browser": "3.303.0", - "@aws-sdk/util-body-length-node": "3.303.0", - "@aws-sdk/util-defaults-mode-browser": "3.306.0", - "@aws-sdk/util-defaults-mode-node": "3.306.0", - "@aws-sdk/util-endpoints": "3.306.0", - "@aws-sdk/util-retry": "3.306.0", - "@aws-sdk/util-user-agent-browser": "3.306.0", - "@aws-sdk/util-user-agent-node": "3.306.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.315.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-sdk-sts": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.315.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.315.0", + "@aws-sdk/util-defaults-mode-node": "3.315.0", + "@aws-sdk/util-endpoints": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "fast-xml-parser": "4.1.2", "tslib": "^2.5.0" }, @@ -298,14 +299,14 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.306.0.tgz", - "integrity": "sha512-kpqHu6LvNMYxullm+tLCsY6KQ2mZUxZTdyWJKTYLZCTxj4HcGJxf4Jxj9dwFAZVl/clcVPGWcHJaQJjyjwzBzw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz", + "integrity": "sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-config-provider": "3.295.0", - "@aws-sdk/util-middleware": "3.306.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -313,14 +314,14 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.306.0.tgz", - "integrity": "sha512-fjmTDTscMztA28YcmsFfrW95/yJ3Qn9kcNHsSv3iKHXb5qHAZRDANBKmymitpV3cRfkXhOhpgPqCoByjNi3I6w==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.315.0.tgz", + "integrity": "sha512-/uZ0IRAAKJM67glKkHuMsJgkYhQ8elzPEZe4i28Vh4NRibDW71uVUY5qqKG+ehuVIhASkOHatQAGY5exiSUFew==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/client-cognito-identity": "3.315.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -328,13 +329,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.306.0.tgz", - "integrity": "sha512-DTH+aMvMu+LAoWW+yfPkWzFXt/CPNFQ7+/4xiMnc7FWf+tjt+HZIrPECAV2rBVppNCkh7PC+xDSN61PFvBYOsw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz", + "integrity": "sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -342,15 +343,15 @@ } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.306.0.tgz", - "integrity": "sha512-WdrNhq2MwvjZk2I8Of+bZ/qWHG2hREQpwlBiG3tMeEkuywx7M1x3Rt0eHgiR1sTcm05kxNn0rB4OeWOeek37cA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz", + "integrity": "sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -358,19 +359,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.306.0.tgz", - "integrity": "sha512-6VvP0YmXVd+pCnlD2iTDhNvO2Ikzyk9Ade/t5R1eZ4Vf1gKhDiNA2/AgDt9XlzQHk7iw1okTmYCeQsK1j+7+NQ==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.315.0.tgz", + "integrity": "sha512-TZbYNbQkNgANx3KsWmJEyBsnfUBq/XKqYYc/VQf1L4eI+GMUw2eKpNV0MTsyviViy2st7W4SiSgtsvXyeVp9xg==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.306.0", - "@aws-sdk/credential-provider-imds": "3.306.0", - "@aws-sdk/credential-provider-process": "3.306.0", - "@aws-sdk/credential-provider-sso": "3.306.0", - "@aws-sdk/credential-provider-web-identity": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.315.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -378,20 +379,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.306.0.tgz", - "integrity": "sha512-HYuMmABRzbVWo03CElRUa+T+yenyUmLkwNCVAAvIRmbr9TnLT/bJbplXpUSzgSCS6T3TgwbQ9zf9xY9tX+gHzA==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.315.0.tgz", + "integrity": "sha512-OuzKAIg+xPAzBrb/Big5VKDpJmBhVR+N0Hfflrjj2BunQGWO7zxtkKFCz921MtP9ZunDV+UxzTpar8U5TAPtzA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.306.0", - "@aws-sdk/credential-provider-imds": "3.306.0", - "@aws-sdk/credential-provider-ini": "3.306.0", - "@aws-sdk/credential-provider-process": "3.306.0", - "@aws-sdk/credential-provider-sso": "3.306.0", - "@aws-sdk/credential-provider-web-identity": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.315.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.315.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -399,14 +400,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.306.0.tgz", - "integrity": "sha512-2RezGskHqJeHtGbK7CqhGNAoqXgQJb7FfPFqwUQ9oVDZS8f145jVwajjHcc7Qn3IwGoqylMF3uXIljUv89uDzA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz", + "integrity": "sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -414,16 +415,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.306.0.tgz", - "integrity": "sha512-6msBUisMdOzk0ywJQNunZIb0rVMaA6GTx7ek8aCuWInX+lJm0oEPPVp+b3ewwVheih1rRC2bgNk8eAjfC9YcKw==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.315.0.tgz", + "integrity": "sha512-oMDGwT67cLgLiLEj5UwAiOVo7mb0l4vi2nk+5pgPMpC3cBlAfA0y1IJe4FHp+Vz52F0nvURZZbdWhX6RgMMaqQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/token-providers": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/client-sso": "3.315.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/token-providers": "3.315.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -431,13 +432,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.306.0.tgz", - "integrity": "sha512-MOQGQaOtdo4zLQZ1bRjD2n1PUzfNty+sKe+1wlm5bIqTN93UX3S8f0QznucZr7uJxI4Z14ZLwuYeAUV4Tgchlw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz", + "integrity": "sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -445,24 +446,24 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.306.0.tgz", - "integrity": "sha512-QKICU6m3onOSuANJfElKFSAZYI4CqJY9X4gtsebPN8ueroT1LEMgd2GdGodyLgbVa2sxze39IfKNC5+gASk3Bg==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.315.0.tgz", + "integrity": "sha512-zAChVtxAADhnNFTVA7uRijisSZEJQi10LQ4tsznzset4D6nC+FrZfqZBzO4EkfcyesqOaRbrV4VU6+gm4nzHTQ==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.306.0", - "@aws-sdk/client-sso": "3.306.0", - "@aws-sdk/client-sts": "3.306.0", - "@aws-sdk/credential-provider-cognito-identity": "3.306.0", - "@aws-sdk/credential-provider-env": "3.306.0", - "@aws-sdk/credential-provider-imds": "3.306.0", - "@aws-sdk/credential-provider-ini": "3.306.0", - "@aws-sdk/credential-provider-node": "3.306.0", - "@aws-sdk/credential-provider-process": "3.306.0", - "@aws-sdk/credential-provider-sso": "3.306.0", - "@aws-sdk/credential-provider-web-identity": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/client-cognito-identity": "3.315.0", + "@aws-sdk/client-sso": "3.315.0", + "@aws-sdk/client-sts": "3.315.0", + "@aws-sdk/credential-provider-cognito-identity": "3.315.0", + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.315.0", + "@aws-sdk/credential-provider-node": "3.315.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.315.0", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -470,27 +471,27 @@ } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.306.0.tgz", - "integrity": "sha512-T8OODOnPpDqkXS+XSMIkd6hf90h833JLN93wq3ibbyD/WvGveufFFHsbsNyccE9+CSv/BjEuN5QbHqTKTp3BlA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz", + "integrity": "sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/querystring-builder": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-base64": "3.303.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.306.0.tgz", - "integrity": "sha512-EcSLd6gKoDEEBPZqEv+Ky9gIyefwyyrAJGILGKoYBmcOIY7Y0xKId0hxCa9/1xvWTaVC1u+rA06DGgksZOa78w==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz", + "integrity": "sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-buffer-from": "3.303.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -498,19 +499,19 @@ } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.306.0.tgz", - "integrity": "sha512-9Mkcr+qG7QR4R5bJcA8bBNd8E2x6WaZStsQ3QeFbdQr3V3Tunvra/KlCFsEL55GgU8BZt5isOaHqq7uxs5ILtQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz", + "integrity": "sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.303.0.tgz", - "integrity": "sha512-IitBTr+pou7v5BrYLFH/SbIf3g1LIgMhcI3bDXBq2FjzmDftj4bW8BOmg05b9YKf2TrrggvJ4yk/jH+yYFXoJQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -520,13 +521,13 @@ } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.306.0.tgz", - "integrity": "sha512-JbONf2Ms+/DVRcpFNsKGdOQU94Js56KV+AhlPJmCwLxfyWvQjTt0KxFC1Dd+cjeNEXUduvBarrehgsqFlWnoHQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.310.0.tgz", + "integrity": "sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -534,15 +535,15 @@ } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.306.0.tgz", - "integrity": "sha512-i3QRiwgkcsuVN55O7l8I/QGwCypGRZXdYkPjU56LI2w2oiZ82f/nVMNXVc+ZFm2YH7WbCE+5jguw2J7HXdOlyQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz", + "integrity": "sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==", "optional": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/url-parser": "3.306.0", - "@aws-sdk/util-middleware": "3.306.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -550,13 +551,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.306.0.tgz", - "integrity": "sha512-mHDHK9E+c7HwMlrCJ+VFSB6tkq8oJVkYEHCvPkdrnzN/g9P/d/UhPIeGapZXMbAIZEaLpEGqs536mYzeRKZG8A==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.310.0.tgz", + "integrity": "sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -564,12 +565,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.306.0.tgz", - "integrity": "sha512-1FRHp/QB0Lb+CgP+c9CYW6BZh+q+5pnuOKo/Rd6hjYiM+kT1G/cWdXnMJQBR4rbTCTixbqCnObNJ1EyP/ofQhQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz", + "integrity": "sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -577,13 +578,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.306.0.tgz", - "integrity": "sha512-Hpj42ZLmwCy/CtVxi57NTeOEPoUJlivF3VIgowZ9JhaF61cakVKyrJ+f3jwXciDUtuYrdKm5Wf6prW6apWo0YA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz", + "integrity": "sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -591,16 +592,16 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.306.0.tgz", - "integrity": "sha512-eMyfr/aeurXXDz4x+WVrvLI8fVDP6klJOjziBEWZ/MUNP/hTFhkiQsMVbvT6O4Pspp7+FgCSdcUPG6Os2gK+CQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz", + "integrity": "sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/service-error-classification": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-middleware": "3.306.0", - "@aws-sdk/util-retry": "3.306.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/service-error-classification": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -609,13 +610,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.306.0.tgz", - "integrity": "sha512-2rSAR3nc5faYuEnh1KxQMCMCkEkJyaDfA3zwWLqZ+/TBCH0PlPkBv+Z9yXmteEki0vI5Hr+e+atTutJZoyG13g==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.310.0.tgz", + "integrity": "sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -623,12 +624,12 @@ } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.306.0.tgz", - "integrity": "sha512-M3gyPLPduZXMvdgt4XEpVO+3t0ZVPdgeQQwG6JnXv0dgyUizshYs4lrVOAb1KwF6StsmkrAgSN+I273elLiKjA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz", + "integrity": "sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -636,16 +637,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.306.0.tgz", - "integrity": "sha512-JhpSriN4xa4a/p5gAPL0OWFKJF4eWYU3K+LLlXBNGMbxg/qNL4skgT4dMFe3ii9EW8kI+r6tpvSgC+lP7/Tyng==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.310.0.tgz", + "integrity": "sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/signature-v4": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-middleware": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -653,9 +654,9 @@ } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.306.0.tgz", - "integrity": "sha512-G//a6MVSxyFVpOMZ+dzT3+w7XblOd2tRJ5g+/okjn3pNBLbo5o9Hu33K/bz0SQjT/m5mU2F9m0wcdCPYbRPysg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz", + "integrity": "sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -665,14 +666,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.306.0.tgz", - "integrity": "sha512-tP6I+Lbs68muPfdMA6Rfc+8fYo49nEn9A3RMiOU2COClWsmiZatpbK9UYlqIOxeGB/s2jI7hXmQq6tT2LStLSg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.310.0.tgz", + "integrity": "sha512-x3IOwSwSbwKidlxRk3CNVHVUb06SRuaELxggCaR++QVI8NU6qD/l4VHXKVRvbTHiC/cYxXE/GaBDgQVpDR7V/g==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-endpoints": "3.306.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-endpoints": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -680,14 +681,14 @@ } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.306.0.tgz", - "integrity": "sha512-+m+ALxNx5E1zLPPijO1pAbT5tnofLzZFWlnSYBEiOIwzaRU44rLYDqAhgXJkMMbOECkffDrv6ym0oWJIwJI+DA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz", + "integrity": "sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -695,15 +696,15 @@ } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.306.0.tgz", - "integrity": "sha512-qvNSIVdGf0pnWEXsAulIqXk7LML25Zc1yxbujxoAj8oX5y+mDhzQdHKrMgc0FuI4RKoEd9px4DYoUbmTWrrxwA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.310.0.tgz", + "integrity": "sha512-irv9mbcM9xC2xYjArQF5SYmHBMu4ciMWtGsoHII1nRuFOl9FoT4ffTvEPuLlfC6pznzvKt9zvnm6xXj7gDChKg==", "optional": true, "dependencies": { - "@aws-sdk/abort-controller": "3.306.0", - "@aws-sdk/protocol-http": "3.306.0", - "@aws-sdk/querystring-builder": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/abort-controller": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -711,12 +712,12 @@ } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.306.0.tgz", - "integrity": "sha512-37PnbjpANjHys0Y+DVmKUz1JbSGZ/mAndZeplTUsFDUtbNwJRw/fDyWUvGC82JWB4gNSP5muWscFvetZnK2l8A==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz", + "integrity": "sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -724,12 +725,12 @@ } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.306.0.tgz", - "integrity": "sha512-6Z8bqB8Ydz/qG7+lJzjwsjIca2w2zp4nZ2HjxMoUm0NBbVXGDx7H9qy9eOUqEiCbdXbsfK2BmVQreLhFLt056Q==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz", + "integrity": "sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -737,13 +738,13 @@ } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.306.0.tgz", - "integrity": "sha512-kvz6fLwE4KojTxbphuo9JPwKKuhau2mmSurnqhtf77t9+0cOh2uzyYhIUtOFewpLj+qGoh4b2EODlJqczc7IKg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz", + "integrity": "sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-uri-escape": "3.303.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -751,12 +752,12 @@ } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.306.0.tgz", - "integrity": "sha512-YjOdLcyS/8sNkFPgnxyUx+cM/P2XFGCA2WjQ0e9AXX8xFFkmnY6U5w2EknQ5zyvKy+R/KAV0KAMJBUB+ofjg0A==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz", + "integrity": "sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -764,21 +765,21 @@ } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.306.0.tgz", - "integrity": "sha512-lmXIVHWU5J60GmmTgyj79kupWYg5ntyNrUPt1P9FYTsXz+tdk4YYH7/2IxZ1XjBr4jEsN56gfSI0cfT07ztQJA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz", + "integrity": "sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==", "optional": true, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.306.0.tgz", - "integrity": "sha512-mDmBRN+Y0+EBD5megId97UIJGV/rmRsAds22qy0mmVdD3X7qlxn974btXVgfZyda6qw/pX6hgi8X99Qj6Wjb0w==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz", + "integrity": "sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -786,17 +787,17 @@ } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.306.0.tgz", - "integrity": "sha512-yoQTo6wLirKHg34Zhm8tKmfEaK8fOn+psVdMtRs2vGq3uzKLb+YW5zywnujoVwBvygQTWxiDMwRxDduWAisccA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz", + "integrity": "sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.303.0", - "@aws-sdk/types": "3.306.0", - "@aws-sdk/util-hex-encoding": "3.295.0", - "@aws-sdk/util-middleware": "3.306.0", - "@aws-sdk/util-uri-escape": "3.303.0", - "@aws-sdk/util-utf8": "3.303.0", + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -804,13 +805,13 @@ } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.306.0.tgz", - "integrity": "sha512-AFdNkto0Md6laio9t70WtvocoZqVcAydbY5csimXQh+lhKVmy/C+ZcKarDvaa0JD6PjSHb4snYzcINFpHW5LJQ==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.315.0.tgz", + "integrity": "sha512-qTm0lwTh6IZMiWs3U9k2veoF6gV9yE0B9Z34yMxagOfQFQgxMih0aiH25MD25eRigjJ3sfUeZ+B0mRycmJZdkQ==", "optional": true, "dependencies": { - "@aws-sdk/middleware-stack": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -818,15 +819,15 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.306.0.tgz", - "integrity": "sha512-GQlUx9u+fHLjOJedudLM//j7RSZAip57n59bjn/I3TRVjDs065opNu2xSWMPm1n46kPx6VA5z+DktvuFeAblxQ==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.315.0.tgz", + "integrity": "sha512-EjLUQ9JLqU3eJfJyzpcVjFnuJ1MCCodZaVJmuX/a/as4TK41bKMvkVojjsU7pDSYzl+tuXE+ceivcWK4H0HQdQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/shared-ini-file-loader": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/client-sso-oidc": "3.315.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -834,9 +835,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.306.0.tgz", - "integrity": "sha512-RnyknWWpQcRmNH7AsNr89sdhOoltCU/4YEwBMw34Eh+/36l7HfA5PdEKbsOkO7MO4+2g5qmmm/AHcnHRvymApg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz", + "integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -846,23 +847,23 @@ } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.306.0.tgz", - "integrity": "sha512-mhyOjtycZgxKYo2CoDhDQONuRd5TLfEwmyGWVgFrfubF0LejQ3rkBRLC5zT9TBZ8RJHNlqU2oGdsZCy3JV6Rlw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz", + "integrity": "sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==", "optional": true, "dependencies": { - "@aws-sdk/querystring-parser": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/querystring-parser": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-base64": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.303.0.tgz", - "integrity": "sha512-oj+p/GHHPcZEKjiiOHU/CyNQeh8i+8dfMMzU+VGdoK5jHaVG8h2b+V7GPf7I4wDkG2ySCK5b5Jw5NUHwdTJ13Q==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.303.0", + "@aws-sdk/util-buffer-from": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -870,18 +871,18 @@ } }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.303.0.tgz", - "integrity": "sha512-T643m0pKzgjAvPFy4W8zL+aszG3T22U8hb6stlMvT0z++Smv8QfIvkIkXjWyH2KlOt5GKliHwdOv8SAi0FSMJQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", "optional": true, "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.303.0.tgz", - "integrity": "sha512-/hS8z6e18Le60hJr2TUIFoUjUiAsnQsuDn6DxX74GXhMOHeSwZDJ9jHF39quYkNMmAE37GrVH4MI9vE0pN27qw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -891,12 +892,12 @@ } }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.303.0.tgz", - "integrity": "sha512-hUU+NW+SW6RNojtAKnnmz+tDShVKlEx2YsS4a5fSfrKRUes+zWz10cxVX0RQfysd3R6tdSHhbjsSj8eCIybheg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.303.0", + "@aws-sdk/is-array-buffer": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -904,9 +905,9 @@ } }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.295.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.295.0.tgz", - "integrity": "sha512-/5Dl1aV2yI8YQjqwmg4RTnl/E9NmNsx7HIwBZt+dTcOrM0LMUwczQBFFcLyqCj/qv5y+VsvLoAAA/OiBT7hb3w==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -916,13 +917,13 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.306.0.tgz", - "integrity": "sha512-XczPC/klGngMNDcNvThloyeKoPoG61ts1tZVcDbyRaOqmoMH80fn+c6Ah4A/BPzbo8wm1MIA9kqeJI0ypps6qQ==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.315.0.tgz", + "integrity": "sha512-5cqNvfGos3FB/MHNl+g2fr+tPY7s3k3+96V3wOPWLOksdACth10OxPpHfboXXZDHHkR0hmyJwJcfgA4uQrUcGg==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -931,16 +932,16 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.306.0.tgz", - "integrity": "sha512-0hs/cS7Pu4sEO78n0Uv7ybBEFq5j23TOu3QNH+YMzF8n4yuQtaMwNM8DI2s03/pVGXYsPzO7036jREGcu+enXw==", + "version": "3.315.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.315.0.tgz", + "integrity": "sha512-vSPIGpzh6NJIMLoh31p7CczSatN46kJdJBrHfODHaIGe4t156x+LfkkcxGQhtifqxglhL7l+fmn5D1fM5exHuA==", "optional": true, "dependencies": { - "@aws-sdk/config-resolver": "3.306.0", - "@aws-sdk/credential-provider-imds": "3.306.0", - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/property-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -948,12 +949,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.306.0.tgz", - "integrity": "sha512-aPTqU4VGhec8LDhKZrfA3/sBHTYRa0favKEo8aEa/vIZJTNBAFlUhvr5z7peAr8gBOtZZcElzX8PiK3jjn3ILw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.310.0.tgz", + "integrity": "sha512-zG+/d/O5KPmAaeOMPd6bW1abifdT0H03f42keLjYEoRZzYtHPC5DuPE0UayiWGckI6BCDgy0sRKXCYS49UNFaQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -961,9 +962,9 @@ } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.295.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.295.0.tgz", - "integrity": "sha512-XJcoVo41kHzhe28PBm/rqt5mdCp8R6abwiW9ug1dA6FOoPUO8kBUxDv6xaOmA2hfRvd2ocFfBXaUCBqUowkGcQ==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -973,9 +974,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.295.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.295.0.tgz", - "integrity": "sha512-d/s+zhUx5Kh4l/ecMP/TBjzp1GR/g89Q4nWH6+wH5WgdHsK+LG+vmsk6mVNuP/8wsCofYG4NBqp5Ulbztbm9QA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -985,9 +986,9 @@ } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.306.0.tgz", - "integrity": "sha512-14CSm1mTrfSNBGbkZu8vSjXYg7DUMfZc74IinOajcFtTswa/6SyiyhU9DK0a837qqwxSfFGpnE2thVeJIF/7FA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz", + "integrity": "sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -997,12 +998,12 @@ } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.306.0.tgz", - "integrity": "sha512-zcgTEIehQAIAm4vBNWfXZpDNbIrDM095vZmpbozQwK/pfDqMGvq7j3r9atKuEGTtoomoGoYwj3x/KEhO6JXJLg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz", + "integrity": "sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==", "optional": true, "dependencies": { - "@aws-sdk/service-error-classification": "3.306.0", + "@aws-sdk/service-error-classification": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -1010,9 +1011,9 @@ } }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.303.0.tgz", - "integrity": "sha512-N3ULNuHCL3QzAlCTY+XRRkRQTYCTU8RRuzFCJX0pDpz9t2K+tLT7DbxqupWGNFGl5Xlulf1Is14J3BP/Dx91rA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1022,24 +1023,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.306.0.tgz", - "integrity": "sha512-uZAtpvCasUdWRlB/nEjN0gf6G7810hT50VyWjpd6mQW78myV8M5fu/R03UFAZ+D8fhqqIdzR/IXDY1QUGp8bCA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz", + "integrity": "sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.306.0", + "@aws-sdk/types": "3.310.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.306.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.306.0.tgz", - "integrity": "sha512-zLp9wIx7FZ0qFLimYW3lJ1uJM5gqxmmcQjNimUaUq/4a1caDkaiF/QeyyMFva+wIjyHRv22P5abUBjIEZrs5WA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz", + "integrity": "sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.306.0", - "@aws-sdk/types": "3.306.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -1055,12 +1056,12 @@ } }, "node_modules/@aws-sdk/util-utf8": { - "version": "3.303.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.303.0.tgz", - "integrity": "sha512-tZXVuMOIONPOuOGBs/XRdzxv6jUvTM620dRFFIHZwlGiW8bo0x0LlonrzDAJZA4e9ZwmxJIj8Ji13WVRBGvZWg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.303.0", + "@aws-sdk/util-buffer-from": "3.310.0", "tslib": "^2.5.0" }, "engines": { @@ -1118,9 +1119,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz", + "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1237,6 +1238,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1248,6 +1269,11 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -1578,6 +1604,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dependencies": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1653,6 +1707,11 @@ "node": ">=7.6" } }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1711,9 +1770,9 @@ } }, "node_modules/mongodb": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.15.0.tgz", - "integrity": "sha512-1iM2fF2fSNVrecOq4pW9zaJHFNuk63RX3SsppIjC2df8JkBv6odGOIu9FuqnI6gQD0KAF2az4zZdQdabqGSLDQ==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", + "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==", "dependencies": { "bson": "^4.7.2", "mongodb-connection-string-url": "^2.5.4", @@ -1749,6 +1808,14 @@ "node": ">= 0.6" } }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, "node_modules/node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -1822,6 +1889,14 @@ "node": ">= 0.8" } }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1904,6 +1979,14 @@ "node": ">= 0.8" } }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2013,6 +2096,14 @@ "npm": ">= 3.0.0" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -2078,6 +2169,17 @@ "node": ">= 0.6" } }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2086,6 +2188,11 @@ "node": ">= 0.8" } }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 0d4e876..09d026f 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "compression": "^1.7.4", "express": "^4.18.2", "express-rate-limit": "^6.7.0", + "html-minifier": "^4.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1", -- 2.34.1 From ca690c7a7ef80de398eabefce1273a51a1a8d195 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 18 Apr 2023 20:56:05 +0100 Subject: [PATCH 55/95] Add html-minifier for outgoing email Signed-off-by: Fred Boniface --- src/utils/auth.utils.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index 0864137..52b67bd 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -2,6 +2,7 @@ const log = require('../utils/log.utils'); const crypto = require('crypto') const db = require('../services/dbAccess.services'); const fs = require('fs/promises') +const minify = require('html-minifier').minify; // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing @@ -32,13 +33,16 @@ async function generateKey() { // Needs testing & moving to 'register.utils' async function generateConfirmationEmail(eml, uuid) { try { - let htmlTpl = fs.readFile('mail-templates/register.html', 'utf-8'); + let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8'); + let minify = await minify(((htmlTpl).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Tue, 18 Apr 2023 21:21:09 +0100 Subject: [PATCH 56/95] Comments Signed-off-by: Fred Boniface --- src/utils/auth.utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index 52b67bd..dce8f75 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -34,7 +34,7 @@ async function generateKey() { // Needs testing & moving to 'register.utils' async function generateConfirmationEmail(eml, uuid) { try { let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8'); - let minify = await minify(((htmlTpl).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Tue, 18 Apr 2023 21:47:27 +0100 Subject: [PATCH 57/95] Prepare to move minification into separate module Signed-off-by: Fred Boniface --- mail-templates/register.html | 16 ++++++++-------- src/utils/auth.utils.js | 3 ++- src/utils/minify.utils.js | 5 +++++ 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 src/utils/minify.utils.js diff --git a/mail-templates/register.html b/mail-templates/register.html index 1e5ab21..a329335 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -1,32 +1,32 @@ - + OwlBoard - Register

-
- +
+
- +
-

Register for OwlBoard

+

Register for OwlBoard


Use the link below to register for OwlBoard (Staff Version)


- Register + Register


Alternatively copy and paste the link "https://owlboard.info/auth.html?key=>>ACCESSCODE<<

This registration is for one device only, you can register again using the diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index dce8f75..dbb5cc0 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -35,7 +35,8 @@ async function generateConfirmationEmail(eml, uuid) { try { let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8'); let mini = minify(((htmlTpl).replace(/>>ACCESSCODE< Date: Wed, 19 Apr 2023 20:45:54 +0100 Subject: [PATCH 58/95] Remove inline style from email template Signed-off-by: Fred Boniface --- mail-templates/register.html | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index a329335..421a73b 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -6,27 +6,51 @@ html { background-color:#404c55; background-image:radial-gradient(#2b343c,#404c55); + text-align: center; } a { color:white; } + table { + width: 100%; + color: white; + font-family: sans-serif; + } + #title { + height: 100px; + padding-top: 0px; + margin-top: 0px + } + h1 { + color: #00b7b7; + } + #button { + color: azure; + font-size: larger; + background-color: #007979; + padding: 8px; + padding-left: 12px; + padding-right: 12px; + text-decoration: none; + border-radius: 14px; + }

- +
- +
-

Register for OwlBoard

+

Register for OwlBoard


Use the link below to register for OwlBoard (Staff Version)


- Register + Register


Alternatively copy and paste the link "https://owlboard.info/auth.html?key=>>ACCESSCODE<<

This registration is for one device only, you can register again using the -- 2.34.1 From bac26131201dc5d54c0a4fb7d71bac01b1912185 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 19 Apr 2023 20:47:01 +0100 Subject: [PATCH 59/95] Add linebreak before text link Signed-off-by: Fred Boniface --- mail-templates/register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 421a73b..dbdda08 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -52,7 +52,7 @@
Register


-

Alternatively copy and paste the link "https://owlboard.info/auth.html?key=>>ACCESSCODE<<

+

Alternatively copy and paste the link:
"https://owlboard.info/auth.html?key=>>ACCESSCODE<<

This registration is for one device only, you can register again using the same email address for other devices and access OwlBoard from both.

-- 2.34.1 From 535d4924434df6da199b9c8553ce96b3a1406ccd Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 19 Apr 2023 20:51:57 +0100 Subject: [PATCH 60/95] Add minifyCSS option to html-minifier Signed-off-by: Fred Boniface --- src/utils/auth.utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index dbb5cc0..da5c254 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -36,7 +36,8 @@ async function generateConfirmationEmail(eml, uuid) { let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8'); let mini = minify(((htmlTpl).replace(/>>ACCESSCODE< Date: Fri, 21 Apr 2023 19:55:24 +0100 Subject: [PATCH 61/95] Add notes Signed-off-by: Fred Boniface --- src/utils/auth.utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index da5c254..a4bd442 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -40,7 +40,7 @@ async function generateConfirmationEmail(eml, uuid) { minifyCSS: true }); let txtTpl = fs.readFile('mail-templates/register.txt', 'utf-8'); - return msg = { + return msg = { // CSS Needs to be inlined. See css-inline, or css-inliner to: eml, subject: "OwlBoard Registration", text: (await txtTpl).replace(/>>ACCESSCODE< Date: Fri, 21 Apr 2023 16:08:18 +0100 Subject: [PATCH 62/95] Add notes Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index d68465f..8b85c27 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -74,7 +74,7 @@ async function delRegReq(uuid) { module.exports = { query, - increment, + increment, // Probqbly doesn't need exporting? addUser, userAtime, addRegReq, -- 2.34.1 From 038670acf27d418d2f49252001eb942eef63fdba Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 21 Apr 2023 16:15:33 +0100 Subject: [PATCH 63/95] Add pis.services Signed-off-by: Fred Boniface --- src/services/pis.services.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/services/pis.services.js diff --git a/src/services/pis.services.js b/src/services/pis.services.js new file mode 100644 index 0000000..4bbc69d --- /dev/null +++ b/src/services/pis.services.js @@ -0,0 +1,16 @@ +// Finds PIS Codes using DB Lookups + +const db = require('../services/dbAccess.services') +const log = require('../utils/log.utils') + +async function findPisByOrigDest(start,end) { + log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") + /* Here, I need to query the collection for a document with a stops array starting with $start + and ending with $end. This will return an array of one or more pis codes and stopping patterns*/ + const search = db.query("pis", {query:query}) + return search +} + +module.exports = { + findPisByOrigDest +} \ No newline at end of file -- 2.34.1 From 0d207050b2a2722ce1316d61e545b059b638ea0b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 21 Apr 2023 16:16:14 +0100 Subject: [PATCH 64/95] Add notes Signed-off-by: Fred Boniface --- src/services/pis.services.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 4bbc69d..4df4595 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -11,6 +11,8 @@ async function findPisByOrigDest(start,end) { return search } +// Hopefully at some point, I will also be able to implement a find PIS code by headcode option. + module.exports = { findPisByOrigDest } \ No newline at end of file -- 2.34.1 From 5da7a951e320b0d9126e2ae4176392756c59ddab Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 21 Apr 2023 21:12:49 +0100 Subject: [PATCH 65/95] Add search query for findPisByOrigDest Signed-off-by: Fred Boniface --- src/services/pis.services.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 4df4595..54cea13 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -7,7 +7,11 @@ async function findPisByOrigDest(start,end) { log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") /* Here, I need to query the collection for a document with a stops array starting with $start and ending with $end. This will return an array of one or more pis codes and stopping patterns*/ - const search = db.query("pis", {query:query}) + // Query to find first stop: {$expr:{$eq:[{$first:"$stops"},start]}} + // Query to find end stop: {$expr:{$eq:[{$last:"$stops"},end]}} + // Attempt at combining the queries: + // {$and:[{$expr:{$eq:[{$first:"$stops"},start]}},{$expr:{$eq:[{$last:"$stops"},end]}}]} + const search = db.query("pis", {$and:[{$expr:{$eq:[{$first:"$stops"},start]}},{$expr:{$eq:[{$last:"$stops"},end]}}]}) return search } -- 2.34.1 From 121528c413e7b4dbc09a235426f1541db2632a35 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 21 Apr 2023 21:28:13 +0100 Subject: [PATCH 66/95] implement /pis endpoint Signed-off-by: Fred Boniface --- app.js | 2 ++ src/controllers/pis.controllers.js | 17 +++++++++++++++++ src/routes/pis.routes.js | 7 +++++++ 3 files changed, 26 insertions(+) create mode 100644 src/controllers/pis.controllers.js create mode 100644 src/routes/pis.routes.js diff --git a/app.js b/app.js index 3303e8b..caa74ec 100644 --- a/app.js +++ b/app.js @@ -26,6 +26,7 @@ const findRtr = require('./src/routes/find.routes'); // /find endpoint const issueRtr = require('./src/routes/issue.routes'); // /issue endpoints const statRtr = require('./src/routes/stats.routes'); // /stat endpoints const regRtr = require('./src/routes/registration.routes'); // /registration endpoints +const pisRtr = require('./src/routes/pis.routes'); // /pis endpoints // Set Server Configurations const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" @@ -72,6 +73,7 @@ app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); app.use('/api/v1/stats', statRtr); app.use('/api/v1/register', regRtr); +app.use('/api/v1/pis', pisRtr) // Authented Routes app.use('/api/v1/ldbs', authenticate) diff --git a/src/controllers/pis.controllers.js b/src/controllers/pis.controllers.js new file mode 100644 index 0000000..3971837 --- /dev/null +++ b/src/controllers/pis.controllers.js @@ -0,0 +1,17 @@ +const pis = require('../services/pis.services'); + +async function byOrigDest(req, res, next){ + try { + let start = req.params.start + let end = req.params.end + res.json(await pis.findPisByOrigDest(start,end)) + } catch (err) { + console.error(`Unknown Error`, err.message); + next(err); + } +} + + +module.exports = { + byOrigDest +} \ No newline at end of file diff --git a/src/routes/pis.routes.js b/src/routes/pis.routes.js new file mode 100644 index 0000000..70fa609 --- /dev/null +++ b/src/routes/pis.routes.js @@ -0,0 +1,7 @@ +const express = require('express'); +const router = express.Router(); +const pisController = require('../controllers/pis.controllers'); + +router.get('/origdest/:start/:end', pisController.byOrigDest); + +module.exports = router; \ No newline at end of file -- 2.34.1 From 417a88adb32933d57f61107ae1417d337dc237f5 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 22 Apr 2023 22:30:00 +0100 Subject: [PATCH 67/95] Lower case the API input Signed-off-by: Fred Boniface --- src/services/pis.services.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 54cea13..1f224a4 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -3,15 +3,11 @@ const db = require('../services/dbAccess.services') const log = require('../utils/log.utils') -async function findPisByOrigDest(start,end) { +async function findPisByOrigDest(start,end) { // Probably need to add a sanitize here log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") - /* Here, I need to query the collection for a document with a stops array starting with $start - and ending with $end. This will return an array of one or more pis codes and stopping patterns*/ - // Query to find first stop: {$expr:{$eq:[{$first:"$stops"},start]}} - // Query to find end stop: {$expr:{$eq:[{$last:"$stops"},end]}} - // Attempt at combining the queries: - // {$and:[{$expr:{$eq:[{$first:"$stops"},start]}},{$expr:{$eq:[{$last:"$stops"},end]}}]} - const search = db.query("pis", {$and:[{$expr:{$eq:[{$first:"$stops"},start]}},{$expr:{$eq:[{$last:"$stops"},end]}}]}) + const firstCrs = start.toLowerCase() + const lastCrs = end.toLowerCase() + const search = db.query("pis", {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]}) return search } -- 2.34.1 From 0596bd48e63bd5e42743885febacb3c9bed07088 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sat, 22 Apr 2023 22:32:55 +0100 Subject: [PATCH 68/95] Add basic sanitizing step to PIS API Signed-off-by: Fred Boniface --- src/services/pis.services.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 1f224a4..3ee34fe 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -2,11 +2,12 @@ const db = require('../services/dbAccess.services') const log = require('../utils/log.utils') +const clean = require('../utils/sanitizer.utils') -async function findPisByOrigDest(start,end) { // Probably need to add a sanitize here +async function findPisByOrigDest(start,end) { log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") - const firstCrs = start.toLowerCase() - const lastCrs = end.toLowerCase() + const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) + const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) const search = db.query("pis", {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]}) return search } -- 2.34.1 From b66254213e634733754e6e45337dcec0a56147e7 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 01:05:24 +0100 Subject: [PATCH 69/95] Adjust PIS query Signed-off-by: Fred Boniface --- src/services/pis.services.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 3ee34fe..d7f6891 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -8,7 +8,9 @@ async function findPisByOrigDest(start,end) { log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) - const search = db.query("pis", {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]}) + const query = {stops: {$elemMatch: {$eq: firstCrs, $position: 0}}, stops: {$elemMatch: {$eq: lastCrs, $position: {$exists: false}}}} + const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} + const search = db.query("pis", query) return search } -- 2.34.1 From 201f1d06427631c058c3c512f2cf9cb6444f7a9e Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 01:16:48 +0100 Subject: [PATCH 70/95] Adjust sanitizer functions, tidy mongo queries. Signed-off-by: Fred Boniface --- src/services/pis.services.js | 17 ++++++++++++++++- src/utils/ldb.utils.js | 10 ++++++++-- src/utils/sanitizer.utils.js | 17 ++++++++++++----- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index d7f6891..58861ed 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -8,7 +8,22 @@ async function findPisByOrigDest(start,end) { log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) - const query = {stops: {$elemMatch: {$eq: firstCrs, $position: 0}}, stops: {$elemMatch: {$eq: lastCrs, $position: {$exists: false}}}} + const query = { + stops: { + $elemMatch: { + $eq: firstCrs, + $position: 0 + } + }, + stops: { + $elemMatch: { + $eq: lastCrs, + $position: { + $exists: false + } + } + } + } const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} const search = db.query("pis", query) return search diff --git a/src/utils/ldb.utils.js b/src/utils/ldb.utils.js index c6c25e4..fa6882d 100644 --- a/src/utils/ldb.utils.js +++ b/src/utils/ldb.utils.js @@ -4,8 +4,14 @@ const san = require('../utils/sanitizer.utils') // Sanitiser async function checkCrs(input){ var INPUT = input.toUpperCase() - log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, "dbug") - var query = {'$or':[{'3ALPHA':INPUT},{'TIPLOC':INPUT},{'STANOX':INPUT}]}; + log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, "info") + var query = { + '$or':[ + {'3ALPHA':INPUT}, + {'TIPLOC':INPUT}, + {'STANOX':INPUT} + ] + }; var result = await db.query("stations", query) log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, "dbug") return result diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index 491188f..55fa00a 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -16,6 +16,14 @@ string.addDash("@abcd efgh"); // @abcd-efgh string.removeSpace("@abcd efgh"); // @abcdefgh */ +function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module + return inputString.replace(/[^a-zA-Z0-9]/g, ''); +} + +function removeNonAlpha(inputString) { // Should be able to replace sanitizer module + return inputString.replace(/[^a-zA-Z]/g, ''); + } + function cleanApiEndpointTxt(input) { var output = clean.sanitize.keepSpace(input) if (output != input){ @@ -32,11 +40,10 @@ function cleanApiEndpointNum(input) { return output } -function cleanNrcc(input) { - var rmNewline = input.replace(/[\n\r]/g, ""); // Remove newlines - var rmPara = rmNewline.replace(/<\/?p[^>]*>/g, ""); // Remove

&

- return rmPara; -} +function cleanNrcc(input) { // Remove newlines and then

tags from input + const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, ''); + return cleanInput; + } async function getDomainFromEmail(mail) { // Needs testing split = mail.split("@") -- 2.34.1 From 43dba624341b9d63083bb551a8d9e7ce282f8c3b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 01:18:41 +0100 Subject: [PATCH 71/95] Remove comments Signed-off-by: Fred Boniface --- src/utils/sanitizer.utils.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index 55fa00a..245b1ee 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -1,21 +1,6 @@ const clean = require('string-sanitizer-fix'); const log = require('../utils/log.utils'); -/* -string.sanitize("a.bc@d efg#h"); // abcdefgh -string.sanitize.keepSpace("a.bc@d efg#h"); // abcd efgh -string.sanitize.keepUnicode("a.bc@d efg#hক"); // abcd efghক -string.sanitize.addFullstop("a.bc@d efg#h"); // abcd.efgh -string.sanitize.addUnderscore("a.bc@d efg#h"); // abcd_efgh -string.sanitize.addDash("a.bc@d efg#h"); // abcd-efgh -string.sanitize.removeNumber("@abcd efgh123"); // abcdefgh -string.sanitize.keepNumber("@abcd efgh123"); // abcdefgh123 -string.addFullstop("abcd efgh"); // abcd.efgh -string.addUnderscore("@abcd efgh"); // @abcd_efgh -string.addDash("@abcd efgh"); // @abcd-efgh -string.removeSpace("@abcd efgh"); // @abcdefgh -*/ - function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module return inputString.replace(/[^a-zA-Z0-9]/g, ''); } -- 2.34.1 From 6ca8de8c75499d136e3951db25ab60309bcbb16c Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 01:33:15 +0100 Subject: [PATCH 72/95] Again, adjust PIS query Signed-off-by: Fred Boniface --- src/services/pis.services.js | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 58861ed..89fb87d 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -10,22 +10,20 @@ async function findPisByOrigDest(start,end) { const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) const query = { stops: { - $elemMatch: { - $eq: firstCrs, - $position: 0 - } - }, - stops: { - $elemMatch: { - $eq: lastCrs, - $position: { - $exists: false - } - } + $all: [ + { $elemMatch: { $eq: firstCrs } }, + { $elemMatch: { $eq: lastCrs } } + ] + }, + $expr: { + $eq: [ + { $arrayElemAt: [ "$stops", 0 ] }, + firstCrs + ] + } } - } const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} - const search = db.query("pis", query) + const search = db.query("pis", oldQuery) return search } -- 2.34.1 From 49bb0627e9a250a936222ee4ee2fa12a3183c2df Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 10:39:58 +0100 Subject: [PATCH 73/95] Test new PIS Query Signed-off-by: Fred Boniface --- src/services/pis.services.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 89fb87d..fb6ce8e 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -22,8 +22,8 @@ async function findPisByOrigDest(start,end) { ] } } - const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} - const search = db.query("pis", oldQuery) + //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} + const search = db.query("pis", query) return search } -- 2.34.1 From 1c944e9ae187f3c86f192eea56b64e8e7559de21 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 10:46:10 +0100 Subject: [PATCH 74/95] Remove dependency: string-sanitizer-fix & npm update Signed-off-by: Fred Boniface --- package-lock.json | 5 ----- src/utils/sanitizer.utils.js | 12 +++++++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a9f6232..2d230bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2121,11 +2121,6 @@ "node": ">= 0.8" } }, - "node_modules/string-sanitizer-fix": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string-sanitizer-fix/-/string-sanitizer-fix-2.0.1.tgz", - "integrity": "sha512-I5RSqL5vDfKnoAbpFP2mU0QAh7Gc1KoeIg02N+5+NBfDB/MiSddgNNXfmWND7+BBwy3zub6s/ZWRbZICZKUA0g==" - }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index 245b1ee..ea238bf 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -1,4 +1,4 @@ -const clean = require('string-sanitizer-fix'); +//const clean = require('string-sanitizer-fix'); const log = require('../utils/log.utils'); function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module @@ -7,8 +7,12 @@ function removeNonAlphanumeric(inputString) { // Should be able to replace sani function removeNonAlpha(inputString) { // Should be able to replace sanitizer module return inputString.replace(/[^a-zA-Z]/g, ''); - } +} +const cleanApiEndpointTxt = removeNonAlpha +const cleanApiEndpointNum = removeNonAlphanumeric + +/* function cleanApiEndpointTxt(input) { var output = clean.sanitize.keepSpace(input) if (output != input){ @@ -24,7 +28,7 @@ function cleanApiEndpointNum(input) { } return output } - +*/ function cleanNrcc(input) { // Remove newlines and then

tags from input const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, ''); return cleanInput; @@ -38,6 +42,8 @@ async function getDomainFromEmail(mail) { // Needs testing module.exports = { cleanApiEndpointTxt, cleanApiEndpointNum, + removeNonAlpha, + removeNonAlphanumeric, cleanNrcc, getDomainFromEmail, } \ No newline at end of file -- 2.34.1 From 3017981090c7b08170be805ef0fbe7695ad9183b Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 24 Apr 2023 12:57:40 +0100 Subject: [PATCH 75/95] Adjust pis query to check last element Signed-off-by: Fred Boniface --- src/services/pis.services.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index fb6ce8e..60423b8 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -9,19 +9,19 @@ async function findPisByOrigDest(start,end) { const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) const query = { - stops: { - $all: [ - { $elemMatch: { $eq: firstCrs } }, - { $elemMatch: { $eq: lastCrs } } - ] - }, - $expr: { - $eq: [ - { $arrayElemAt: [ "$stops", 0 ] }, - firstCrs - ] - } - } + stops: { + $all: [ + { $elemMatch: { $eq: firstCrs } }, + { $elemMatch: { $eq: lastCrs } } + ] + }, + $expr: { + $and: [ + { $eq: [{ $arrayElemAt: [ "$stops", -1 ] }, lastCrs] }, + { $eq: [{ $arrayElemAt: [ "$stops", 0 ] }, firstCrs] } + ] + } + } //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} const search = db.query("pis", query) return search -- 2.34.1 From 04ffaafdd9d680398134310dd7d3ac34e7c107a8 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 28 Apr 2023 13:18:41 +0100 Subject: [PATCH 76/95] NPM Changes Signed-off-by: Fred Boniface --- package-lock.json | 3 +-- package.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d230bd..a11cf44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,7 @@ "html-minifier": "^4.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", - "nodemailer": "^6.9.1", - "string-sanitizer-fix": "^2.0.1" + "nodemailer": "^6.9.1" } }, "node_modules/@aws-crypto/ie11-detection": { diff --git a/package.json b/package.json index 09d026f..b79d47f 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "html-minifier": "^4.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", - "nodemailer": "^6.9.1", - "string-sanitizer-fix": "^2.0.1" + "nodemailer": "^6.9.1" }, "name": "owlboard", "description": "OwlBoard is an API and PWA for live rail departure board in the UK.", -- 2.34.1 From c22b6bf4ebb587c0cc37804b04381b2879fdc4c9 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sun, 30 Apr 2023 18:21:42 +0100 Subject: [PATCH 77/95] Add authentication to PIS route Signed-off-by: Fred Boniface --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index caa74ec..6999000 100644 --- a/app.js +++ b/app.js @@ -73,10 +73,10 @@ app.use('/api/v1/find', findRtr); app.use('/api/v1/issue', issueRtr); app.use('/api/v1/stats', statRtr); app.use('/api/v1/register', regRtr); -app.use('/api/v1/pis', pisRtr) // Authented Routes -app.use('/api/v1/ldbs', authenticate) +app.use('/api/v1/ldbs', authenticate, (req, res) => res.status(501).json({status: "Not Implemented", message: "This feature is not yet implemented due to upstream issues"})) +app.use('/api/v1/pis', authenticate, pisRtr) app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: "ok", message: "Authentication successful"})) // Returns 401 if auth failed, 200 if successful. // Number of proxies: -- 2.34.1 From 080a235c2be3bd8c9a1d673248d2961ff48eb41e Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sun, 30 Apr 2023 21:58:54 +0100 Subject: [PATCH 78/95] Add eslint Signed-off-by: Fred Boniface --- .eslintrc.js | 31 ++ package-lock.json | 908 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- 3 files changed, 943 insertions(+), 1 deletion(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..bf1e948 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + 'env': { + 'browser': true, + 'commonjs': true, + 'es2021': true + }, + 'extends': 'eslint:recommended', + 'overrides': [ + ], + 'parserOptions': { + 'ecmaVersion': 'latest' + }, + 'rules': { + 'indent': [ + 'error', + 4 + ], + 'linebreak-style': [ + 'error', + 'unix' + ], + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'never' + ] + } +} diff --git a/package-lock.json b/package-lock.json index a11cf44..05783a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,9 @@ "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1" + }, + "devDependencies": { + "eslint": "^8.39.0" } }, "node_modules/@aws-crypto/ie11-detection": { @@ -1076,6 +1079,176 @@ "tslib": "^2.3.1" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", @@ -1107,6 +1280,73 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1127,6 +1367,12 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1183,6 +1429,16 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "optional": true }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/bson": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", @@ -1301,6 +1557,12 @@ "node": ">= 0.8.0" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1352,6 +1614,20 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1360,6 +1636,12 @@ "ms": "2.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1385,6 +1667,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1403,6 +1697,185 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1482,6 +1955,24 @@ } ] }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fast-xml-parser": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", @@ -1498,6 +1989,27 @@ "url": "https://paypal.me/naturalintelligence" } }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -1515,6 +2027,41 @@ "node": ">= 0.8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -1563,6 +2110,12 @@ "node": ">= 0.6" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1581,6 +2134,59 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1592,6 +2198,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1676,6 +2291,50 @@ } ] }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1694,6 +2353,76 @@ "node": ">= 0.10" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/ldbs-json": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ldbs-json/-/ldbs-json-1.2.1.tgz", @@ -1768,6 +2497,18 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mongodb": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", @@ -1799,6 +2540,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1904,11 +2651,47 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1948,6 +2731,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -2060,6 +2863,27 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -2126,6 +2950,24 @@ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "optional": true }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2151,6 +2993,30 @@ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "optional": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2232,6 +3098,36 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -2251,6 +3147,18 @@ "engines": { "node": ">=4.0" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index b79d47f..eaab418 100644 --- a/package.json +++ b/package.json @@ -23,5 +23,8 @@ "url": "https://git.fjla.uk/owlboard/backend.git" }, "author": "Fred Boniface", - "license": "GPL-3.0-or-later" + "license": "GPL-3.0-or-later", + "devDependencies": { + "eslint": "^8.39.0" + } } -- 2.34.1 From c0c50d0e5bcd1e089b43dfed662f1678d2b49f6a Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sun, 30 Apr 2023 22:01:45 +0100 Subject: [PATCH 79/95] eslint fixes Signed-off-by: Fred Boniface --- src/services/pis.services.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/services/pis.services.js b/src/services/pis.services.js index 60423b8..f72050f 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -5,25 +5,25 @@ const log = require('../utils/log.utils') const clean = require('../utils/sanitizer.utils') async function findPisByOrigDest(start,end) { - log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, "dbug") + log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug') const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) const query = { - stops: { - $all: [ - { $elemMatch: { $eq: firstCrs } }, - { $elemMatch: { $eq: lastCrs } } - ] - }, - $expr: { - $and: [ - { $eq: [{ $arrayElemAt: [ "$stops", -1 ] }, lastCrs] }, - { $eq: [{ $arrayElemAt: [ "$stops", 0 ] }, firstCrs] } - ] - } + stops: { + $all: [ + { $elemMatch: { $eq: firstCrs } }, + { $elemMatch: { $eq: lastCrs } } + ] + }, + $expr: { + $and: [ + { $eq: [{ $arrayElemAt: [ '$stops', -1 ] }, lastCrs] }, + { $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] } + ] + } } //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} - const search = db.query("pis", query) + const search = db.query('pis', query) return search } -- 2.34.1 From 7580ff8175c14587474283042cc773c6e8d79ed1 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sun, 30 Apr 2023 22:07:36 +0100 Subject: [PATCH 80/95] ESLint fixes Signed-off-by: Fred Boniface --- .eslintrc.js | 56 +++++++------- src/configs/version.configs.js | 8 +- src/services/dbAccess.services.js | 117 ++++++++++++++++-------------- src/services/pis.services.js | 40 +++++----- src/services/stats.services.js | 31 ++++---- src/utils/auth.utils.js | 80 ++++++++++---------- 6 files changed, 169 insertions(+), 163 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index bf1e948..3a2a1c4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,31 +1,31 @@ module.exports = { - 'env': { - 'browser': true, - 'commonjs': true, - 'es2021': true - }, - 'extends': 'eslint:recommended', - 'overrides': [ + 'env': { + 'browser': true, + 'commonjs': true, + 'es2021': true + }, + 'extends': 'eslint:recommended', + 'overrides': [ + ], + 'parserOptions': { + 'ecmaVersion': 'latest' + }, + 'rules': { + 'indent': [ + 'error', + 2 ], - 'parserOptions': { - 'ecmaVersion': 'latest' - }, - 'rules': { - 'indent': [ - 'error', - 4 - ], - 'linebreak-style': [ - 'error', - 'unix' - ], - 'quotes': [ - 'error', - 'single' - ], - 'semi': [ - 'error', - 'never' - ] - } + 'linebreak-style': [ + 'error', + 'unix' + ], + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'never' + ] + } } diff --git a/src/configs/version.configs.js b/src/configs/version.configs.js index e8e12a5..71fef60 100644 --- a/src/configs/version.configs.js +++ b/src/configs/version.configs.js @@ -1,6 +1,6 @@ const version = { - api: ["/api/v1/",], - app: "2.0.0-dev" -}; + api: ['/api/v1/',], + app: '2.0.0-dev' +} -module.exports = version; \ No newline at end of file +module.exports = version \ No newline at end of file diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 8b85c27..68f57d0 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -1,82 +1,87 @@ -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils') // Log Helper -const dbUser = process.env.OWL_DB_USER || "owl" -const dbPass = process.env.OWL_DB_PASS || "twittwoo" -const dbName = process.env.OWL_DB_NAME || "owlboard" +// eslint-disable-next-line no-undef +const dbUser = process.env.OWL_DB_USER || 'owl' +// eslint-disable-next-line no-undef +const dbPass = process.env.OWL_DB_PASS || 'twittwoo' +// eslint-disable-next-line no-undef +const dbName = process.env.OWL_DB_NAME || 'owlboard' +// eslint-disable-next-line no-undef const dbPort = process.env.OWL_DB_PORT || 27017 -const dbHost = process.env.OWL_DB_HOST || "localhost" -const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}`; +// eslint-disable-next-line no-undef +const dbHost = process.env.OWL_DB_HOST || 'localhost' +const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}` -const { MongoClient } = require('mongodb'); +const { MongoClient } = require('mongodb') -const client = new MongoClient(uri); -const db = client.db(dbName); +const client = new MongoClient(uri) +const db = client.db(dbName) async function query(collection, query){ - await client.connect(); - log.out(`dbAccess.query: Connecting to collection: '${collection}'`, "info") - var qcoll = db.collection(collection); - var qcursor = qcoll.find(query) - qcursor.project({_id: 0}) - log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, "info") - increment(collection) - return (await qcursor.toArray()); + await client.connect() + log.out(`dbAccess.query: Connecting to collection: '${collection}'`, 'info') + var qcoll = db.collection(collection) + var qcursor = qcoll.find(query) + qcursor.project({_id: 0}) + log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, 'info') + increment(collection) + return (await qcursor.toArray()) } async function increment(target) { - log.out(`dbAccess.increment: Incrementing counter for: ${target}`, "info") - await client.connect(); - let col = db.collection("meta"); - let update = {} - update[target] = 1 - col.updateOne({target: "counters"}, {$inc:update}) + log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info') + await client.connect() + let col = db.collection('meta') + let update = {} + update[target] = 1 + col.updateOne({target: 'counters'}, {$inc:update}) } async function addUser(uuid, domain) { // Needs testing - log.out(`dbAccess.addUser: Adding user to database`) - let doc = {uuid: uuid, domain: domain, atime: new Date} - await client.connect(); - let col = db.collection("users"); - res = await col.insertOne(doc); - if (res.insertedId) { - return true - } - return false + log.out('dbAccess.addUser: Adding user to database') + let doc = {uuid: uuid, domain: domain, atime: new Date} + await client.connect() + let col = db.collection('users') + let res = await col.insertOne(doc) + if (res.insertedId) { + return true + } + return false } async function addRegReq(uuid, domain) { // Needs testing - log.out(`dbAccess.addRegReq: Adding registration request`) - let doc = {uuid: uuid, time: new Date, domain: domain} - await client.connect(); - let col = db.collection("registrations"); - res = col.insertOne(doc); - return res; + log.out('dbAccess.addRegReq: Adding registration request') + let doc = {uuid: uuid, time: new Date, domain: domain} + await client.connect() + let col = db.collection('registrations') + let res = col.insertOne(doc) + return res } async function userAtime(uuid) { // Needs testing - log.out(`dbAccess.userAtime: Updating access time for user`); - let q = {uuid: uuid}; - let n = {$set: {uuid: uuid, atime: new Date}}; - await client.connect(); - let col = db.collection("users"); - res = col.updateOne(q, n, {upsert: true}) - return res; + log.out('dbAccess.userAtime: Updating access time for user') + let q = {uuid: uuid} + let n = {$set: {uuid: uuid, atime: new Date}} + await client.connect() + let col = db.collection('users') + let res = col.updateOne(q, n, {upsert: true}) + return res } // Deletes one single registration request entry from the DB async function delRegReq(uuid) { - log.out(`dbAccess.delRegReq: Deleting a Registration Request`) - collection = "registrations" - await client.connect() - let col = db.collection(collection) - col.deleteOne({uuid: uuid}) + log.out('dbAccess.delRegReq: Deleting a Registration Request') + let collection = 'registrations' + await client.connect() + let col = db.collection(collection) + col.deleteOne({uuid: uuid}) } module.exports = { - query, - increment, // Probqbly doesn't need exporting? - addUser, - userAtime, - addRegReq, - delRegReq + query, + increment, // Probqbly doesn't need exporting? + addUser, + userAtime, + addRegReq, + delRegReq } \ No newline at end of file diff --git a/src/services/pis.services.js b/src/services/pis.services.js index f72050f..d8d5649 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -5,30 +5,30 @@ const log = require('../utils/log.utils') const clean = require('../utils/sanitizer.utils') async function findPisByOrigDest(start,end) { - log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug') - const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) - const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) - const query = { - stops: { - $all: [ - { $elemMatch: { $eq: firstCrs } }, - { $elemMatch: { $eq: lastCrs } } - ] - }, - $expr: { - $and: [ - { $eq: [{ $arrayElemAt: [ '$stops', -1 ] }, lastCrs] }, - { $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] } - ] - } + log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug') + const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) + const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) + const query = { + stops: { + $all: [ + { $elemMatch: { $eq: firstCrs } }, + { $elemMatch: { $eq: lastCrs } } + ] + }, + $expr: { + $and: [ + { $eq: [{ $arrayElemAt: [ '$stops', -1 ] }, lastCrs] }, + { $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] } + ] } - //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} - const search = db.query('pis', query) - return search + } + //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} + const search = db.query('pis', query) + return search } // Hopefully at some point, I will also be able to implement a find PIS code by headcode option. module.exports = { - findPisByOrigDest + findPisByOrigDest } \ No newline at end of file diff --git a/src/services/stats.services.js b/src/services/stats.services.js index 7893714..14d1ab5 100644 --- a/src/services/stats.services.js +++ b/src/services/stats.services.js @@ -1,24 +1,25 @@ -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils') // Log Helper const db = require('../services/dbAccess.services') const os = require('os') const vers = require('../configs/version.configs') async function hits(){ - log.out("statsServices.hits: Statistics Requested", "info") - var dat = db.query("meta", {target: "counters"}); - var ver = db.query("meta", {target: "versions"}); - log.out(`statsServices.hits: fetched server meta`, "info") - let out = {}; - out.host = os.hostname(); - out.mode = process.env.NODE_ENV; - out.verBkend = vers.app; - out.verApi = vers.api; - out.dat = await dat; - out.ver = await ver; - log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, "info") - return out; + log.out('statsServices.hits: Statistics Requested', 'info') + var dat = db.query('meta', {target: 'counters'}) + var ver = db.query('meta', {target: 'versions'}) + log.out('statsServices.hits: fetched server meta', 'info') + let out = {} + out.host = os.hostname() + // eslint-disable-next-line no-undef + out.mode = process.env.NODE_ENV + out.verBkend = vers.app + out.verApi = vers.api + out.dat = await dat + out.ver = await ver + log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, 'info') + return out } module.exports = { - hits + hits } \ No newline at end of file diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index a4bd442..b3c50c1 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -1,60 +1,60 @@ -const log = require('../utils/log.utils'); +const log = require('../utils/log.utils') const crypto = require('crypto') -const db = require('../services/dbAccess.services'); +const db = require('../services/dbAccess.services') const fs = require('fs/promises') -const minify = require('html-minifier').minify; +const minify = require('html-minifier').minify // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing - const q = {uuid: uuid} - const res = await db.query("users", q) - log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, "dbug") - const authorized = res && res[0] && res[0].domain; - if (authorized) db.userAtime(uuid) - return authorized + const q = {uuid: uuid} + const res = await db.query('users', q) + log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, 'dbug') + const authorized = res && res[0] && res[0].domain + if (authorized) db.userAtime(uuid) + return authorized } // Checks whether a registration request key is valid async function checkRequest(key) { - const collection = "registrations" - const query = {uuid: key} - const res = await db.query(collection, query) - log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, "dbug") - const result = res.length > 0 && res[0].time - ? { result: true, domain: res[0].domain } - : { result: false }; - return result; + const collection = 'registrations' + const query = {uuid: key} + const res = await db.query(collection, query) + log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, 'dbug') + const result = res.length > 0 && res[0].time + ? { result: true, domain: res[0].domain } + : { result: false } + return result } // Creates an API key for a user async function generateKey() { // Needs testing & moving to 'register.utils' - return crypto.randomUUID() -}; + return crypto.randomUUID() +} async function generateConfirmationEmail(eml, uuid) { - try { - let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8'); - let mini = minify(((htmlTpl).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Sun, 30 Apr 2023 22:13:47 +0100 Subject: [PATCH 81/95] Add prettier Signed-off-by: Fred Boniface --- .vscode/settings.json | 19 ++- package-lock.json | 226 ++++++++++++++++++++++++++++++++- package.json | 3 +- src/configs/domains.configs.js | 68 +++++----- 4 files changed, 274 insertions(+), 42 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e9b3418..dd4c482 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,14 @@ { - "git.autofetch": "all", - "git.alwaysSignOff": true, - "git.enableCommitSigning": false, - "git.fetchOnPull": true, - "git.pullBeforeCheckout": true -} \ No newline at end of file + "git.autofetch": "all", + "git.alwaysSignOff": true, + "git.enableCommitSigning": false, + "git.fetchOnPull": true, + "git.pullBeforeCheckout": true, + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", + "editor.formatOnPaste": false, // required + "editor.formatOnType": false, // required + "editor.formatOnSave": true, // optional + "editor.formatOnSaveMode": "file", // required to format on save + "files.autoSave": "onFocusChange", // optional but recommended + "vs-code-prettier-eslint.prettierLast": "false" // set as "true" to run 'prettier' last not first +} diff --git a/package-lock.json b/package-lock.json index 05783a4..bfd0739 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,8 @@ "nodemailer": "^6.9.1" }, "devDependencies": { - "eslint": "^8.39.0" + "eslint": "^8.39.0", + "prettier": "^2.8.8" } }, "node_modules/@aws-crypto/ie11-detection": { @@ -1493,6 +1494,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1502,6 +1512,22 @@ "upper-case": "^1.1.1" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/clean-css": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", @@ -2435,6 +2461,40 @@ "node": ">=7.6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -2635,6 +2695,53 @@ "node": ">= 0.8" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -2643,6 +2750,18 @@ "no-case": "^2.2.0" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2692,6 +2811,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2789,6 +2923,63 @@ "node": ">= 0.10" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2944,6 +3135,30 @@ "node": ">= 0.8" } }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -3053,6 +3268,15 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index eaab418..1e8282a 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "author": "Fred Boniface", "license": "GPL-3.0-or-later", "devDependencies": { - "eslint": "^8.39.0" + "eslint": "^8.39.0", + "prettier": "^2.8.8" } } diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index f7704c3..926dfb2 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,35 +1,35 @@ module.exports = valid = [ - "owlboard.info", - "avantiwestcoast.co.uk", - "btp.police.uk", - "c2crail.net", - "chilternrailways.co.uk", - "crosscountrytrains.co.uk", - "eastmidlandsrailway.co.uk", - "abellio.co.uk", - "tfl.gov.uk", - "mtrel.co.uk", - "eurostar.com", - "eurotunnel.com", - "ffwhr.com", - "gwr.com", - "hitachirail-eu.com", - "greateranglia.co.uk", - "heathrow.com", - "hs2.org.uk", - "swrailway.com", - "lsltoc.co.uk", - "lner.co.uk", - "arrivarl.co.uk", - "tube.tfl.gov.uk", - "lumo.co.uk", - "merseyrail.org", - "nrcommcentre.com", - "networkrail.co.uk", - "northernrailway.co.uk", - "scotrail.co.uk", - "southeasternrailway.co.uk", - "tpeexpress.co.uk", - "tfwrail.wales", - "wmtrains.co.uk", -] \ No newline at end of file + 'owlboard.info', + 'avantiwestcoast.co.uk', + 'btp.police.uk', + 'c2crail.net', + 'chilternrailways.co.uk', + 'crosscountrytrains.co.uk', + 'eastmidlandsrailway.co.uk', + 'abellio.co.uk', + 'tfl.gov.uk', + 'mtrel.co.uk', + 'eurostar.com', + 'eurotunnel.com', + 'ffwhr.com', + 'gwr.com', + 'hitachirail-eu.com', + 'greateranglia.co.uk', + 'heathrow.com', + 'hs2.org.uk', + 'swrailway.com', + 'lsltoc.co.uk', + 'lner.co.uk', + 'arrivarl.co.uk', + 'tube.tfl.gov.uk', + 'lumo.co.uk', + 'merseyrail.org', + 'nrcommcentre.com', + 'networkrail.co.uk', + 'northernrailway.co.uk', + 'scotrail.co.uk', + 'southeasternrailway.co.uk', + 'tpeexpress.co.uk', + 'tfwrail.wales', + 'wmtrains.co.uk', +] -- 2.34.1 From c1dac46a80ef57a7f774ec3f0662a379867bfaa1 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Sun, 30 Apr 2023 22:15:03 +0100 Subject: [PATCH 82/95] Adjust dockerignore Signed-off-by: Fred Boniface --- .dockerignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 03068b4..a9bb12b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,4 +8,6 @@ db-manager run.sh LICENSE *.md -static \ No newline at end of file +.eslintrc.js +.vscode +.test-tools \ No newline at end of file -- 2.34.1 From 57fe392e8c56260b03002d99a27f26f10bb9b5a2 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 1 May 2023 21:44:42 +0100 Subject: [PATCH 83/95] Add notes and some linting changes Signed-off-by: Fred Boniface --- src/services/mail.services.js | 26 +++++------ src/services/registration.services.js | 62 +++++++++++++-------------- src/utils/minify.utils.js | 6 ++- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 0f30f3a..debbef4 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,5 +1,5 @@ const log = require('../utils/log.utils') -const mail = require('nodemailer'); //>> Probs wrong +const mail = require('nodemailer') //>> Probs wrong const fromAddr = process.env.OWL_EML_FROM const smtpUser = process.env.OWL_EML_USER @@ -8,28 +8,28 @@ const smtpHost = process.env.OWL_EML_HOST const smtpPort = process.env.OWL_EML_PORT let transporter = mail.createTransport({ - host: smtpHost, - port: smtpPort, - secure: false, // Must be false for STARTTLS on port 587 - auth: { - user: smtpUser, - pass: smtpPass - } + host: smtpHost, + port: smtpPort, + secure: false, // Must be false for STARTTLS on port 587 + auth: { + user: smtpUser, + pass: smtpPass + } }) async function send(message){ // message is an object containing strings for: *to, cc, bcc, *subject, *txt, html (* denotes required) - log.out(`mailServices.send: Message send request received`, "info") + log.out('mailServices.send: Message send request received', 'info') message.from = fromAddr try { var res = await transporter.sendMail(message) } catch(err) { - log.out(`mailServices.send: Message send failed: ${err}`, "err") - return false; + log.out(`mailServices.send: Message send failed: ${err}`, 'err') + return false } log.out(`mailServices.send: SMTP Response: ${res.response}`) - return true; + return true } module.exports = { - send + send } \ No newline at end of file diff --git a/src/services/registration.services.js b/src/services/registration.services.js index 6ede7a4..306ae29 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -7,44 +7,44 @@ const domains = require('../configs/domains.configs') const errors = require('../configs/errorCodes.configs') async function createRegKey(body) { - log.out(`registerServices.createRegKey: Incoming request`, "INFO") - const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email - log.out(`registerServices: New registration request from domain: ${domain}`, "info") - if (domains.includes(domain)) { - log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) - const uuid = await auth.generateKey(); - db.addRegReq(uuid, domain) - const message = await auth.generateConfirmationEmail(body.email, uuid) - if (!message) { - const err = new Error("Message generation error"); - log.out(`registerServices.createRegKey: Error generating registration email`, "err") - return 500; - } - if (await mail.send(message) == true) { - return {status: 201, message: "email sent"} - } - return {status: 500, errorCode: 950, errorMsg: errors[950]} + log.out('registerServices.createRegKey: Incoming request', 'INFO') + const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email + log.out(`registerServices: New registration request from domain: ${domain}`, 'info') + if (domains.includes(domain)) { + log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) + const uuid = await auth.generateKey() + db.addRegReq(uuid, domain) + const message = await auth.generateConfirmationEmail(body.email, uuid) + if (!message) { + const err = new Error('Message generation error') + log.out('registerServices.createRegKey: Error generating registration email', 'err') + return 500 } - return {status: 403, errorCode: 702, errorMsg: errors[702]} + if (await mail.send(message) == true) { + return {status: 201, message: 'email sent'} + } + return {status: 500, errorCode: 950, errorMsg: errors[950]} + } + return {status: 403, errorCode: 702, errorMsg: errors[702]} } async function regUser(req) { // Add input validation - log.out(`Read UUID: ${req.uuid}`, "dbug") - log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, "info") + log.out(`Read UUID: ${req.uuid}`, 'dbug') + log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, 'info') const res = await auth.checkRequest(req.uuid) - log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, "info") - if (res.result) { - const uuid = await auth.generateKey() - const apiKey = await db.addUser(uuid, res.domain) - if (apiKey) { - db.delRegReq(req.uuid) - return {status: 201, message: "User added", api_key: uuid} - } + log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, 'info') + if (res.result) { + const uuid = await auth.generateKey() + const apiKey = await db.addUser(uuid, res.domain) + if (apiKey) { + db.delRegReq(req.uuid) + return {status: 201, message: 'User added', api_key: uuid} } - return {status: 401, errorCode: 703, errorMsg: errors[703]} + } + return {status: 401, errorCode: 703, errorMsg: errors[703]} } module.exports = { - regUser, - createRegKey + regUser, + createRegKey } \ No newline at end of file diff --git a/src/utils/minify.utils.js b/src/utils/minify.utils.js index a622a6d..c2ef3c0 100644 --- a/src/utils/minify.utils.js +++ b/src/utils/minify.utils.js @@ -1,5 +1,7 @@ const htmlShrink = require('html-minifier').minify -module.exports = async function minify(input) { // Do I need to name this function? - // Minify HTML input, including inline styles. +module.exports = async function minifyMail(input) { + // Minify HTML input, including inline styles. + //let inline = cssInliner(input) ?? + return htmlShrink(input) } \ No newline at end of file -- 2.34.1 From c9b307b697df767831ecf3dce5cd9c501c513e61 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Mon, 1 May 2023 21:52:31 +0100 Subject: [PATCH 84/95] eslint fixes Signed-off-by: Fred Boniface --- app.js | 98 +++++++++++---------- src/configs/errorCodes.configs.js | 16 ++-- src/controllers/find.controllers.js | 82 ++++++++--------- src/controllers/issue.controllers.js | 16 ++-- src/controllers/kube.controllers.js | 46 +++++----- src/controllers/ldb.controllers.js | 20 ++--- src/controllers/ldbs.controllers copy.js | 20 ++--- src/controllers/list.controllers.js | 50 +++++------ src/controllers/pis.controllers.js | 20 ++--- src/controllers/registration.controllers.js | 34 +++---- src/controllers/stats.controllers.js | 18 ++-- src/middlewares/auth.middlewares.js | 42 ++++----- src/middlewares/requireJson.middlewares.js | 12 +-- src/routes/find.routes.js | 18 ++-- src/routes/issue.routes.js | 10 +-- src/routes/kube.routes.js | 12 +-- src/routes/ldb.routes.js | 10 +-- src/routes/ldbs.routes.js | 10 +-- src/routes/list.routes.js | 12 +-- src/routes/pis.routes.js | 10 +-- src/routes/registration.routes.js | 10 +-- src/routes/stats.routes.js | 10 +-- src/services/dbAccess.services.js | 6 +- src/services/find.services.js | 68 +++++++------- src/services/issue.services.js | 44 ++++----- src/services/kube.services.js | 30 +++---- src/services/ldb.services.js | 85 +++++++++--------- src/services/list.services.js | 19 ++-- src/services/mail.services.js | 1 + src/services/registration.services.js | 1 + src/utils/ldb.utils.js | 66 +++++++------- src/utils/log.utils.js | 19 ++-- src/utils/sanitizer.utils.js | 28 +++--- src/utils/timeConvert.utils.js | 14 +-- src/utils/varTest.utils.js | 35 ++++---- 35 files changed, 498 insertions(+), 494 deletions(-) diff --git a/app.js b/app.js index 6999000..894f57b 100644 --- a/app.js +++ b/app.js @@ -4,12 +4,14 @@ // licensed separately, each folder contains a license file where a // different license applies. -console.log(`Initialising OwlBoard`) -const mode = process.env.NODE_ENV || "development" +/* global process */ + +console.log('Initialising OwlBoard') +const mode = process.env.NODE_ENV || 'development' // External Requires -const express = require('express'); -const app = express(); +const express = require('express') +const app = express() // Middleware const compression = require('compression') @@ -17,80 +19,80 @@ const rateLimit = require('express-rate-limit') const authenticate= require('./src/middlewares/auth.middlewares') // Internal Requires -const log = require('./src/utils/log.utils'); // Log Helper -const version = require('./src/configs/version.configs'); // Version Strings -const listRtr = require('./src/routes/list.routes'); // /list endpoints -const ldbRtr = require('./src/routes/ldb.routes'); // /ldb endpoints -const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints -const findRtr = require('./src/routes/find.routes'); // /find endpoints -const issueRtr = require('./src/routes/issue.routes'); // /issue endpoints -const statRtr = require('./src/routes/stats.routes'); // /stat endpoints -const regRtr = require('./src/routes/registration.routes'); // /registration endpoints -const pisRtr = require('./src/routes/pis.routes'); // /pis endpoints +const log = require('./src/utils/log.utils') // Log Helper +const version = require('./src/configs/version.configs') // Version Strings +const listRtr = require('./src/routes/list.routes') // /list endpoints +const ldbRtr = require('./src/routes/ldb.routes') // /ldb endpoints +const kubeRtr = require('./src/routes/kube.routes') // /kube endpoints +const findRtr = require('./src/routes/find.routes') // /find endpoints +const issueRtr = require('./src/routes/issue.routes') // /issue endpoints +const statRtr = require('./src/routes/stats.routes') // /stat endpoints +const regRtr = require('./src/routes/registration.routes') // /registration endpoints +const pisRtr = require('./src/routes/pis.routes') // /pis endpoints // Set Server Configurations -const srvListen = process.env.OWL_SRV_LISTEN || "0.0.0.0" +const srvListen = process.env.OWL_SRV_LISTEN || '0.0.0.0' const srvPort = process.env.OWL_SRV_PORT || 8460 const limiter = rateLimit({ - windowMs: 15 * (60 * 1000), // 15 minutes - max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) - standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers - legacyHeaders: true, // Disable the `X-RateLimit-*` headers + windowMs: 15 * (60 * 1000), // 15 minutes + max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: true, // Disable the `X-RateLimit-*` headers }) // Print version number: -log.out(`app: Starting OwlBoard in ${mode} mode`, "init") -log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, "init"); +log.out(`app: Starting OwlBoard in ${mode} mode`, 'init') +log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, 'init') // Test for required vars: - // const varTest = require('./src/utils/varTest.utils'); - // var startTest = await varTest.varTest(); - //console.log("Required Vars Missing:", startTest.missing_required); - //console.log("Desired Vars Missing:", startTest.missing_desired); - // if startTest.pass == false - // console.log("Unable to start, missing required vars") - // exit app +// const varTest = require('./src/utils/varTest.utils'); +// var startTest = await varTest.varTest(); +//console.log("Required Vars Missing:", startTest.missing_required); +//console.log("Desired Vars Missing:", startTest.missing_desired); +// if startTest.pass == false +// console.log("Unable to start, missing required vars") +// exit app // Express Error Handling: app.use((err, req, res, next) => { - const statusCode = err.statuscode || 500; - console.error(err.message, err.stack); - res.status(statusCode).json({'message': err.message}); - return; -}); + const statusCode = err.statuscode || 500 + console.error(err.message, err.stack) + res.status(statusCode).json({'message': err.message}) + return +}) // Global Middleware: -app.use(express.json()); //JSON Parsing for POST Requests +app.use(express.json()) //JSON Parsing for POST Requests app.use(compression()) // Compress API Data if supported by client app.use(limiter) // Unauthenticated Routes -app.use('/api/v1/list', listRtr); -app.use('/api/v1/ldb', ldbRtr); -app.use('/api/v1/kube', kubeRtr); -app.use('/api/v1/find', findRtr); -app.use('/api/v1/issue', issueRtr); -app.use('/api/v1/stats', statRtr); -app.use('/api/v1/register', regRtr); +app.use('/api/v1/list', listRtr) +app.use('/api/v1/ldb', ldbRtr) +app.use('/api/v1/kube', kubeRtr) +app.use('/api/v1/find', findRtr) +app.use('/api/v1/issue', issueRtr) +app.use('/api/v1/stats', statRtr) +app.use('/api/v1/register', regRtr) // Authented Routes -app.use('/api/v1/ldbs', authenticate, (req, res) => res.status(501).json({status: "Not Implemented", message: "This feature is not yet implemented due to upstream issues"})) +app.use('/api/v1/ldbs', authenticate, (req, res) => res.status(501).json({status: 'Not Implemented', message: 'This feature is not yet implemented due to upstream issues'})) app.use('/api/v1/pis', authenticate, pisRtr) -app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: "ok", message: "Authentication successful"})) // Returns 401 if auth failed, 200 if successful. +app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: 'ok', message: 'Authentication successful'})) // Returns 401 if auth failed, 200 if successful. // Number of proxies: app.set('trust proxy', 4) -mode === "development" +mode === 'development' ? app.get('/api/v1/ip', (req, res) => res.send(req.ip)) : null // Start Express app.listen(srvPort, srvListen, (error) =>{ if(!error) { - log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, "init"); - log.out("app.listen: State - alive", "init") + log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init') + log.out('app.listen: State - alive', 'init') } else { - log.out(`app.listen: Error occurred, server can't start ${error}`, "err"); + log.out(`app.listen: Error occurred, server can't start ${error}`, 'err') } -}); \ No newline at end of file +}) \ No newline at end of file diff --git a/src/configs/errorCodes.configs.js b/src/configs/errorCodes.configs.js index 0e4b6a4..9b51e0d 100644 --- a/src/configs/errorCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -1,10 +1,10 @@ module.exports = statusCodes = { - 700: "no authentication attempt", - 701: "invalid credentials", - 702: "domain not whitelisted", - 703: "registration request not found, maybe expired", - 800: "location code not found", - 801: "unable to fetch location data", - 900: "invalid request format", - 950: "upstream server error", + 700: 'no authentication attempt', + 701: 'invalid credentials', + 702: 'domain not whitelisted', + 703: 'registration request not found, maybe expired', + 800: 'location code not found', + 801: 'unable to fetch location data', + 900: 'invalid request format', + 950: 'upstream server error', } diff --git a/src/controllers/find.controllers.js b/src/controllers/find.controllers.js index a426ee6..67ce93d 100644 --- a/src/controllers/find.controllers.js +++ b/src/controllers/find.controllers.js @@ -1,58 +1,58 @@ -const find = require('../services/find.services'); +const find = require('../services/find.services') async function findName(req, res, next){ - try { - var id = req.params.id - res.json(await find.name(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + var id = req.params.id + res.json(await find.name(id)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } async function findCrs(req, res, next){ - try { - var id = req.params.id - res.json(await find.crs(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + var id = req.params.id + res.json(await find.crs(id)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } async function findNlc(req, res, next){ - try { - var id = req.params.id - res.json(await find.nlc(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + var id = req.params.id + res.json(await find.nlc(id)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } async function findTiploc(req, res, next){ - try { - var id = req.params.id - res.json(await find.tiploc(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + var id = req.params.id + res.json(await find.tiploc(id)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } async function findStanox(req, res, next){ - try { - var id = req.params.id - res.json(await find.stanox(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + var id = req.params.id + res.json(await find.stanox(id)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } module.exports = { - findName, - findCrs, - findNlc, - findTiploc, - findStanox + findName, + findCrs, + findNlc, + findTiploc, + findStanox } \ No newline at end of file diff --git a/src/controllers/issue.controllers.js b/src/controllers/issue.controllers.js index b8c0431..38c7506 100644 --- a/src/controllers/issue.controllers.js +++ b/src/controllers/issue.controllers.js @@ -1,14 +1,14 @@ -const issue = require('../services/issue.services'); +const issue = require('../services/issue.services') async function post(req, res, next){ - try { - res.json(await issue.processor(req.body)) - } catch (err) { - console.error(`Controller Error`, err.message); - next(err); - } + try { + res.json(await issue.processor(req.body)) + } catch (err) { + console.error('Controller Error', err.message) + next(err) + } } module.exports = { - post + post } \ No newline at end of file diff --git a/src/controllers/kube.controllers.js b/src/controllers/kube.controllers.js index 6d983cb..29cd19d 100644 --- a/src/controllers/kube.controllers.js +++ b/src/controllers/kube.controllers.js @@ -1,35 +1,35 @@ -const kube = require('../services/kube.services'); +const kube = require('../services/kube.services') async function getAlive(req, res, next){ - try { - var state = kube.getAlive() - res.status((await state).code).send((await state).state) - } catch (err) { - res.status("503").send({state: "error"}) - } + try { + var state = kube.getAlive() + res.status((await state).code).send((await state).state) + } catch (err) { + res.status('503').send({state: 'error'}) + } } async function getReady(req, res, next){ - try { - res.json(await kube.getReady(req.body)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + res.json(await kube.getReady(req.body)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } async function getTime(req, res, next){ - try { - res.json(await kube.getTime(req.body)) - } catch (err) { - console.error(`Unknown Error`, err.message); - err.status = 503 - next(err); - } + try { + res.json(await kube.getTime(req.body)) + } catch (err) { + console.error('Unknown Error', err.message) + err.status = 503 + next(err) + } } module.exports = { - getAlive, - getReady, - getTime + getAlive, + getReady, + getTime } \ No newline at end of file diff --git a/src/controllers/ldb.controllers.js b/src/controllers/ldb.controllers.js index 019cc95..a407031 100644 --- a/src/controllers/ldb.controllers.js +++ b/src/controllers/ldb.controllers.js @@ -1,16 +1,16 @@ -const ldb = require('../services/ldb.services'); +const ldb = require('../services/ldb.services') async function get(req, res, next){ - try { - var id = req.params.id - res.json(await ldb.get(id)) - } catch (err) { - console.error(`Unknown Error`, err.message); - err.status = 500 - next(err); - } + try { + var id = req.params.id + res.json(await ldb.get(id)) + } catch (err) { + console.error('Unknown Error', err.message) + err.status = 500 + next(err) + } } module.exports = { - get + get } \ No newline at end of file diff --git a/src/controllers/ldbs.controllers copy.js b/src/controllers/ldbs.controllers copy.js index aa652c6..b86da6c 100644 --- a/src/controllers/ldbs.controllers copy.js +++ b/src/controllers/ldbs.controllers copy.js @@ -1,16 +1,16 @@ -const ldb = require('../services/ldb.services'); +const ldb = require('../services/ldb.services') async function get(req, res, next){ - try { - var id = req.params.id - res.json(await ldb.get(id, true)) - } catch (err) { - console.error(`Unknown Error`, err.message); - err.status = 500 - next(err); - } + try { + var id = req.params.id + res.json(await ldb.get(id, true)) + } catch (err) { + console.error('Unknown Error', err.message) + err.status = 500 + next(err) + } } module.exports = { - get + get } \ No newline at end of file diff --git a/src/controllers/list.controllers.js b/src/controllers/list.controllers.js index 1a59b3b..2f27205 100644 --- a/src/controllers/list.controllers.js +++ b/src/controllers/list.controllers.js @@ -1,37 +1,37 @@ -const list = require('../services/list.services'); +const list = require('../services/list.services') async function getStations(req, res, next){ - try { - res.json(await list.getStations(req.body)) - } catch (err) { - console.error(`Controller Error`, err.message); - err.status = 500 - next(err); - } + try { + res.json(await list.getStations(req.body)) + } catch (err) { + console.error('Controller Error', err.message) + err.status = 500 + next(err) + } } async function getCorpus(req, res, next){ - try { - res.json(await list.getCorpus(req.body)) - } catch (err) { - console.error(`Controller Error`, err.message); - err.status = 500 - next(err); - } + try { + res.json(await list.getCorpus(req.body)) + } catch (err) { + console.error('Controller Error', err.message) + err.status = 500 + next(err) + } } async function hits(req, res, next) { - try { - res.json(await list.hits()) - } catch (err) { - console.error(`Controller Error`, err); - err.status = 500 - next(err); - } + try { + res.json(await list.hits()) + } catch (err) { + console.error('Controller Error', err) + err.status = 500 + next(err) + } } module.exports = { - getStations, - getCorpus, - hits + getStations, + getCorpus, + hits } \ No newline at end of file diff --git a/src/controllers/pis.controllers.js b/src/controllers/pis.controllers.js index 3971837..8f373d0 100644 --- a/src/controllers/pis.controllers.js +++ b/src/controllers/pis.controllers.js @@ -1,17 +1,17 @@ -const pis = require('../services/pis.services'); +const pis = require('../services/pis.services') async function byOrigDest(req, res, next){ - try { - let start = req.params.start - let end = req.params.end - res.json(await pis.findPisByOrigDest(start,end)) - } catch (err) { - console.error(`Unknown Error`, err.message); - next(err); - } + try { + let start = req.params.start + let end = req.params.end + res.json(await pis.findPisByOrigDest(start,end)) + } catch (err) { + console.error('Unknown Error', err.message) + next(err) + } } module.exports = { - byOrigDest + byOrigDest } \ No newline at end of file diff --git a/src/controllers/registration.controllers.js b/src/controllers/registration.controllers.js index 9253c3f..2a29ecf 100644 --- a/src/controllers/registration.controllers.js +++ b/src/controllers/registration.controllers.js @@ -1,26 +1,26 @@ -const reg = require('../services/registration.services'); +const reg = require('../services/registration.services') async function register(req, res, next) { - try { - let response = await reg.regUser(req.body) - res.status(response.status).json(response) - } catch (err) { - console.error(`Controller Error`, err.message) - next(err) - } + try { + let response = await reg.regUser(req.body) + res.status(response.status).json(response) + } catch (err) { + console.error('Controller Error', err.message) + next(err) + } } async function request(req, res, next) { - try { - let response = await reg.createRegKey(req.body) - res.status(response.status).json(response) - } catch (err) { - console.error(err) - next(err) - } + try { + let response = await reg.createRegKey(req.body) + res.status(response.status).json(response) + } catch (err) { + console.error(err) + next(err) + } } module.exports = { - register, - request + register, + request } \ No newline at end of file diff --git a/src/controllers/stats.controllers.js b/src/controllers/stats.controllers.js index daabff5..1eaf886 100644 --- a/src/controllers/stats.controllers.js +++ b/src/controllers/stats.controllers.js @@ -1,15 +1,15 @@ -const stat = require('../services/stats.services'); +const stat = require('../services/stats.services') async function get(req, res, next) { - try { - res.json(await stat.hits()) - } catch (err) { - console.error(`Controller Error`, err); - err.status = 500 - next(err); - } + try { + res.json(await stat.hits()) + } catch (err) { + console.error('Controller Error', err) + err.status = 500 + next(err) + } } module.exports = { - get + get } \ No newline at end of file diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js index 23f02c3..e402f5a 100644 --- a/src/middlewares/auth.middlewares.js +++ b/src/middlewares/auth.middlewares.js @@ -2,26 +2,26 @@ const utils = require('../utils/auth.utils') const log = require('../utils/log.utils') module.exports = async function authCheck(req, res, next) { - log.out(`authMiddlewares: Checking authentication`, "dbug") - try { - var uuid = req.headers.uuid - } catch(err) { - log.out(`authMiddlewares: No authentication attempted`, "dbug") - err.status = 401 - return next(err) - } - try { - var result = await utils.isAuthed(uuid) || false - if (!result) { - const err = new Error("Unauthorised"); - err.status = 401 - log.out(`authMiddlewares: Authentication attempted with incorrect key`, "warn") - return next(err) - } else { - log.out(`authMiddlewares: User authenticated`, "dbug") - return next() - } - } catch(err) { - return next(err) + log.out('authMiddlewares: Checking authentication', 'dbug') + try { + var uuid = req.headers.uuid + } catch(err) { + log.out('authMiddlewares: No authentication attempted', 'dbug') + err.status = 401 + return next(err) + } + try { + var result = await utils.isAuthed(uuid) || false + if (!result) { + const err = new Error('Unauthorised') + err.status = 401 + log.out('authMiddlewares: Authentication attempted with incorrect key', 'warn') + return next(err) + } else { + log.out('authMiddlewares: User authenticated', 'dbug') + return next() } + } catch(err) { + return next(err) + } } \ No newline at end of file diff --git a/src/middlewares/requireJson.middlewares.js b/src/middlewares/requireJson.middlewares.js index 1b43ab5..738d43d 100644 --- a/src/middlewares/requireJson.middlewares.js +++ b/src/middlewares/requireJson.middlewares.js @@ -1,12 +1,12 @@ const log = require('../utils/log.utils') module.exports = async function requireJson(req, res, next) { - if (req.headers['content-type'] !== 'application/json') { - log.out(`requireJson.middlewares: Bad Request: Not in JSON format`) - res.status(400).send({status: 400, message: "Server requires JSON"}) - } else { - next() - } + if (req.headers['content-type'] !== 'application/json') { + log.out('requireJson.middlewares: Bad Request: Not in JSON format') + res.status(400).send({status: 400, message: 'Server requires JSON'}) + } else { + next() + } } // Possibly want to check the req type? \ No newline at end of file diff --git a/src/routes/find.routes.js b/src/routes/find.routes.js index 53009f6..1ce1c14 100644 --- a/src/routes/find.routes.js +++ b/src/routes/find.routes.js @@ -1,6 +1,6 @@ -const express = require('express'); -const router = express.Router(); -const findController = require('../controllers/find.controllers'); +const express = require('express') +const router = express.Router() +const findController = require('../controllers/find.controllers') /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,10 +14,10 @@ const findController = require('../controllers/find.controllers'); /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/name/:id', findController.findName); -router.get('/crs/:id', findController.findCrs); -router.get('/nlc/:id', findController.findNlc); -router.get('/tiploc/:id', findController.findTiploc); -router.get('/stanox/:id', findController.findStanox); +router.get('/name/:id', findController.findName) +router.get('/crs/:id', findController.findCrs) +router.get('/nlc/:id', findController.findNlc) +router.get('/tiploc/:id', findController.findTiploc) +router.get('/stanox/:id', findController.findStanox) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/issue.routes.js b/src/routes/issue.routes.js index 00b8d19..d3c98a5 100644 --- a/src/routes/issue.routes.js +++ b/src/routes/issue.routes.js @@ -1,7 +1,7 @@ -const express = require('express'); -const router = express.Router(); -const issueController = require('../controllers/issue.controllers'); +const express = require('express') +const router = express.Router() +const issueController = require('../controllers/issue.controllers') -router.post('/', issueController.post); +router.post('/', issueController.post) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/kube.routes.js b/src/routes/kube.routes.js index e42abc1..b7bbca2 100644 --- a/src/routes/kube.routes.js +++ b/src/routes/kube.routes.js @@ -1,9 +1,9 @@ -const express = require('express'); -const router = express.Router(); -const kubeController = require('../controllers/kube.controllers'); +const express = require('express') +const router = express.Router() +const kubeController = require('../controllers/kube.controllers') -router.get('/alive', kubeController.getAlive); -router.get('/ready', kubeController.getReady); -router.get('/time', kubeController.getTime); +router.get('/alive', kubeController.getAlive) +router.get('/ready', kubeController.getReady) +router.get('/time', kubeController.getTime) module.exports = router \ No newline at end of file diff --git a/src/routes/ldb.routes.js b/src/routes/ldb.routes.js index 591bd45..c58f12b 100644 --- a/src/routes/ldb.routes.js +++ b/src/routes/ldb.routes.js @@ -1,6 +1,6 @@ -const express = require('express'); -const router = express.Router(); -const ldbController = require('../controllers/ldb.controllers'); +const express = require('express') +const router = express.Router() +const ldbController = require('../controllers/ldb.controllers') /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,6 +14,6 @@ const ldbController = require('../controllers/ldb.controllers'); /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/:id', ldbController.get); +router.get('/:id', ldbController.get) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/ldbs.routes.js b/src/routes/ldbs.routes.js index 2727ba0..0a0fe2e 100644 --- a/src/routes/ldbs.routes.js +++ b/src/routes/ldbs.routes.js @@ -1,6 +1,6 @@ -const express = require('express'); -const router = express.Router(); -const ldbsController = require('../controllers/ldbs.controllers'); +const express = require('express') +const router = express.Router() +const ldbsController = require('../controllers/ldbs.controllers') /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,6 +14,6 @@ const ldbsController = require('../controllers/ldbs.controllers'); /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/:id', ldbsController.get); +router.get('/:id', ldbsController.get) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/list.routes.js b/src/routes/list.routes.js index f49d13d..ccbc43f 100644 --- a/src/routes/list.routes.js +++ b/src/routes/list.routes.js @@ -1,6 +1,6 @@ -const express = require('express'); -const router = express.Router(); -const listController = require('../controllers/list.controllers'); +const express = require('express') +const router = express.Router() +const listController = require('../controllers/list.controllers') /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,7 +14,7 @@ const listController = require('../controllers/list.controllers'); /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/stations', listController.getStations); -router.get('/corpus', listController.getCorpus); +router.get('/stations', listController.getStations) +router.get('/corpus', listController.getCorpus) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/pis.routes.js b/src/routes/pis.routes.js index 70fa609..bda25c8 100644 --- a/src/routes/pis.routes.js +++ b/src/routes/pis.routes.js @@ -1,7 +1,7 @@ -const express = require('express'); -const router = express.Router(); -const pisController = require('../controllers/pis.controllers'); +const express = require('express') +const router = express.Router() +const pisController = require('../controllers/pis.controllers') -router.get('/origdest/:start/:end', pisController.byOrigDest); +router.get('/origdest/:start/:end', pisController.byOrigDest) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/registration.routes.js b/src/routes/registration.routes.js index afee9cd..a59bb7b 100644 --- a/src/routes/registration.routes.js +++ b/src/routes/registration.routes.js @@ -1,8 +1,8 @@ -const express = require('express'); -const router = express.Router(); -const regController = require('../controllers/registration.controllers'); +const express = require('express') +const router = express.Router() +const regController = require('../controllers/registration.controllers') -router.post('/request', regController.request); +router.post('/request', regController.request) router.post('/register', regController.register) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/routes/stats.routes.js b/src/routes/stats.routes.js index ae46cbc..d7f6791 100644 --- a/src/routes/stats.routes.js +++ b/src/routes/stats.routes.js @@ -1,8 +1,8 @@ -const express = require('express'); -const router = express.Router(); -const statsController = require('../controllers/stats.controllers'); +const express = require('express') +const router = express.Router() +const statsController = require('../controllers/stats.controllers') -router.get('/', statsController.get); +router.get('/', statsController.get) -module.exports = router; \ No newline at end of file +module.exports = router \ No newline at end of file diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 68f57d0..ad44dd4 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -1,14 +1,10 @@ +/* global process */ const log = require('../utils/log.utils') // Log Helper -// eslint-disable-next-line no-undef const dbUser = process.env.OWL_DB_USER || 'owl' -// eslint-disable-next-line no-undef const dbPass = process.env.OWL_DB_PASS || 'twittwoo' -// eslint-disable-next-line no-undef const dbName = process.env.OWL_DB_NAME || 'owlboard' -// eslint-disable-next-line no-undef const dbPort = process.env.OWL_DB_PORT || 27017 -// eslint-disable-next-line no-undef const dbHost = process.env.OWL_DB_HOST || 'localhost' const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}` diff --git a/src/services/find.services.js b/src/services/find.services.js index e2c6349..90c59f7 100644 --- a/src/services/find.services.js +++ b/src/services/find.services.js @@ -1,59 +1,59 @@ // Parse and return a find request -const log = require('../utils/log.utils'); // Log Helper -const db = require('../services/dbAccess.services'); +const log = require('../utils/log.utils') // Log Helper +const db = require('../services/dbAccess.services') const san = require('../utils/sanitizer.utils') // DB Query: query(collection, query) // Define collection as all queries are for the "corpus" collection. -const col = "corpus" +const col = 'corpus' async function name(id){ - log.out(`findServices.name: Finding station name: ${id}`, "info") - var name = san.cleanApiEndpointTxt(id.toUpperCase()) - query = {NLCDESC: name} - //var data = await db.query(col,query) - return await db.query(col,query) + log.out(`findServices.name: Finding station name: ${id}`, 'info') + var name = san.cleanApiEndpointTxt(id.toUpperCase()) + let query = {NLCDESC: name} + //var data = await db.query(col,query) + return await db.query(col,query) } async function crs(id){ - log.out(`findServices.crs: Finding crs: ${id}`, "info") - var crs = san.cleanApiEndpointTxt(id.toUpperCase()) - query = {'3ALPHA': crs} - //var data = await db.query(col,query) - return await db.query(col,query) + log.out(`findServices.crs: Finding crs: ${id}`, 'info') + var crs = san.cleanApiEndpointTxt(id.toUpperCase()) + let query = {'3ALPHA': crs} + //var data = await db.query(col,query) + return await db.query(col,query) } async function nlc(id){ - log.out(`findServices.nlc: Finding nlc: ${id}`, "info") - var nlc = san.cleanApiEndpointNum(id) - query = {NLC: parseInt(nlc)} - log.out(`findServices.nlc: NLC Converted to int: ${query}`, "info") - //var data = await db.query(col,query) - return await db.query(col,query) + log.out(`findServices.nlc: Finding nlc: ${id}`, 'info') + var nlc = san.cleanApiEndpointNum(id) + let query = {NLC: parseInt(nlc)} + log.out(`findServices.nlc: NLC Converted to int: ${query}`, 'info') + //var data = await db.query(col,query) + return await db.query(col,query) } async function tiploc(id){ - log.out(`findServices.tiploc: Finding tiploc: ${id}`, "info") - var tiploc = san.cleanApiEndpointTxt(id.toUpperCase()) - query = {TIPLOC: tiploc} - //var data = await db.query(col,query) - return await db.query(col,query) + log.out(`findServices.tiploc: Finding tiploc: ${id}`, 'info') + var tiploc = san.cleanApiEndpointTxt(id.toUpperCase()) + let query = {TIPLOC: tiploc} + //var data = await db.query(col,query) + return await db.query(col,query) } async function stanox(id){ - log.out(`findServices.stanox: Finding stanox: ${id}`, "info") - var stanox = san.cleanApiEndpointNum(id) - query = {STANOX: String(stanox)} - //var data = await db.query(col,query) - return await db.query(col,query) + log.out(`findServices.stanox: Finding stanox: ${id}`, 'info') + var stanox = san.cleanApiEndpointNum(id) + let query = {STANOX: String(stanox)} + //var data = await db.query(col,query) + return await db.query(col,query) } module.exports = { - name, - crs, - nlc, - tiploc, - stanox + name, + crs, + nlc, + tiploc, + stanox } \ No newline at end of file diff --git a/src/services/issue.services.js b/src/services/issue.services.js index c6d5669..a9523ed 100644 --- a/src/services/issue.services.js +++ b/src/services/issue.services.js @@ -1,33 +1,35 @@ +/* eslint-disable no-useless-escape */ +/* global process */ const axios = require('axios') const log = require('../utils/log.utils') async function processor(data) { - log.out(`issueService.processor: Issue received`, "info") - let out = {} - out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, ''); - out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, '') - return await sendToGitea(out); + log.out('issueService.processor: Issue received', 'info') + let out = {} + out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, '') + out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, '') + return await sendToGitea(out) } async function sendToGitea(body) { - let key = process.env.OWL_GIT_ISSUEBOT - let url = process.env.OWL_GIT_APIENDPOINT - let opts = { - headers: { - Authorization: key - } - } - var res = await axios.post(url, body, opts) - // Need to read the output from the POST and pass the result upwards to the client. - if (res.status == 201) { - log.out("issueService.sendToGitea: Issue sent to Gitea", "info") - return {status: res.status,message:"issue created"} - } else { - log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, "err") - return {status: res.status,message:"issue not created"} + let key = process.env.OWL_GIT_ISSUEBOT + let url = process.env.OWL_GIT_APIENDPOINT + let opts = { + headers: { + Authorization: key } + } + var res = await axios.post(url, body, opts) + // Need to read the output from the POST and pass the result upwards to the client. + if (res.status == 201) { + log.out('issueService.sendToGitea: Issue sent to Gitea', 'info') + return {status: res.status,message:'issue created'} + } else { + log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, 'err') + return {status: res.status,message:'issue not created'} + } } module.exports = { - processor + processor } \ No newline at end of file diff --git a/src/services/kube.services.js b/src/services/kube.services.js index ec2c2f9..f09d9f7 100644 --- a/src/services/kube.services.js +++ b/src/services/kube.services.js @@ -2,27 +2,27 @@ const testing = require('../services/mail.services') const log = require('../utils/log.utils') async function getAlive(){ - log.out(`kubeServices.getAlive: alive hook checked`, "info") - return {code: 200, state: {state: "alive",noise: "twit-twoo"}} + log.out('kubeServices.getAlive: alive hook checked', 'info') + return {code: 200, state: {state: 'alive',noise: 'twit-twoo'}} } async function getReady(){ - log.out(`kubeServices.getReady: ready hook checked`, "info") - testing.send({ - to: "fred@fjla.uk", - subject: "OwlBoard Test", - txt: "This is a test message from OwlBoard (testing)" - }); - return "not_implemented"; -}; + log.out('kubeServices.getReady: ready hook checked', 'info') + testing.send({ + to: 'fred@fjla.uk', + subject: 'OwlBoard Test', + txt: 'This is a test message from OwlBoard (testing)' + }) + return 'not_implemented' +} async function getTime(){ - var now = new Date() - return {responseGenerated: now} + var now = new Date() + return {responseGenerated: now} } module.exports = { - getAlive, - getReady, - getTime + getAlive, + getReady, + getTime } \ No newline at end of file diff --git a/src/services/ldb.services.js b/src/services/ldb.services.js index 357e95f..a6fa02a 100644 --- a/src/services/ldb.services.js +++ b/src/services/ldb.services.js @@ -1,6 +1,7 @@ +/* global process */ // Parse and return an LDB Request -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils') // Log Helper const ldb = require('ldbs-json') const util = require('../utils/ldb.utils') const san = require('../utils/sanitizer.utils') @@ -10,57 +11,57 @@ const ldbKey = process.env.OWL_LDB_KEY const ldbsvKey = process.env.OWL_LDB_SVKEY async function get(id, staff=false){ - const cleanId = san.cleanApiEndpointTxt(id); - const obj = await util.checkCrs(cleanId); - try { - const crs = obj[0]['3ALPHA']; - log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, "info"); - if (staff) { - const data = arrDepBoardStaff(crs) - db.increment("ldbsvws") - return await data - } else { - const data = arrDepBoard(crs); - db.increment("ldbws"); - return await data - } - } catch (err) { - log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, "info") - return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'}; + const cleanId = san.cleanApiEndpointTxt(id) + const obj = await util.checkCrs(cleanId) + try { + const crs = obj[0]['3ALPHA'] + log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, 'info') + if (staff) { + const data = arrDepBoardStaff(crs) + db.increment('ldbsvws') + return await data + } else { + const data = arrDepBoard(crs) + db.increment('ldbws') + return await data } + } catch (err) { + log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, 'info') + return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'} + } } async function arrDepBoard(CRS){ - log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, "info") - try { - const options = { - numRows: 10, - crs: CRS.toUpperCase() - } - const api = new ldb(ldbKey,false) - return await api.call("GetArrDepBoardWithDetails", options, false, false) - } catch (err) { - log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, "warn") - return {GetStationBoardResult: "not available", Reason: `The CRS code ${CRS} is not valid`, Why: `Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.`}; + log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, 'info') + try { + const options = { + numRows: 10, + crs: CRS.toUpperCase() } + const api = new ldb(ldbKey,false) + return await api.call('GetArrDepBoardWithDetails', options, false, false) + } catch (err) { + log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, 'warn') + return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} + } } async function arrDepBoardStaff(CRS) { - log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, "dbug") - try { - const options = { - numRows: 25, - crs: CRS.toUpperCase(), - getNonPassengerServices: true - } - const api = new ldb(ldbsvKey,true) - return await api.call("GetArrDepBoardWithDetails", options, false, false) - } catch (err) { - log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) - return {GetStationBoardResult: "not available", Reason: `The CRS code ${CRS} is not valid`, Why: `Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.`}; + log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, 'dbug') + try { + const options = { + numRows: 25, + crs: CRS.toUpperCase(), + getNonPassengerServices: true } + const api = new ldb(ldbsvKey,true) + return await api.call('GetArrDepBoardWithDetails', options, false, false) + } catch (err) { + log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) + return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} + } } module.exports = { - get + get } \ No newline at end of file diff --git a/src/services/list.services.js b/src/services/list.services.js index 89b9036..30fadb7 100644 --- a/src/services/list.services.js +++ b/src/services/list.services.js @@ -1,20 +1,19 @@ -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils') // Log Helper const db = require('../services/dbAccess.services') -const os = require('os') async function getStations(){ - var out = db.query("stations") - log.out(`listServices.getStations: Fetching stations list`, "info") - return await out; + var out = db.query('stations') + log.out('listServices.getStations: Fetching stations list', 'info') + return await out } async function getCorpus(){ - var out = db.query("corpus") - log.out(`listServices.getCorpus: Fetching CORPUS list`, "info") - return await out; + var out = db.query('corpus') + log.out('listServices.getCorpus: Fetching CORPUS list', 'info') + return await out } module.exports = { - getStations, - getCorpus + getStations, + getCorpus } \ No newline at end of file diff --git a/src/services/mail.services.js b/src/services/mail.services.js index debbef4..7495ea8 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,3 +1,4 @@ +/* global process */ const log = require('../utils/log.utils') const mail = require('nodemailer') //>> Probs wrong diff --git a/src/services/registration.services.js b/src/services/registration.services.js index 306ae29..fd362ee 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -18,6 +18,7 @@ async function createRegKey(body) { if (!message) { const err = new Error('Message generation error') log.out('registerServices.createRegKey: Error generating registration email', 'err') + log.out(err, 'err') return 500 } if (await mail.send(message) == true) { diff --git a/src/utils/ldb.utils.js b/src/utils/ldb.utils.js index fa6882d..446e473 100644 --- a/src/utils/ldb.utils.js +++ b/src/utils/ldb.utils.js @@ -1,49 +1,49 @@ -const log = require('../utils/log.utils'); // Log Helper +const log = require('../utils/log.utils') // Log Helper const db = require('../services/dbAccess.services') // DB Access const san = require('../utils/sanitizer.utils') // Sanitiser async function checkCrs(input){ - var INPUT = input.toUpperCase() - log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, "info") - var query = { - '$or':[ - {'3ALPHA':INPUT}, - {'TIPLOC':INPUT}, - {'STANOX':INPUT} - ] - }; - var result = await db.query("stations", query) - log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, "dbug") - return result + var INPUT = input.toUpperCase() + log.out(`ldbUtils.checkCrs: Building database query to find: '${INPUT}'`, 'info') + var query = { + '$or':[ + {'3ALPHA':INPUT}, + {'TIPLOC':INPUT}, + {'STANOX':INPUT} + ] + } + var result = await db.query('stations', query) + log.out(`ldbUtils.checkCrs: Query results: ${JSON.stringify(result)}`, 'dbug') + return result } async function cleanMessages(input){ // Needs to be moved to the frontend `ensureArray() func` - var out = [] - if (typeof input.message == "string") { - out.push(await san.cleanNrcc(input.message)) - } else if (typeof input.message == "object") { - for(var i = 0; i < input.message.length; i++) { - out.push(await san.cleanNrcc(input.message[i])) - } + var out = [] + if (typeof input.message == 'string') { + out.push(await san.cleanNrcc(input.message)) + } else if (typeof input.message == 'object') { + for(var i = 0; i < input.message.length; i++) { + out.push(await san.cleanNrcc(input.message[i])) } - return out; + } + return out } // Accepts an object but not an Array and returns it wrapped in an array. async function cleanServices(input){ // Need to triple check but I don't think this is used anymore. - var out = [] - if (!Array.isArray(input)) { - log.out(`ldbUtils.cleanServices: Transforming input: ${input}`, "depr") - out.push(input) - log.out(`ldbUtils.cleanServices: Returning output: ${out}`, "depr") - return out; - } else { - return input; - } + var out = [] + if (!Array.isArray(input)) { + log.out(`ldbUtils.cleanServices: Transforming input: ${input}`, 'depr') + out.push(input) + log.out(`ldbUtils.cleanServices: Returning output: ${out}`, 'depr') + return out + } else { + return input + } } module.exports = { - checkCrs, - cleanMessages, - cleanServices + checkCrs, + cleanMessages, + cleanServices } \ No newline at end of file diff --git a/src/utils/log.utils.js b/src/utils/log.utils.js index 988f99e..04a6025 100644 --- a/src/utils/log.utils.js +++ b/src/utils/log.utils.js @@ -1,16 +1,17 @@ -const environment = process.env.NODE_ENV; +/* global process */ +const environment = process.env.NODE_ENV -const hideInProduction = ["info", "dbug"] +const hideInProduction = ['info', 'dbug'] async function out(msg, level = 'othr') { - if (environment === "production" && hideInProduction.includes(level.toLowerCase())) { - return; - } else { - const time = new Date().toISOString(); - console.log(`${time} - ${level.toUpperCase()} - ${msg}`); - } + if (environment === 'production' && hideInProduction.includes(level.toLowerCase())) { + return + } else { + const time = new Date().toISOString() + console.log(`${time} - ${level.toUpperCase()} - ${msg}`) + } } module.exports = { - out + out } \ No newline at end of file diff --git a/src/utils/sanitizer.utils.js b/src/utils/sanitizer.utils.js index ea238bf..ad5ee4a 100644 --- a/src/utils/sanitizer.utils.js +++ b/src/utils/sanitizer.utils.js @@ -1,12 +1,12 @@ //const clean = require('string-sanitizer-fix'); -const log = require('../utils/log.utils'); +const log = require('../utils/log.utils') function removeNonAlphanumeric(inputString) { // Should be able to replace sanitizer module - return inputString.replace(/[^a-zA-Z0-9]/g, ''); + return inputString.replace(/[^a-zA-Z0-9]/g, '') } function removeNonAlpha(inputString) { // Should be able to replace sanitizer module - return inputString.replace(/[^a-zA-Z]/g, ''); + return inputString.replace(/[^a-zA-Z]/g, '') } const cleanApiEndpointTxt = removeNonAlpha @@ -30,20 +30,20 @@ function cleanApiEndpointNum(input) { } */ function cleanNrcc(input) { // Remove newlines and then

tags from input - const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, ''); - return cleanInput; - } + const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, '') + return cleanInput +} async function getDomainFromEmail(mail) { // Needs testing - split = mail.split("@") - return split[1] + let split = mail.split('@') + return split[1] } module.exports = { - cleanApiEndpointTxt, - cleanApiEndpointNum, - removeNonAlpha, - removeNonAlphanumeric, - cleanNrcc, - getDomainFromEmail, + cleanApiEndpointTxt, + cleanApiEndpointNum, + removeNonAlpha, + removeNonAlphanumeric, + cleanNrcc, + getDomainFromEmail, } \ No newline at end of file diff --git a/src/utils/timeConvert.utils.js b/src/utils/timeConvert.utils.js index 852b60d..88cfd38 100644 --- a/src/utils/timeConvert.utils.js +++ b/src/utils/timeConvert.utils.js @@ -1,15 +1,15 @@ function unixLocal(unix) { - var jsTime = unix*1000 - var dt = new Date(jsTime) - return dt.toLocaleString() + var jsTime = unix*1000 + var dt = new Date(jsTime) + return dt.toLocaleString() } function jsUnix(js) { - var preRound = js / 1000 - return Math.round(preRound) + var preRound = js / 1000 + return Math.round(preRound) } module.exports = { - unixLocal, - jsUnix, + unixLocal, + jsUnix, } \ No newline at end of file diff --git a/src/utils/varTest.utils.js b/src/utils/varTest.utils.js index 66c8e99..e6d0b29 100644 --- a/src/utils/varTest.utils.js +++ b/src/utils/varTest.utils.js @@ -1,27 +1,28 @@ +/* global process */ // Checks that all required environment variables are present. // Returns True or False and offers an object detailing what is missing. async function varTest(){ - var required = { - OWL_LDB_KEY: process.env.OWL_LDB_KEY, - OWL_LDB_CORPUSUSER: process.env.OWL_LDB_CORPUSUSER, - OWL_LDB_CORPUSPASS: process.env.OWL_LDB_CORPUSPASS, - OWL_NOT_USED: process.env.OWL_NOT_USED - } - var desired = { - OWL_DB_PASS: process.env.OWL_DB_PASS - } - // DO NOT LOG CREDENTIALS!!! + var required = { + OWL_LDB_KEY: process.env.OWL_LDB_KEY, + OWL_LDB_CORPUSUSER: process.env.OWL_LDB_CORPUSUSER, + OWL_LDB_CORPUSPASS: process.env.OWL_LDB_CORPUSPASS, + OWL_NOT_USED: process.env.OWL_NOT_USED + } + var desired = { + OWL_DB_PASS: process.env.OWL_DB_PASS + } + // DO NOT LOG CREDENTIALS!!! - // Test that each of required is NOT undefined. - // var pass = true if all okay, false if not. - // Append any missing values to missing_required = [] - // Test that each of desired is NOT undefined. - // Append any missing values to missing_desired = [] + // Test that each of required is NOT undefined. + // var pass = true if all okay, false if not. + // Append any missing values to missing_required = [] + // Test that each of desired is NOT undefined. + // Append any missing values to missing_desired = [] - // Return : {pass: $pass, missong_required = $missing_required, missing_desired = $missing_desired} + // Return : {pass: $pass, missong_required = $missing_required, missing_desired = $missing_desired} } module.exports = { - varTest + varTest } \ No newline at end of file -- 2.34.1 From c06c7a29ce2097f7592c63fc58ebfc0b71b743b5 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 2 May 2023 22:37:06 +0100 Subject: [PATCH 85/95] Add Juice Signed-off-by: Fred Boniface --- package-lock.json | 392 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 393 insertions(+) diff --git a/package-lock.json b/package-lock.json index bfd0739..020df7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "express": "^4.18.2", "express-rate-limit": "^6.7.0", "html-minifier": "^4.0.0", + "juice": "^9.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1" @@ -1318,6 +1319,14 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1424,6 +1433,11 @@ "node": ">= 0.8" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -1528,6 +1542,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/clean-css": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", @@ -1539,6 +1589,24 @@ "node": ">= 4.0" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1654,6 +1722,32 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1705,6 +1799,57 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1718,6 +1863,28 @@ "node": ">= 0.8" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2272,6 +2439,24 @@ "node": ">=6" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -2449,6 +2634,32 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/juice": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-9.0.0.tgz", + "integrity": "sha512-s/IwgQ4caZq3bSnQZlKfdGUqJWy9WzTzB12WSPko9G8uK74H8BJEQvX7GLmFAQ6SLFgAppqC/TUYepKZZaV+JA==", + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/ldbs-json": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ldbs-json/-/ldbs-json-1.2.1.tgz", @@ -2514,6 +2725,11 @@ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==" + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -2668,6 +2884,17 @@ "node": ">=6.0.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2695,6 +2922,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2762,6 +2998,29 @@ "node": ">=6" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3088,6 +3347,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "engines": { + "node": "*" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -3294,6 +3561,14 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "engines": { + "node": ">=10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3302,6 +3577,123 @@ "node": ">= 0.8" } }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 1e8282a..6badffc 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "express": "^4.18.2", "express-rate-limit": "^6.7.0", "html-minifier": "^4.0.0", + "juice": "^9.0.0", "ldbs-json": "^1.2.1", "mongodb": "^4.13.0", "nodemailer": "^6.9.1" -- 2.34.1 From f40cb103f81f745065c94a6eea8967bb2ed3c049 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 2 May 2023 22:49:51 +0100 Subject: [PATCH 86/95] Add CSS Inlining to minify.utils Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 2 +- src/utils/auth.utils.js | 17 +++++++---------- src/utils/minify.utils.js | 9 ++++++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index ad44dd4..e49e45c 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -75,7 +75,7 @@ async function delRegReq(uuid) { module.exports = { query, - increment, // Probqbly doesn't need exporting? + //increment, // Probqbly doesn't need exporting? addUser, userAtime, addRegReq, diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index b3c50c1..bff47cd 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -2,7 +2,7 @@ const log = require('../utils/log.utils') const crypto = require('crypto') const db = require('../services/dbAccess.services') const fs = require('fs/promises') -const minify = require('html-minifier').minify +const minify = require('../utils/minify.utils') // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing @@ -33,18 +33,15 @@ async function generateKey() { // Needs testing & moving to 'register.utils' async function generateConfirmationEmail(eml, uuid) { try { - let htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8') - let mini = minify(((htmlTpl).replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< Date: Tue, 2 May 2023 22:53:39 +0100 Subject: [PATCH 87/95] Remove remaining inline style from mail tpl Signed-off-by: Fred Boniface --- mail-templates/register.html | 50 ++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index dbdda08..2393fd4 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -1,4 +1,4 @@ - + OwlBoard - Register @@ -7,6 +7,7 @@ background-color:#404c55; background-image:radial-gradient(#2b343c,#404c55); text-align: center; + width: 100%; } a { color:white; @@ -39,30 +40,29 @@

- - - - - - + + + + + +
- -
-

Register for OwlBoard

-
-

Use the link below to register for OwlBoard (Staff Version)

-
- Register -


-

Alternatively copy and paste the link:
"https://owlboard.info/auth.html?key=>>ACCESSCODE<<

-

This registration is for one device only, you can register again using the - same email address for other devices and access OwlBoard from both. -

-

If you did not request to sign up to OwlBoard (Staff Version), you can - safely ignore this email. Your email address has not been stored by us - will not be required again unless you wish to register again. -

-

The registration link will expire after 30 minutes.

-
+ +
+

Register for OwlBoard

+
+

Use the link below to register for OwlBoard (Staff Version)

+
+ Register +


+

Alternatively copy and paste the link:
https://owlboard.info/auth.html?key=>>ACCESSCODE<<

+

This registration is for one device only, you can register again using the + same email address for other devices and access OwlBoard from elsewhere. +

+

If you did not request to sign up to OwlBoard (Staff Version), you can + safely ignore this email. Your email address has not been stored by us. +

+

The registration link will expire after 30 minutes.

+

-- 2.34.1 From d9ef62e590c71e317c8dda57bae8e0f32134cf8f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 2 May 2023 22:54:49 +0100 Subject: [PATCH 88/95] Bring email colours more on-brand Signed-off-by: Fred Boniface --- mail-templates/register.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index 2393fd4..c7ec141 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -10,11 +10,11 @@ width: 100%; } a { - color:white; + color:azure; } table { width: 100%; - color: white; + color: azure; font-family: sans-serif; } #title { -- 2.34.1 From bbe39512cec21a08cb75ff74b4d4937b865232fd Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Tue, 2 May 2023 23:02:10 +0100 Subject: [PATCH 89/95] Add text-align tag to table Signed-off-by: Fred Boniface --- mail-templates/register.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mail-templates/register.html b/mail-templates/register.html index c7ec141..43bac2e 100644 --- a/mail-templates/register.html +++ b/mail-templates/register.html @@ -16,11 +16,12 @@ width: 100%; color: azure; font-family: sans-serif; + text-align: center; } #title { height: 100px; padding-top: 0px; - margin-top: 0px + margin-top: 0px; } h1 { color: #00b7b7; -- 2.34.1 From fe35b0c7c3b8cae6ce4dce5a61bad8ad94947008 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Thu, 4 May 2023 10:13:47 +0100 Subject: [PATCH 90/95] Bump version to 2.0.0 Signed-off-by: Fred Boniface --- src/configs/version.configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/version.configs.js b/src/configs/version.configs.js index 71fef60..de74a9b 100644 --- a/src/configs/version.configs.js +++ b/src/configs/version.configs.js @@ -1,6 +1,6 @@ const version = { api: ['/api/v1/',], - app: '2.0.0-dev' + app: '2.0.0' } module.exports = version \ No newline at end of file -- 2.34.1 From d8add348f2fa0091827c419b80f5fdbf280fb4d3 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 5 May 2023 00:46:19 +0100 Subject: [PATCH 91/95] Fix Signed-off-by: Fred Boniface --- src/services/dbAccess.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index e49e45c..67d276f 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -75,7 +75,7 @@ async function delRegReq(uuid) { module.exports = { query, - //increment, // Probqbly doesn't need exporting? + increment, // Probqbly doesn't need exporting? - It does, ldbServices needs to increment when the API is hit! addUser, userAtime, addRegReq, -- 2.34.1 From 4efd29b488bba86d7bd583ac70295ed3e4ea00c1 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 5 May 2023 00:47:53 +0100 Subject: [PATCH 92/95] Adjust syntax to remove lint error Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 926dfb2..ee0f586 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,4 +1,6 @@ -module.exports = valid = [ +module.exports = valid + +const valid = [ 'owlboard.info', 'avantiwestcoast.co.uk', 'btp.police.uk', @@ -16,7 +18,6 @@ module.exports = valid = [ 'hitachirail-eu.com', 'greateranglia.co.uk', 'heathrow.com', - 'hs2.org.uk', 'swrailway.com', 'lsltoc.co.uk', 'lner.co.uk', -- 2.34.1 From e72e05ebc029d98cbc77bbbe3b963026ecc8ab87 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 5 May 2023 00:48:25 +0100 Subject: [PATCH 93/95] Adjust syntax to remove lint error Signed-off-by: Fred Boniface --- src/configs/errorCodes.configs.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/configs/errorCodes.configs.js b/src/configs/errorCodes.configs.js index 9b51e0d..e097225 100644 --- a/src/configs/errorCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -1,4 +1,6 @@ -module.exports = statusCodes = { +module.exports = statusCodes + +const statusCodes = { 700: 'no authentication attempt', 701: 'invalid credentials', 702: 'domain not whitelisted', -- 2.34.1 From 7c76d2aa5f59b4a5a32f648a9d53dbd7a55c175f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 5 May 2023 01:01:09 +0100 Subject: [PATCH 94/95] Lint fixes Signed-off-by: Fred Boniface --- .eslintrc.js | 4 +- app.js | 92 +++++++++--------- src/configs/domains.configs.js | 4 +- src/configs/errorCodes.configs.js | 4 +- src/configs/version.configs.js | 4 +- src/controllers/find.controllers.js | 44 ++++----- src/controllers/issue.controllers.js | 10 +- src/controllers/kube.controllers.js | 24 ++--- src/controllers/ldb.controllers.js | 14 +-- src/controllers/ldbs.controllers copy.js | 14 +-- src/controllers/list.controllers.js | 28 +++--- src/controllers/pis.controllers.js | 14 +-- src/controllers/registration.controllers.js | 20 ++-- src/controllers/stats.controllers.js | 12 +-- src/middlewares/auth.middlewares.js | 32 +++---- src/middlewares/requireJson.middlewares.js | 10 +- src/routes/find.routes.js | 18 ++-- src/routes/issue.routes.js | 10 +- src/routes/kube.routes.js | 14 +-- src/routes/ldb.routes.js | 10 +- src/routes/ldbs.routes.js | 10 +- src/routes/list.routes.js | 12 +-- src/routes/pis.routes.js | 10 +- src/routes/registration.routes.js | 12 +-- src/routes/stats.routes.js | 10 +- src/services/dbAccess.services.js | 100 ++++++++++---------- src/services/find.services.js | 52 +++++----- src/services/issue.services.js | 32 +++---- src/services/kube.services.js | 20 ++-- src/services/ldb.services.js | 64 ++++++------- src/services/list.services.js | 18 ++-- src/services/mail.services.js | 32 +++---- src/services/pis.services.js | 20 ++-- src/services/registration.services.js | 62 ++++++------ src/services/stats.services.js | 36 +++---- src/utils/auth.utils.js | 52 +++++----- src/utils/ldb.utils.js | 40 ++++---- src/utils/log.utils.js | 12 +-- src/utils/minify.utils.js | 10 +- src/utils/sanitizer.utils.js | 38 ++------ src/utils/timeConvert.utils.js | 12 +-- src/utils/varTest.utils.js | 6 +- 42 files changed, 512 insertions(+), 530 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3a2a1c4..cf336a8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,7 +25,7 @@ module.exports = { ], 'semi': [ 'error', - 'never' + 'always' ] } -} +}; diff --git a/app.js b/app.js index 894f57b..9c499e5 100644 --- a/app.js +++ b/app.js @@ -6,44 +6,44 @@ /* global process */ -console.log('Initialising OwlBoard') -const mode = process.env.NODE_ENV || 'development' +console.log('Initialising OwlBoard'); +const mode = process.env.NODE_ENV || 'development'; // External Requires -const express = require('express') -const app = express() +const express = require('express'); +const app = express(); // Middleware -const compression = require('compression') -const rateLimit = require('express-rate-limit') -const authenticate= require('./src/middlewares/auth.middlewares') +const compression = require('compression'); +const rateLimit = require('express-rate-limit'); +const authenticate= require('./src/middlewares/auth.middlewares'); // Internal Requires -const log = require('./src/utils/log.utils') // Log Helper -const version = require('./src/configs/version.configs') // Version Strings -const listRtr = require('./src/routes/list.routes') // /list endpoints -const ldbRtr = require('./src/routes/ldb.routes') // /ldb endpoints -const kubeRtr = require('./src/routes/kube.routes') // /kube endpoints -const findRtr = require('./src/routes/find.routes') // /find endpoints -const issueRtr = require('./src/routes/issue.routes') // /issue endpoints -const statRtr = require('./src/routes/stats.routes') // /stat endpoints -const regRtr = require('./src/routes/registration.routes') // /registration endpoints -const pisRtr = require('./src/routes/pis.routes') // /pis endpoints +const log = require('./src/utils/log.utils'); // Log Helper +const version = require('./src/configs/version.configs'); // Version Strings +const listRtr = require('./src/routes/list.routes'); // /list endpoints +const ldbRtr = require('./src/routes/ldb.routes'); // /ldb endpoints +const kubeRtr = require('./src/routes/kube.routes'); // /kube endpoints +const findRtr = require('./src/routes/find.routes'); // /find endpoints +const issueRtr = require('./src/routes/issue.routes'); // /issue endpoints +const statRtr = require('./src/routes/stats.routes'); // /stat endpoints +const regRtr = require('./src/routes/registration.routes'); // /registration endpoints +const pisRtr = require('./src/routes/pis.routes'); // /pis endpoints // Set Server Configurations -const srvListen = process.env.OWL_SRV_LISTEN || '0.0.0.0' -const srvPort = process.env.OWL_SRV_PORT || 8460 +const srvListen = process.env.OWL_SRV_LISTEN || '0.0.0.0'; +const srvPort = process.env.OWL_SRV_PORT || 8460; const limiter = rateLimit({ windowMs: 15 * (60 * 1000), // 15 minutes max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: true, // Disable the `X-RateLimit-*` headers -}) +}); // Print version number: -log.out(`app: Starting OwlBoard in ${mode} mode`, 'init') -log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, 'init') +log.out(`app: Starting OwlBoard in ${mode} mode`, 'init'); +log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions: ${version.api}`, 'init'); // Test for required vars: // const varTest = require('./src/utils/varTest.utils'); @@ -56,43 +56,43 @@ log.out(`app: Starting OwlBoard - Backend Version: ${version.app} - API versions // Express Error Handling: app.use((err, req, res, next) => { - const statusCode = err.statuscode || 500 - console.error(err.message, err.stack) - res.status(statusCode).json({'message': err.message}) - return -}) + const statusCode = err.statuscode || 500; + console.error(err.message, err.stack); + res.status(statusCode).json({'message': err.message}); + return; +}); // Global Middleware: -app.use(express.json()) //JSON Parsing for POST Requests -app.use(compression()) // Compress API Data if supported by client -app.use(limiter) +app.use(express.json()); //JSON Parsing for POST Requests +app.use(compression()); // Compress API Data if supported by client +app.use(limiter); // Unauthenticated Routes -app.use('/api/v1/list', listRtr) -app.use('/api/v1/ldb', ldbRtr) -app.use('/api/v1/kube', kubeRtr) -app.use('/api/v1/find', findRtr) -app.use('/api/v1/issue', issueRtr) -app.use('/api/v1/stats', statRtr) -app.use('/api/v1/register', regRtr) +app.use('/api/v1/list', listRtr); +app.use('/api/v1/ldb', ldbRtr); +app.use('/api/v1/kube', kubeRtr); +app.use('/api/v1/find', findRtr); +app.use('/api/v1/issue', issueRtr); +app.use('/api/v1/stats', statRtr); +app.use('/api/v1/register', regRtr); // Authented Routes -app.use('/api/v1/ldbs', authenticate, (req, res) => res.status(501).json({status: 'Not Implemented', message: 'This feature is not yet implemented due to upstream issues'})) -app.use('/api/v1/pis', authenticate, pisRtr) -app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: 'ok', message: 'Authentication successful'})) // Returns 401 if auth failed, 200 if successful. +app.use('/api/v1/ldbs', authenticate, (req, res) => res.status(501).json({status: 'Not Implemented', message: 'This feature is not yet implemented due to upstream issues'})); +app.use('/api/v1/pis', authenticate, pisRtr); +app.use('/api/v1/auth/test', authenticate, (req, res) => res.status(200).json({status: 'ok', message: 'Authentication successful'})); // Returns 401 if auth failed, 200 if successful. // Number of proxies: -app.set('trust proxy', 4) +app.set('trust proxy', 4); mode === 'development' ? app.get('/api/v1/ip', (req, res) => res.send(req.ip)) - : null + : null; // Start Express app.listen(srvPort, srvListen, (error) =>{ if(!error) { - log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init') - log.out('app.listen: State - alive', 'init') + log.out(`app.listen: Listening on http://${srvListen}:${srvPort}`, 'init'); + log.out('app.listen: State - alive', 'init'); } else { - log.out(`app.listen: Error occurred, server can't start ${error}`, 'err') + log.out(`app.listen: Error occurred, server can't start ${error}`, 'err'); } -}) \ No newline at end of file +}); \ No newline at end of file diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index ee0f586..56a77cc 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,4 +1,4 @@ -module.exports = valid +module.exports = valid; const valid = [ 'owlboard.info', @@ -33,4 +33,4 @@ const valid = [ 'tpeexpress.co.uk', 'tfwrail.wales', 'wmtrains.co.uk', -] +]; diff --git a/src/configs/errorCodes.configs.js b/src/configs/errorCodes.configs.js index e097225..0acb0d7 100644 --- a/src/configs/errorCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -1,4 +1,4 @@ -module.exports = statusCodes +module.exports = statusCodes; const statusCodes = { 700: 'no authentication attempt', @@ -9,4 +9,4 @@ const statusCodes = { 801: 'unable to fetch location data', 900: 'invalid request format', 950: 'upstream server error', -} +}; diff --git a/src/configs/version.configs.js b/src/configs/version.configs.js index de74a9b..a471637 100644 --- a/src/configs/version.configs.js +++ b/src/configs/version.configs.js @@ -1,6 +1,6 @@ const version = { api: ['/api/v1/',], app: '2.0.0' -} +}; -module.exports = version \ No newline at end of file +module.exports = version; \ No newline at end of file diff --git a/src/controllers/find.controllers.js b/src/controllers/find.controllers.js index 67ce93d..3a71054 100644 --- a/src/controllers/find.controllers.js +++ b/src/controllers/find.controllers.js @@ -1,52 +1,52 @@ -const find = require('../services/find.services') +const find = require('../services/find.services'); async function findName(req, res, next){ try { - var id = req.params.id - res.json(await find.name(id)) + var id = req.params.id; + res.json(await find.name(id)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } async function findCrs(req, res, next){ try { - var id = req.params.id - res.json(await find.crs(id)) + var id = req.params.id; + res.json(await find.crs(id)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } async function findNlc(req, res, next){ try { - var id = req.params.id - res.json(await find.nlc(id)) + var id = req.params.id; + res.json(await find.nlc(id)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } async function findTiploc(req, res, next){ try { - var id = req.params.id - res.json(await find.tiploc(id)) + var id = req.params.id; + res.json(await find.tiploc(id)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } async function findStanox(req, res, next){ try { - var id = req.params.id - res.json(await find.stanox(id)) + var id = req.params.id; + res.json(await find.stanox(id)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } module.exports = { @@ -55,4 +55,4 @@ module.exports = { findNlc, findTiploc, findStanox -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/issue.controllers.js b/src/controllers/issue.controllers.js index 38c7506..dc1fc83 100644 --- a/src/controllers/issue.controllers.js +++ b/src/controllers/issue.controllers.js @@ -1,14 +1,14 @@ -const issue = require('../services/issue.services') +const issue = require('../services/issue.services'); async function post(req, res, next){ try { - res.json(await issue.processor(req.body)) + res.json(await issue.processor(req.body)); } catch (err) { - console.error('Controller Error', err.message) - next(err) + console.error('Controller Error', err.message); + next(err); } } module.exports = { post -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/kube.controllers.js b/src/controllers/kube.controllers.js index 29cd19d..5037439 100644 --- a/src/controllers/kube.controllers.js +++ b/src/controllers/kube.controllers.js @@ -1,30 +1,30 @@ -const kube = require('../services/kube.services') +const kube = require('../services/kube.services'); async function getAlive(req, res, next){ try { - var state = kube.getAlive() - res.status((await state).code).send((await state).state) + var state = kube.getAlive(); + res.status((await state).code).send((await state).state); } catch (err) { - res.status('503').send({state: 'error'}) + res.status('503').send({state: 'error'}); } } async function getReady(req, res, next){ try { - res.json(await kube.getReady(req.body)) + res.json(await kube.getReady(req.body)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } async function getTime(req, res, next){ try { - res.json(await kube.getTime(req.body)) + res.json(await kube.getTime(req.body)); } catch (err) { - console.error('Unknown Error', err.message) - err.status = 503 - next(err) + console.error('Unknown Error', err.message); + err.status = 503; + next(err); } } @@ -32,4 +32,4 @@ module.exports = { getAlive, getReady, getTime -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/ldb.controllers.js b/src/controllers/ldb.controllers.js index a407031..032a4c9 100644 --- a/src/controllers/ldb.controllers.js +++ b/src/controllers/ldb.controllers.js @@ -1,16 +1,16 @@ -const ldb = require('../services/ldb.services') +const ldb = require('../services/ldb.services'); async function get(req, res, next){ try { - var id = req.params.id - res.json(await ldb.get(id)) + var id = req.params.id; + res.json(await ldb.get(id)); } catch (err) { - console.error('Unknown Error', err.message) - err.status = 500 - next(err) + console.error('Unknown Error', err.message); + err.status = 500; + next(err); } } module.exports = { get -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/ldbs.controllers copy.js b/src/controllers/ldbs.controllers copy.js index b86da6c..c4eae71 100644 --- a/src/controllers/ldbs.controllers copy.js +++ b/src/controllers/ldbs.controllers copy.js @@ -1,16 +1,16 @@ -const ldb = require('../services/ldb.services') +const ldb = require('../services/ldb.services'); async function get(req, res, next){ try { - var id = req.params.id - res.json(await ldb.get(id, true)) + var id = req.params.id; + res.json(await ldb.get(id, true)); } catch (err) { - console.error('Unknown Error', err.message) - err.status = 500 - next(err) + console.error('Unknown Error', err.message); + err.status = 500; + next(err); } } module.exports = { get -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/list.controllers.js b/src/controllers/list.controllers.js index 2f27205..8f2ddbc 100644 --- a/src/controllers/list.controllers.js +++ b/src/controllers/list.controllers.js @@ -1,32 +1,32 @@ -const list = require('../services/list.services') +const list = require('../services/list.services'); async function getStations(req, res, next){ try { - res.json(await list.getStations(req.body)) + res.json(await list.getStations(req.body)); } catch (err) { - console.error('Controller Error', err.message) - err.status = 500 - next(err) + console.error('Controller Error', err.message); + err.status = 500; + next(err); } } async function getCorpus(req, res, next){ try { - res.json(await list.getCorpus(req.body)) + res.json(await list.getCorpus(req.body)); } catch (err) { - console.error('Controller Error', err.message) - err.status = 500 - next(err) + console.error('Controller Error', err.message); + err.status = 500; + next(err); } } async function hits(req, res, next) { try { - res.json(await list.hits()) + res.json(await list.hits()); } catch (err) { - console.error('Controller Error', err) - err.status = 500 - next(err) + console.error('Controller Error', err); + err.status = 500; + next(err); } } @@ -34,4 +34,4 @@ module.exports = { getStations, getCorpus, hits -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/pis.controllers.js b/src/controllers/pis.controllers.js index 8f373d0..8efb1bd 100644 --- a/src/controllers/pis.controllers.js +++ b/src/controllers/pis.controllers.js @@ -1,17 +1,17 @@ -const pis = require('../services/pis.services') +const pis = require('../services/pis.services'); async function byOrigDest(req, res, next){ try { - let start = req.params.start - let end = req.params.end - res.json(await pis.findPisByOrigDest(start,end)) + let start = req.params.start; + let end = req.params.end; + res.json(await pis.findPisByOrigDest(start,end)); } catch (err) { - console.error('Unknown Error', err.message) - next(err) + console.error('Unknown Error', err.message); + next(err); } } module.exports = { byOrigDest -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/registration.controllers.js b/src/controllers/registration.controllers.js index 2a29ecf..7594b88 100644 --- a/src/controllers/registration.controllers.js +++ b/src/controllers/registration.controllers.js @@ -1,26 +1,26 @@ -const reg = require('../services/registration.services') +const reg = require('../services/registration.services'); async function register(req, res, next) { try { - let response = await reg.regUser(req.body) - res.status(response.status).json(response) + let response = await reg.regUser(req.body); + res.status(response.status).json(response); } catch (err) { - console.error('Controller Error', err.message) - next(err) + console.error('Controller Error', err.message); + next(err); } } async function request(req, res, next) { try { - let response = await reg.createRegKey(req.body) - res.status(response.status).json(response) + let response = await reg.createRegKey(req.body); + res.status(response.status).json(response); } catch (err) { - console.error(err) - next(err) + console.error(err); + next(err); } } module.exports = { register, request -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/controllers/stats.controllers.js b/src/controllers/stats.controllers.js index 1eaf886..4675478 100644 --- a/src/controllers/stats.controllers.js +++ b/src/controllers/stats.controllers.js @@ -1,15 +1,15 @@ -const stat = require('../services/stats.services') +const stat = require('../services/stats.services'); async function get(req, res, next) { try { - res.json(await stat.hits()) + res.json(await stat.hits()); } catch (err) { - console.error('Controller Error', err) - err.status = 500 - next(err) + console.error('Controller Error', err); + err.status = 500; + next(err); } } module.exports = { get -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/middlewares/auth.middlewares.js b/src/middlewares/auth.middlewares.js index e402f5a..9cccc69 100644 --- a/src/middlewares/auth.middlewares.js +++ b/src/middlewares/auth.middlewares.js @@ -1,27 +1,27 @@ -const utils = require('../utils/auth.utils') -const log = require('../utils/log.utils') +const utils = require('../utils/auth.utils'); +const log = require('../utils/log.utils'); module.exports = async function authCheck(req, res, next) { - log.out('authMiddlewares: Checking authentication', 'dbug') + log.out('authMiddlewares: Checking authentication', 'dbug'); try { - var uuid = req.headers.uuid + var uuid = req.headers.uuid; } catch(err) { - log.out('authMiddlewares: No authentication attempted', 'dbug') - err.status = 401 - return next(err) + log.out('authMiddlewares: No authentication attempted', 'dbug'); + err.status = 401; + return next(err); } try { - var result = await utils.isAuthed(uuid) || false + var result = await utils.isAuthed(uuid) || false; if (!result) { - const err = new Error('Unauthorised') - err.status = 401 - log.out('authMiddlewares: Authentication attempted with incorrect key', 'warn') - return next(err) + const err = new Error('Unauthorised'); + err.status = 401; + log.out('authMiddlewares: Authentication attempted with incorrect key', 'warn'); + return next(err); } else { - log.out('authMiddlewares: User authenticated', 'dbug') - return next() + log.out('authMiddlewares: User authenticated', 'dbug'); + return next(); } } catch(err) { - return next(err) + return next(err); } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/middlewares/requireJson.middlewares.js b/src/middlewares/requireJson.middlewares.js index 738d43d..57f783d 100644 --- a/src/middlewares/requireJson.middlewares.js +++ b/src/middlewares/requireJson.middlewares.js @@ -1,12 +1,12 @@ -const log = require('../utils/log.utils') +const log = require('../utils/log.utils'); module.exports = async function requireJson(req, res, next) { if (req.headers['content-type'] !== 'application/json') { - log.out('requireJson.middlewares: Bad Request: Not in JSON format') - res.status(400).send({status: 400, message: 'Server requires JSON'}) + log.out('requireJson.middlewares: Bad Request: Not in JSON format'); + res.status(400).send({status: 400, message: 'Server requires JSON'}); } else { - next() + next(); } -} +}; // Possibly want to check the req type? \ No newline at end of file diff --git a/src/routes/find.routes.js b/src/routes/find.routes.js index 1ce1c14..53009f6 100644 --- a/src/routes/find.routes.js +++ b/src/routes/find.routes.js @@ -1,6 +1,6 @@ -const express = require('express') -const router = express.Router() -const findController = require('../controllers/find.controllers') +const express = require('express'); +const router = express.Router(); +const findController = require('../controllers/find.controllers'); /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,10 +14,10 @@ const findController = require('../controllers/find.controllers') /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/name/:id', findController.findName) -router.get('/crs/:id', findController.findCrs) -router.get('/nlc/:id', findController.findNlc) -router.get('/tiploc/:id', findController.findTiploc) -router.get('/stanox/:id', findController.findStanox) +router.get('/name/:id', findController.findName); +router.get('/crs/:id', findController.findCrs); +router.get('/nlc/:id', findController.findNlc); +router.get('/tiploc/:id', findController.findTiploc); +router.get('/stanox/:id', findController.findStanox); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/issue.routes.js b/src/routes/issue.routes.js index d3c98a5..00b8d19 100644 --- a/src/routes/issue.routes.js +++ b/src/routes/issue.routes.js @@ -1,7 +1,7 @@ -const express = require('express') -const router = express.Router() -const issueController = require('../controllers/issue.controllers') +const express = require('express'); +const router = express.Router(); +const issueController = require('../controllers/issue.controllers'); -router.post('/', issueController.post) +router.post('/', issueController.post); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/kube.routes.js b/src/routes/kube.routes.js index b7bbca2..2831c74 100644 --- a/src/routes/kube.routes.js +++ b/src/routes/kube.routes.js @@ -1,9 +1,9 @@ -const express = require('express') -const router = express.Router() -const kubeController = require('../controllers/kube.controllers') +const express = require('express'); +const router = express.Router(); +const kubeController = require('../controllers/kube.controllers'); -router.get('/alive', kubeController.getAlive) -router.get('/ready', kubeController.getReady) -router.get('/time', kubeController.getTime) +router.get('/alive', kubeController.getAlive); +router.get('/ready', kubeController.getReady); +router.get('/time', kubeController.getTime); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/ldb.routes.js b/src/routes/ldb.routes.js index c58f12b..591bd45 100644 --- a/src/routes/ldb.routes.js +++ b/src/routes/ldb.routes.js @@ -1,6 +1,6 @@ -const express = require('express') -const router = express.Router() -const ldbController = require('../controllers/ldb.controllers') +const express = require('express'); +const router = express.Router(); +const ldbController = require('../controllers/ldb.controllers'); /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,6 +14,6 @@ const ldbController = require('../controllers/ldb.controllers') /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/:id', ldbController.get) +router.get('/:id', ldbController.get); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/ldbs.routes.js b/src/routes/ldbs.routes.js index 0a0fe2e..2727ba0 100644 --- a/src/routes/ldbs.routes.js +++ b/src/routes/ldbs.routes.js @@ -1,6 +1,6 @@ -const express = require('express') -const router = express.Router() -const ldbsController = require('../controllers/ldbs.controllers') +const express = require('express'); +const router = express.Router(); +const ldbsController = require('../controllers/ldbs.controllers'); /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,6 +14,6 @@ const ldbsController = require('../controllers/ldbs.controllers') /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/:id', ldbsController.get) +router.get('/:id', ldbsController.get); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/list.routes.js b/src/routes/list.routes.js index ccbc43f..f49d13d 100644 --- a/src/routes/list.routes.js +++ b/src/routes/list.routes.js @@ -1,6 +1,6 @@ -const express = require('express') -const router = express.Router() -const listController = require('../controllers/list.controllers') +const express = require('express'); +const router = express.Router(); +const listController = require('../controllers/list.controllers'); /* GET programming languages. */ //router.get('/', programmingLanguagesController.get); @@ -14,7 +14,7 @@ const listController = require('../controllers/list.controllers') /* DELETE programming language */ //router.delete('/:id', programmingLanguagesController.remove); -router.get('/stations', listController.getStations) -router.get('/corpus', listController.getCorpus) +router.get('/stations', listController.getStations); +router.get('/corpus', listController.getCorpus); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/pis.routes.js b/src/routes/pis.routes.js index bda25c8..70fa609 100644 --- a/src/routes/pis.routes.js +++ b/src/routes/pis.routes.js @@ -1,7 +1,7 @@ -const express = require('express') -const router = express.Router() -const pisController = require('../controllers/pis.controllers') +const express = require('express'); +const router = express.Router(); +const pisController = require('../controllers/pis.controllers'); -router.get('/origdest/:start/:end', pisController.byOrigDest) +router.get('/origdest/:start/:end', pisController.byOrigDest); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/registration.routes.js b/src/routes/registration.routes.js index a59bb7b..d8fb055 100644 --- a/src/routes/registration.routes.js +++ b/src/routes/registration.routes.js @@ -1,8 +1,8 @@ -const express = require('express') -const router = express.Router() -const regController = require('../controllers/registration.controllers') +const express = require('express'); +const router = express.Router(); +const regController = require('../controllers/registration.controllers'); -router.post('/request', regController.request) -router.post('/register', regController.register) +router.post('/request', regController.request); +router.post('/register', regController.register); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/routes/stats.routes.js b/src/routes/stats.routes.js index d7f6791..ae46cbc 100644 --- a/src/routes/stats.routes.js +++ b/src/routes/stats.routes.js @@ -1,8 +1,8 @@ -const express = require('express') -const router = express.Router() -const statsController = require('../controllers/stats.controllers') +const express = require('express'); +const router = express.Router(); +const statsController = require('../controllers/stats.controllers'); -router.get('/', statsController.get) +router.get('/', statsController.get); -module.exports = router \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/src/services/dbAccess.services.js b/src/services/dbAccess.services.js index 67d276f..44df034 100644 --- a/src/services/dbAccess.services.js +++ b/src/services/dbAccess.services.js @@ -1,76 +1,76 @@ /* global process */ -const log = require('../utils/log.utils') // Log Helper +const log = require('../utils/log.utils'); // Log Helper -const dbUser = process.env.OWL_DB_USER || 'owl' -const dbPass = process.env.OWL_DB_PASS || 'twittwoo' -const dbName = process.env.OWL_DB_NAME || 'owlboard' -const dbPort = process.env.OWL_DB_PORT || 27017 -const dbHost = process.env.OWL_DB_HOST || 'localhost' -const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}` +const dbUser = process.env.OWL_DB_USER || 'owl'; +const dbPass = process.env.OWL_DB_PASS || 'twittwoo'; +const dbName = process.env.OWL_DB_NAME || 'owlboard'; +const dbPort = process.env.OWL_DB_PORT || 27017; +const dbHost = process.env.OWL_DB_HOST || 'localhost'; +const uri = `mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}`; -const { MongoClient } = require('mongodb') +const { MongoClient } = require('mongodb'); -const client = new MongoClient(uri) -const db = client.db(dbName) +const client = new MongoClient(uri); +const db = client.db(dbName); async function query(collection, query){ - await client.connect() - log.out(`dbAccess.query: Connecting to collection: '${collection}'`, 'info') - var qcoll = db.collection(collection) - var qcursor = qcoll.find(query) - qcursor.project({_id: 0}) - log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, 'info') - increment(collection) - return (await qcursor.toArray()) + await client.connect(); + log.out(`dbAccess.query: Connecting to collection: '${collection}'`, 'info'); + var qcoll = db.collection(collection); + var qcursor = qcoll.find(query); + qcursor.project({_id: 0}); + log.out(`dbAccess.query: Running Query: ${JSON.stringify(query)}`, 'info'); + increment(collection); + return (await qcursor.toArray()); } async function increment(target) { - log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info') - await client.connect() - let col = db.collection('meta') - let update = {} - update[target] = 1 - col.updateOne({target: 'counters'}, {$inc:update}) + log.out(`dbAccess.increment: Incrementing counter for: ${target}`, 'info'); + await client.connect(); + let col = db.collection('meta'); + let update = {}; + update[target] = 1; + col.updateOne({target: 'counters'}, {$inc:update}); } async function addUser(uuid, domain) { // Needs testing - log.out('dbAccess.addUser: Adding user to database') - let doc = {uuid: uuid, domain: domain, atime: new Date} - await client.connect() - let col = db.collection('users') - let res = await col.insertOne(doc) + log.out('dbAccess.addUser: Adding user to database'); + let doc = {uuid: uuid, domain: domain, atime: new Date}; + await client.connect(); + let col = db.collection('users'); + let res = await col.insertOne(doc); if (res.insertedId) { - return true + return true; } - return false + return false; } async function addRegReq(uuid, domain) { // Needs testing - log.out('dbAccess.addRegReq: Adding registration request') - let doc = {uuid: uuid, time: new Date, domain: domain} - await client.connect() - let col = db.collection('registrations') - let res = col.insertOne(doc) - return res + log.out('dbAccess.addRegReq: Adding registration request'); + let doc = {uuid: uuid, time: new Date, domain: domain}; + await client.connect(); + let col = db.collection('registrations'); + let res = col.insertOne(doc); + return res; } async function userAtime(uuid) { // Needs testing - log.out('dbAccess.userAtime: Updating access time for user') - let q = {uuid: uuid} - let n = {$set: {uuid: uuid, atime: new Date}} - await client.connect() - let col = db.collection('users') - let res = col.updateOne(q, n, {upsert: true}) - return res + log.out('dbAccess.userAtime: Updating access time for user'); + let q = {uuid: uuid}; + let n = {$set: {uuid: uuid, atime: new Date}}; + await client.connect(); + let col = db.collection('users'); + let res = col.updateOne(q, n, {upsert: true}); + return res; } // Deletes one single registration request entry from the DB async function delRegReq(uuid) { - log.out('dbAccess.delRegReq: Deleting a Registration Request') - let collection = 'registrations' - await client.connect() - let col = db.collection(collection) - col.deleteOne({uuid: uuid}) + log.out('dbAccess.delRegReq: Deleting a Registration Request'); + let collection = 'registrations'; + await client.connect(); + let col = db.collection(collection); + col.deleteOne({uuid: uuid}); } module.exports = { @@ -80,4 +80,4 @@ module.exports = { userAtime, addRegReq, delRegReq -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/find.services.js b/src/services/find.services.js index 90c59f7..4f4a5ce 100644 --- a/src/services/find.services.js +++ b/src/services/find.services.js @@ -1,53 +1,53 @@ // Parse and return a find request -const log = require('../utils/log.utils') // Log Helper -const db = require('../services/dbAccess.services') -const san = require('../utils/sanitizer.utils') +const log = require('../utils/log.utils'); // Log Helper +const db = require('../services/dbAccess.services'); +const san = require('../utils/sanitizer.utils'); // DB Query: query(collection, query) // Define collection as all queries are for the "corpus" collection. -const col = 'corpus' +const col = 'corpus'; async function name(id){ - log.out(`findServices.name: Finding station name: ${id}`, 'info') - var name = san.cleanApiEndpointTxt(id.toUpperCase()) - let query = {NLCDESC: name} + log.out(`findServices.name: Finding station name: ${id}`, 'info'); + var name = san.cleanApiEndpointTxt(id.toUpperCase()); + let query = {NLCDESC: name}; //var data = await db.query(col,query) - return await db.query(col,query) + return await db.query(col,query); } async function crs(id){ - log.out(`findServices.crs: Finding crs: ${id}`, 'info') - var crs = san.cleanApiEndpointTxt(id.toUpperCase()) - let query = {'3ALPHA': crs} + log.out(`findServices.crs: Finding crs: ${id}`, 'info'); + var crs = san.cleanApiEndpointTxt(id.toUpperCase()); + let query = {'3ALPHA': crs}; //var data = await db.query(col,query) - return await db.query(col,query) + return await db.query(col,query); } async function nlc(id){ - log.out(`findServices.nlc: Finding nlc: ${id}`, 'info') - var nlc = san.cleanApiEndpointNum(id) - let query = {NLC: parseInt(nlc)} - log.out(`findServices.nlc: NLC Converted to int: ${query}`, 'info') + log.out(`findServices.nlc: Finding nlc: ${id}`, 'info'); + var nlc = san.cleanApiEndpointNum(id); + let query = {NLC: parseInt(nlc)}; + log.out(`findServices.nlc: NLC Converted to int: ${query}`, 'info'); //var data = await db.query(col,query) - return await db.query(col,query) + return await db.query(col,query); } async function tiploc(id){ - log.out(`findServices.tiploc: Finding tiploc: ${id}`, 'info') - var tiploc = san.cleanApiEndpointTxt(id.toUpperCase()) - let query = {TIPLOC: tiploc} + log.out(`findServices.tiploc: Finding tiploc: ${id}`, 'info'); + var tiploc = san.cleanApiEndpointTxt(id.toUpperCase()); + let query = {TIPLOC: tiploc}; //var data = await db.query(col,query) - return await db.query(col,query) + return await db.query(col,query); } async function stanox(id){ - log.out(`findServices.stanox: Finding stanox: ${id}`, 'info') - var stanox = san.cleanApiEndpointNum(id) - let query = {STANOX: String(stanox)} + log.out(`findServices.stanox: Finding stanox: ${id}`, 'info'); + var stanox = san.cleanApiEndpointNum(id); + let query = {STANOX: String(stanox)}; //var data = await db.query(col,query) - return await db.query(col,query) + return await db.query(col,query); } module.exports = { @@ -56,4 +56,4 @@ module.exports = { nlc, tiploc, stanox -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/issue.services.js b/src/services/issue.services.js index a9523ed..9af2ddb 100644 --- a/src/services/issue.services.js +++ b/src/services/issue.services.js @@ -1,35 +1,35 @@ /* eslint-disable no-useless-escape */ /* global process */ -const axios = require('axios') -const log = require('../utils/log.utils') +const axios = require('axios'); +const log = require('../utils/log.utils'); async function processor(data) { - log.out('issueService.processor: Issue received', 'info') - let out = {} - out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, '') - out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, '') - return await sendToGitea(out) + log.out('issueService.processor: Issue received', 'info'); + let out = {}; + out.title = data.subject.replace(/<[^>]+>|[\*\$]/g, ''); + out.body = data.msg.replace(/<[^>]+>|[\*\$]/g, ''); + return await sendToGitea(out); } async function sendToGitea(body) { - let key = process.env.OWL_GIT_ISSUEBOT - let url = process.env.OWL_GIT_APIENDPOINT + let key = process.env.OWL_GIT_ISSUEBOT; + let url = process.env.OWL_GIT_APIENDPOINT; let opts = { headers: { Authorization: key } - } - var res = await axios.post(url, body, opts) + }; + var res = await axios.post(url, body, opts); // Need to read the output from the POST and pass the result upwards to the client. if (res.status == 201) { - log.out('issueService.sendToGitea: Issue sent to Gitea', 'info') - return {status: res.status,message:'issue created'} + log.out('issueService.sendToGitea: Issue sent to Gitea', 'info'); + return {status: res.status,message:'issue created'}; } else { - log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, 'err') - return {status: res.status,message:'issue not created'} + log.out(`issueService.sendToGitea: Failed to send issue to Gitea: ${res.body}`, 'err'); + return {status: res.status,message:'issue not created'}; } } module.exports = { processor -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/kube.services.js b/src/services/kube.services.js index f09d9f7..1bf77bd 100644 --- a/src/services/kube.services.js +++ b/src/services/kube.services.js @@ -1,28 +1,28 @@ -const testing = require('../services/mail.services') -const log = require('../utils/log.utils') +const testing = require('../services/mail.services'); +const log = require('../utils/log.utils'); async function getAlive(){ - log.out('kubeServices.getAlive: alive hook checked', 'info') - return {code: 200, state: {state: 'alive',noise: 'twit-twoo'}} + log.out('kubeServices.getAlive: alive hook checked', 'info'); + return {code: 200, state: {state: 'alive',noise: 'twit-twoo'}}; } async function getReady(){ - log.out('kubeServices.getReady: ready hook checked', 'info') + log.out('kubeServices.getReady: ready hook checked', 'info'); testing.send({ to: 'fred@fjla.uk', subject: 'OwlBoard Test', txt: 'This is a test message from OwlBoard (testing)' - }) - return 'not_implemented' + }); + return 'not_implemented'; } async function getTime(){ - var now = new Date() - return {responseGenerated: now} + var now = new Date(); + return {responseGenerated: now}; } module.exports = { getAlive, getReady, getTime -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/ldb.services.js b/src/services/ldb.services.js index a6fa02a..7305d46 100644 --- a/src/services/ldb.services.js +++ b/src/services/ldb.services.js @@ -1,67 +1,67 @@ /* global process */ // Parse and return an LDB Request -const log = require('../utils/log.utils') // Log Helper -const ldb = require('ldbs-json') -const util = require('../utils/ldb.utils') -const san = require('../utils/sanitizer.utils') -const db = require('../services/dbAccess.services') +const log = require('../utils/log.utils'); // Log Helper +const ldb = require('ldbs-json'); +const util = require('../utils/ldb.utils'); +const san = require('../utils/sanitizer.utils'); +const db = require('../services/dbAccess.services'); -const ldbKey = process.env.OWL_LDB_KEY -const ldbsvKey = process.env.OWL_LDB_SVKEY +const ldbKey = process.env.OWL_LDB_KEY; +const ldbsvKey = process.env.OWL_LDB_SVKEY; async function get(id, staff=false){ - const cleanId = san.cleanApiEndpointTxt(id) - const obj = await util.checkCrs(cleanId) + const cleanId = san.cleanApiEndpointTxt(id); + const obj = await util.checkCrs(cleanId); try { - const crs = obj[0]['3ALPHA'] - log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, 'info') + const crs = obj[0]['3ALPHA']; + log.out(`ldbService.get: Determined CRS for lookup to be: ${crs}`, 'info'); if (staff) { - const data = arrDepBoardStaff(crs) - db.increment('ldbsvws') - return await data + const data = arrDepBoardStaff(crs); + db.increment('ldbsvws'); + return await data; } else { - const data = arrDepBoard(crs) - db.increment('ldbws') - return await data + const data = arrDepBoard(crs); + db.increment('ldbws'); + return await data; } } catch (err) { - log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, 'info') - return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'} + log.out(`ldbService.get: Error, Unable to find CRS: ${err}`, 'info'); + return {ERROR:'NOT_FOUND',description:'The entered station was not found. Please check and try again.'}; } } async function arrDepBoard(CRS){ - log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, 'info') + log.out(`ldbService.arrDepBoard: Trying to fetch ArrDep Board for ${CRS}`, 'info'); try { const options = { numRows: 10, crs: CRS.toUpperCase() - } - const api = new ldb(ldbKey,false) - return await api.call('GetArrDepBoardWithDetails', options, false, false) + }; + const api = new ldb(ldbKey,false); + return await api.call('GetArrDepBoardWithDetails', options, false, false); } catch (err) { - log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, 'warn') - return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} + log.out(`ldbService.arrDepBoard: Lookup Failed for: ${CRS}`, 'warn'); + return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'}; } } async function arrDepBoardStaff(CRS) { - log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, 'dbug') + log.out(`ldbService.arrDepBoardStaff: Trying to fetch ArrDep Board for ${CRS}`, 'dbug'); try { const options = { numRows: 25, crs: CRS.toUpperCase(), getNonPassengerServices: true - } - const api = new ldb(ldbsvKey,true) - return await api.call('GetArrDepBoardWithDetails', options, false, false) + }; + const api = new ldb(ldbsvKey,true); + return await api.call('GetArrDepBoardWithDetails', options, false, false); } catch (err) { - log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`) - return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'} + log.out(`ldbService.arrDepBoardStaff: Lookup Failed for: ${CRS}, "warn`); + return {GetStationBoardResult: 'not available', Reason: `The CRS code ${CRS} is not valid`, Why: 'Sometimes a station will have more than one CRS - for example Filton Abbey Wood has FIT and FAW however schedules are only available when looking up with FIT - this is how the National Rail Enquiries systems work.'}; } } module.exports = { get -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/list.services.js b/src/services/list.services.js index 30fadb7..c80965d 100644 --- a/src/services/list.services.js +++ b/src/services/list.services.js @@ -1,19 +1,19 @@ -const log = require('../utils/log.utils') // Log Helper -const db = require('../services/dbAccess.services') +const log = require('../utils/log.utils'); // Log Helper +const db = require('../services/dbAccess.services'); async function getStations(){ - var out = db.query('stations') - log.out('listServices.getStations: Fetching stations list', 'info') - return await out + var out = db.query('stations'); + log.out('listServices.getStations: Fetching stations list', 'info'); + return await out; } async function getCorpus(){ - var out = db.query('corpus') - log.out('listServices.getCorpus: Fetching CORPUS list', 'info') - return await out + var out = db.query('corpus'); + log.out('listServices.getCorpus: Fetching CORPUS list', 'info'); + return await out; } module.exports = { getStations, getCorpus -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/mail.services.js b/src/services/mail.services.js index 7495ea8..eb890ef 100644 --- a/src/services/mail.services.js +++ b/src/services/mail.services.js @@ -1,12 +1,12 @@ /* global process */ -const log = require('../utils/log.utils') -const mail = require('nodemailer') //>> Probs wrong +const log = require('../utils/log.utils'); +const mail = require('nodemailer'); //>> Probs wrong -const fromAddr = process.env.OWL_EML_FROM -const smtpUser = process.env.OWL_EML_USER -const smtpPass = process.env.OWL_EML_PASS -const smtpHost = process.env.OWL_EML_HOST -const smtpPort = process.env.OWL_EML_PORT +const fromAddr = process.env.OWL_EML_FROM; +const smtpUser = process.env.OWL_EML_USER; +const smtpPass = process.env.OWL_EML_PASS; +const smtpHost = process.env.OWL_EML_HOST; +const smtpPort = process.env.OWL_EML_PORT; let transporter = mail.createTransport({ host: smtpHost, @@ -16,21 +16,21 @@ let transporter = mail.createTransport({ user: smtpUser, pass: smtpPass } -}) +}); async function send(message){ // message is an object containing strings for: *to, cc, bcc, *subject, *txt, html (* denotes required) - log.out('mailServices.send: Message send request received', 'info') - message.from = fromAddr + log.out('mailServices.send: Message send request received', 'info'); + message.from = fromAddr; try { - var res = await transporter.sendMail(message) + var res = await transporter.sendMail(message); } catch(err) { - log.out(`mailServices.send: Message send failed: ${err}`, 'err') - return false + log.out(`mailServices.send: Message send failed: ${err}`, 'err'); + return false; } - log.out(`mailServices.send: SMTP Response: ${res.response}`) - return true + log.out(`mailServices.send: SMTP Response: ${res.response}`); + return true; } module.exports = { send -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/pis.services.js b/src/services/pis.services.js index d8d5649..3dc0276 100644 --- a/src/services/pis.services.js +++ b/src/services/pis.services.js @@ -1,13 +1,13 @@ // Finds PIS Codes using DB Lookups -const db = require('../services/dbAccess.services') -const log = require('../utils/log.utils') -const clean = require('../utils/sanitizer.utils') +const db = require('../services/dbAccess.services'); +const log = require('../utils/log.utils'); +const clean = require('../utils/sanitizer.utils'); async function findPisByOrigDest(start,end) { - log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug') - const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()) - const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()) + log.out(`pisServices.findPisByOrigDest: Searching for PIS for Orig: ${start}, Dest: ${end}`, 'dbug'); + const firstCrs = clean.cleanApiEndpointTxt(start.toLowerCase()); + const lastCrs = clean.cleanApiEndpointTxt(end.toLowerCase()); const query = { stops: { $all: [ @@ -21,14 +21,14 @@ async function findPisByOrigDest(start,end) { { $eq: [{ $arrayElemAt: [ '$stops', 0 ] }, firstCrs] } ] } - } + }; //const oldQuery = {$and:[{$expr:{$eq:[{$first:"$stops"},firstCrs]}},{$expr:{$eq:[{$last:"$stops"},lastCrs]}}]} - const search = db.query('pis', query) - return search + const search = db.query('pis', query); + return search; } // Hopefully at some point, I will also be able to implement a find PIS code by headcode option. module.exports = { findPisByOrigDest -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/registration.services.js b/src/services/registration.services.js index fd362ee..f640869 100644 --- a/src/services/registration.services.js +++ b/src/services/registration.services.js @@ -1,51 +1,51 @@ -const log = require('../utils/log.utils') -const auth = require('../utils/auth.utils') -const db = require('./dbAccess.services') -const mail = require('./mail.services') -const clean = require('../utils/sanitizer.utils') -const domains = require('../configs/domains.configs') -const errors = require('../configs/errorCodes.configs') +const log = require('../utils/log.utils'); +const auth = require('../utils/auth.utils'); +const db = require('./dbAccess.services'); +const mail = require('./mail.services'); +const clean = require('../utils/sanitizer.utils'); +const domains = require('../configs/domains.configs'); +const errors = require('../configs/errorCodes.configs'); async function createRegKey(body) { - log.out('registerServices.createRegKey: Incoming request', 'INFO') - const domain = await clean.getDomainFromEmail(body.email) // The function should validate the email - log.out(`registerServices: New registration request from domain: ${domain}`, 'info') + log.out('registerServices.createRegKey: Incoming request', 'INFO'); + const domain = await clean.getDomainFromEmail(body.email); // The function should validate the email + log.out(`registerServices: New registration request from domain: ${domain}`, 'info'); if (domains.includes(domain)) { - log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`) - const uuid = await auth.generateKey() - db.addRegReq(uuid, domain) - const message = await auth.generateConfirmationEmail(body.email, uuid) + log.out(`registerServices.createRegKey: Key from valid domain: ${domain}`); + const uuid = await auth.generateKey(); + db.addRegReq(uuid, domain); + const message = await auth.generateConfirmationEmail(body.email, uuid); if (!message) { - const err = new Error('Message generation error') - log.out('registerServices.createRegKey: Error generating registration email', 'err') - log.out(err, 'err') - return 500 + const err = new Error('Message generation error'); + log.out('registerServices.createRegKey: Error generating registration email', 'err'); + log.out(err, 'err'); + return 500; } if (await mail.send(message) == true) { - return {status: 201, message: 'email sent'} + return {status: 201, message: 'email sent'}; } - return {status: 500, errorCode: 950, errorMsg: errors[950]} + return {status: 500, errorCode: 950, errorMsg: errors[950]}; } - return {status: 403, errorCode: 702, errorMsg: errors[702]} + return {status: 403, errorCode: 702, errorMsg: errors[702]}; } async function regUser(req) { // Add input validation - log.out(`Read UUID: ${req.uuid}`, 'dbug') - log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, 'info') - const res = await auth.checkRequest(req.uuid) - log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, 'info') + log.out(`Read UUID: ${req.uuid}`, 'dbug'); + log.out(`registrationServices.regUser: Checking validity of : ${req.uuid}`, 'info'); + const res = await auth.checkRequest(req.uuid); + log.out(`registrationServices.regUser: checkRequest returned: ${JSON.stringify(res)}`, 'info'); if (res.result) { - const uuid = await auth.generateKey() - const apiKey = await db.addUser(uuid, res.domain) + const uuid = await auth.generateKey(); + const apiKey = await db.addUser(uuid, res.domain); if (apiKey) { - db.delRegReq(req.uuid) - return {status: 201, message: 'User added', api_key: uuid} + db.delRegReq(req.uuid); + return {status: 201, message: 'User added', api_key: uuid}; } } - return {status: 401, errorCode: 703, errorMsg: errors[703]} + return {status: 401, errorCode: 703, errorMsg: errors[703]}; } module.exports = { regUser, createRegKey -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/services/stats.services.js b/src/services/stats.services.js index 14d1ab5..a064984 100644 --- a/src/services/stats.services.js +++ b/src/services/stats.services.js @@ -1,25 +1,25 @@ -const log = require('../utils/log.utils') // Log Helper -const db = require('../services/dbAccess.services') -const os = require('os') -const vers = require('../configs/version.configs') +const log = require('../utils/log.utils'); // Log Helper +const db = require('../services/dbAccess.services'); +const os = require('os'); +const vers = require('../configs/version.configs'); async function hits(){ - log.out('statsServices.hits: Statistics Requested', 'info') - var dat = db.query('meta', {target: 'counters'}) - var ver = db.query('meta', {target: 'versions'}) - log.out('statsServices.hits: fetched server meta', 'info') - let out = {} - out.host = os.hostname() + log.out('statsServices.hits: Statistics Requested', 'info'); + var dat = db.query('meta', {target: 'counters'}); + var ver = db.query('meta', {target: 'versions'}); + log.out('statsServices.hits: fetched server meta', 'info'); + let out = {}; + out.host = os.hostname(); // eslint-disable-next-line no-undef - out.mode = process.env.NODE_ENV - out.verBkend = vers.app - out.verApi = vers.api - out.dat = await dat - out.ver = await ver - log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, 'info') - return out + out.mode = process.env.NODE_ENV; + out.verBkend = vers.app; + out.verApi = vers.api; + out.dat = await dat; + out.ver = await ver; + log.out(`statsServices.hits: Sending Data: ${JSON.stringify(out)}`, 'info'); + return out; } module.exports = { hits -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/utils/auth.utils.js b/src/utils/auth.utils.js index bff47cd..6b9e6ef 100644 --- a/src/utils/auth.utils.js +++ b/src/utils/auth.utils.js @@ -1,51 +1,51 @@ -const log = require('../utils/log.utils') -const crypto = require('crypto') -const db = require('../services/dbAccess.services') -const fs = require('fs/promises') -const minify = require('../utils/minify.utils') +const log = require('../utils/log.utils'); +const crypto = require('crypto'); +const db = require('../services/dbAccess.services'); +const fs = require('fs/promises'); +const minify = require('../utils/minify.utils'); // Checks users registration key against issued keys async function isAuthed(uuid) { // Needs testing - const q = {uuid: uuid} - const res = await db.query('users', q) - log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, 'dbug') - const authorized = res && res[0] && res[0].domain - if (authorized) db.userAtime(uuid) - return authorized + const q = {uuid: uuid}; + const res = await db.query('users', q); + log.out(`authUtils.checkUser: DB Query answer: ${JSON.stringify(res[0])}`, 'dbug'); + const authorized = res && res[0] && res[0].domain; + if (authorized) db.userAtime(uuid); + return authorized; } // Checks whether a registration request key is valid async function checkRequest(key) { - const collection = 'registrations' - const query = {uuid: key} - const res = await db.query(collection, query) - log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, 'dbug') + const collection = 'registrations'; + const query = {uuid: key}; + const res = await db.query(collection, query); + log.out(`authUtils.checkRequest: DB Query result: ${JSON.stringify(res)}`, 'dbug'); const result = res.length > 0 && res[0].time ? { result: true, domain: res[0].domain } - : { result: false } - return result + : { result: false }; + return result; } // Creates an API key for a user async function generateKey() { // Needs testing & moving to 'register.utils' - return crypto.randomUUID() + return crypto.randomUUID(); } async function generateConfirmationEmail(eml, uuid) { try { - const htmlTpl = await fs.readFile('mail-templates/register.html', 'utf-8') - const htmlStr = htmlTpl.replace(/>>ACCESSCODE<>ACCESSCODE<>ACCESSCODE< tags from input - const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, '') - return cleanInput + const cleanInput = input.replace(/[\n\r]/g, '').replace(/<\/?p[^>]*>/g, ''); + return cleanInput; } async function getDomainFromEmail(mail) { // Needs testing - let split = mail.split('@') - return split[1] + let split = mail.split('@'); + return split[1]; } module.exports = { @@ -46,4 +28,4 @@ module.exports = { removeNonAlphanumeric, cleanNrcc, getDomainFromEmail, -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/utils/timeConvert.utils.js b/src/utils/timeConvert.utils.js index 88cfd38..c8710a5 100644 --- a/src/utils/timeConvert.utils.js +++ b/src/utils/timeConvert.utils.js @@ -1,15 +1,15 @@ function unixLocal(unix) { - var jsTime = unix*1000 - var dt = new Date(jsTime) - return dt.toLocaleString() + var jsTime = unix*1000; + var dt = new Date(jsTime); + return dt.toLocaleString(); } function jsUnix(js) { - var preRound = js / 1000 - return Math.round(preRound) + var preRound = js / 1000; + return Math.round(preRound); } module.exports = { unixLocal, jsUnix, -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/utils/varTest.utils.js b/src/utils/varTest.utils.js index e6d0b29..f4db80e 100644 --- a/src/utils/varTest.utils.js +++ b/src/utils/varTest.utils.js @@ -8,10 +8,10 @@ async function varTest(){ OWL_LDB_CORPUSUSER: process.env.OWL_LDB_CORPUSUSER, OWL_LDB_CORPUSPASS: process.env.OWL_LDB_CORPUSPASS, OWL_NOT_USED: process.env.OWL_NOT_USED - } + }; var desired = { OWL_DB_PASS: process.env.OWL_DB_PASS - } + }; // DO NOT LOG CREDENTIALS!!! // Test that each of required is NOT undefined. @@ -25,4 +25,4 @@ async function varTest(){ module.exports = { varTest -} \ No newline at end of file +}; \ No newline at end of file -- 2.34.1 From 49d35355f51eaefc6145ad2e7d425666264c491d Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 5 May 2023 01:06:56 +0100 Subject: [PATCH 95/95] Bug Fixes Signed-off-by: Fred Boniface --- src/configs/domains.configs.js | 4 ++-- src/configs/errorCodes.configs.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/configs/domains.configs.js b/src/configs/domains.configs.js index 56a77cc..a5013fa 100644 --- a/src/configs/domains.configs.js +++ b/src/configs/domains.configs.js @@ -1,5 +1,3 @@ -module.exports = valid; - const valid = [ 'owlboard.info', 'avantiwestcoast.co.uk', @@ -34,3 +32,5 @@ const valid = [ 'tfwrail.wales', 'wmtrains.co.uk', ]; + +module.exports = valid; \ No newline at end of file diff --git a/src/configs/errorCodes.configs.js b/src/configs/errorCodes.configs.js index 0acb0d7..38c39bd 100644 --- a/src/configs/errorCodes.configs.js +++ b/src/configs/errorCodes.configs.js @@ -1,5 +1,3 @@ -module.exports = statusCodes; - const statusCodes = { 700: 'no authentication attempt', 701: 'invalid credentials', @@ -10,3 +8,5 @@ const statusCodes = { 900: 'invalid request format', 950: 'upstream server error', }; + +module.exports = statusCodes; \ No newline at end of file -- 2.34.1