Merge branch 'hotfix-release'

This commit is contained in:
Nawaz Dhandala
2021-07-19 13:19:24 +01:00
7 changed files with 287 additions and 32 deletions

View File

@@ -11,7 +11,7 @@ const handleSelect = require('../utils/select');
const handlePopulate = require('../utils/populate');
module.exports = {
create: async function({ projectId }, data, recurring) {
create: async function ({ projectId }, data, recurring) {
try {
if (!data.monitors || data.monitors.length === 0) {
const error = new Error(
@@ -33,16 +33,6 @@ module.exports = {
monitorId: monitor,
}));
if (
!data.monitorDuringEvent &&
data.monitors &&
data.monitors.length > 0
) {
await MonitorService.markMonitorsAsShouldNotMonitor(
data.monitors.map(i => i.monitorId)
);
}
data.projectId = projectId;
if (data && data.name) {
data.slug = getSlug(data.name);
@@ -86,6 +76,27 @@ module.exports = {
const currentTime = moment();
const startTime = moment(scheduledEvent.startDate);
if (startTime <= currentTime) {
//set monitoring state of the monitor
if (!data.monitorDuringEvent) {
if (
data.monitors &&
data.monitors.length > 0
) {
await MonitorService.markMonitorsAsShouldNotMonitor(
data.monitors.map(i => i.monitorId)
);
}
} else {
if (
data.monitors &&
data.monitors.length > 0
) {
await MonitorService.markMonitorsAsShouldMonitor(
data.monitors.map(i => i.monitorId)
);
}
}
await ScheduledEventNoteService.create({
content: 'This scheduled event has started',
scheduledEventId: scheduledEvent._id,
@@ -97,6 +108,21 @@ module.exports = {
//Create event end note immediately if end time equal to create time
const endTime = moment(scheduledEvent.endDate);
if (endTime <= currentTime) {
// revert monitor to monitoring state
if (!data.monitorDuringEvent) {
for (const monitor of data.monitors) {
// handle this in the background
MonitorService.updateOneBy(
{
_id: monitor.monitorId,
},
{
shouldNotMonitor: false,
}
);
}
}
await ScheduledEventNoteService.create({
content: 'This scheduled event has ended',
scheduledEventId: scheduledEvent._id,
@@ -122,7 +148,7 @@ module.exports = {
}
},
updateOneBy: async function(query, data) {
updateOneBy: async function (query, data) {
if (!query) {
query = {};
}
@@ -212,7 +238,7 @@ module.exports = {
}
},
updateBy: async function(query, data) {
updateBy: async function (query, data) {
try {
if (!query) {
query = {};
@@ -248,7 +274,7 @@ module.exports = {
}
},
deleteBy: async function(query, userId) {
deleteBy: async function (query, userId) {
try {
const scheduledEvent = await ScheduledEventModel.findOneAndUpdate(
query,
@@ -288,7 +314,7 @@ module.exports = {
}
},
findBy: async function({ query, limit, skip, populate, select }) {
findBy: async function ({ query, limit, skip, populate, select }) {
try {
if (!skip) skip = 0;
@@ -325,7 +351,7 @@ module.exports = {
}
},
findOneBy: async function({ query, select, populate }) {
findOneBy: async function ({ query, select, populate }) {
try {
if (!query) {
query = {};
@@ -364,7 +390,7 @@ module.exports = {
}
},
getSubProjectScheduledEvents: async function(subProjectIds) {
getSubProjectScheduledEvents: async function (subProjectIds) {
const populate = [
{ path: 'resolvedBy', select: 'name' },
{ path: 'projectId', select: 'name slug' },
@@ -400,7 +426,7 @@ module.exports = {
return subProjectScheduledEvents;
},
getSubProjectOngoingScheduledEvents: async function(subProjectIds, query) {
getSubProjectOngoingScheduledEvents: async function (subProjectIds, query) {
const populate = [
{ path: 'resolvedBy', select: 'name' },
{ path: 'projectId', select: 'name slug' },
@@ -436,7 +462,7 @@ module.exports = {
return subProjectOngoingScheduledEvents;
},
countBy: async function(query) {
countBy: async function (query) {
try {
if (!query) {
query = {};
@@ -450,7 +476,7 @@ module.exports = {
}
},
hardDeleteBy: async function(query) {
hardDeleteBy: async function (query) {
try {
await ScheduledEventModel.deleteMany(query);
return 'Event(s) removed successfully!';
@@ -466,7 +492,7 @@ module.exports = {
* @param {string} monitorId the id of the monitor
* @param {string} userId the id of the user
*/
removeMonitor: async function(monitorId, userId) {
removeMonitor: async function (monitorId, userId) {
try {
const populate = [
{ path: 'resolvedBy', select: 'name' },
@@ -548,7 +574,7 @@ module.exports = {
* @param {object} query query parameter to use for db manipulation
* @param {object} data data to be used to update the schedule
*/
resolveScheduledEvent: async function(query, data) {
resolveScheduledEvent: async function (query, data) {
try {
const _this = this;
data.resolved = true;
@@ -664,7 +690,7 @@ module.exports = {
/**
* @description Create Started note for all schedule events
*/
createScheduledEventStartedNote: async function() {
createScheduledEventStartedNote: async function () {
try {
const currentTime = moment();
@@ -684,6 +710,22 @@ module.exports = {
scheduledEventList.map(async scheduledEvent => {
const scheduledEventId = scheduledEvent._id;
// set monitoring status of the monitor
if (!scheduledEvent.monitorDuringEvent) {
if(scheduledEvent.monitors && scheduledEvent.monitors.length > 0){
await MonitorService.markMonitorsAsShouldNotMonitor(
scheduledEvent.monitors.map(i => i.monitorId._id || i.monitorId,)
);
}
} else {
if(scheduledEvent.monitors && scheduledEvent.monitors.length > 0){
await MonitorService.markMonitorsAsShouldMonitor(
scheduledEvent.monitors.map(i => i.monitorId._id || i.monitorId,)
);
}
}
const scheduledEventNoteCount = await ScheduledEventNoteService.countBy(
{
scheduledEventId,
@@ -710,7 +752,7 @@ module.exports = {
/**
* @description Create Ended note for all schedule events
*/ createScheduledEventEndedNote: async function() {
*/ createScheduledEventEndedNote: async function () {
try {
const currentTime = moment();
@@ -728,6 +770,15 @@ module.exports = {
scheduledEventList.map(async scheduledEvent => {
const scheduledEventId = scheduledEvent._id;
// revert monitor back to monitoring state
if (scheduledEvent && !scheduledEvent.monitorDuringEvent) {
if(scheduledEvent.monitors && scheduledEvent.monitors.length > 0){
await MonitorService.markMonitorsAsShouldMonitor(
scheduledEvent.monitors.map(i => i.monitorId._id || i.monitorId,)
);
}
}
const scheduledEventNoteListCount = await ScheduledEventNoteService.countBy(
{
scheduledEventId,

View File

@@ -29,6 +29,8 @@ spec:
value: 'production'
- name: BACKEND_URL
value: {{ template "fyipe.backendHost" . }}
- name: MONGO_URL
value: {{ template "fyipe.mongodbConnectionString" . }}
{{- if .Values.saas.isSaasService }}
- name: IS_SAAS_SERVICE
value: 'true'

View File

@@ -0,0 +1,18 @@
const { updateMany } = require('../util/db');
const monitorCollection = 'monitors';
// we need to run this once
// at the moment this should fix issue with the incident creation on the monitor
// no scheduled event is currently active or to be run in the future
async function run() {
await updateMany(
monitorCollection,
{ deleted: false },
{ shouldNotMonitor: false }
);
return `Script completed`;
}
module.exports = run;

View File

@@ -1,5 +1,6 @@
SKIP_PREFLIGHT_CHECK=true
PUBLIC_URL=/status-page
MONGO_URL=mongodb://localhost:27017/fyipedb
REACT_APP_BACKEND_PROTOCOL=http
STATUSPAGE_CERT=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZBakNDQStxZ0F3SUJBZ0lKQU1pUWhGTDUydDBUTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdYTVFzd0NRWUQKVlFRR0V3SlZVekVQTUEwR0ExVUVDQXdHUW05emRHOXVNUll3RkFZRFZRUUhEQTFOWVhOellXTm9kWE5sZEhSegpNUll3RkFZRFZRUUtEQTFJWVdOclpYSmlZWGtnU1c1ak1SRXdEd1lEVlFRTERBaFRiMlowZDJGeVpURVNNQkFHCkExVUVBd3dKWm5scGNHVXVZMjl0TVNBd0hnWUpLb1pJaHZjTkFRa0JGaEZxZFdSbFFHaGhZMnRsY21KaGVTNXAKYnpBZUZ3MHlNVEF6TVRBeU1qQXdNRGhhRncweU16QTJNVE15TWpBd01EaGFNSUdYTVFzd0NRWURWUVFHRXdKVgpVekVQTUEwR0ExVUVDQXdHUW05emRHOXVNUll3RkFZRFZRUUhEQTFOWVhOellXTm9kWE5sZEhSek1SWXdGQVlEClZRUUtEQTFJWVdOclpYSmlZWGtnU1c1ak1SRXdEd1lEVlFRTERBaFRiMlowZDJGeVpURVNNQkFHQTFVRUF3d0oKWm5scGNHVXVZMjl0TVNBd0hnWUpLb1pJaHZjTkFRa0JGaEZxZFdSbFFHaGhZMnRsY21KaGVTNXBiekNDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSzd1TjAzc0labXpVdVcwY0JlSDB6eWVyWWFOCnEra3lIYmJtMmt3N2VjUkVlZ2JGZTVBU25uMi9Eb1lJMEV0cEhNeHVCeXovMG9KOS83ZmJUUTEvSEphMmVRRngKRFQwTW5CS1MrdURYbHBzbUJrSUFNN2R3eTZQTldjeWU5MC9yTWc3Zkx2MzRZbHJxUVF5Z0NwaGF6MUk5SGdKRAplNjhoQXpvbXJVQnZqYWJMRDZWWmdFRzI5Qit6M1I3TktSTlRrQzdpdzdPeHltMjA1WjRDa3FqRUI2YXEvR2cxCmNoclBFeEpHdUlEc2xTNm94NVBrOS9yWkx6REc3RkZ6b2syK1Rrb1ZGU3I0RHVLcHp4WEZXVmRMRWF2RlU1dngKYm8rb2t6dzVyRGd0Z0JWek1ncEJaWkxGSXVXL21OS2VKa1V0WUZBdjBkN3dtYUhqemxsZDREYUdjU0VDQXdFQQpBYU9DQVUwd2dnRkpNSUcyQmdOVkhTTUVnYTR3Z2F1aGdaMmtnWm93Z1pjeEN6QUpCZ05WQkFZVEFsVlRNUTh3CkRRWURWUVFJREFaQ2IzTjBiMjR4RmpBVUJnTlZCQWNNRFUxaGMzTmhZMmgxYzJWMGRITXhGakFVQmdOVkJBb00KRFVoaFkydGxjbUpoZVNCSmJtTXhFVEFQQmdOVkJBc01DRk52Wm5SM1lYSmxNUkl3RUFZRFZRUUREQWxtZVdsdwpaUzVqYjIweElEQWVCZ2txaGtpRzl3MEJDUUVXRVdwMVpHVkFhR0ZqYTJWeVltRjVMbWx2Z2drQWh3Ti95cEM5CnRFVXdDUVlEVlIwVEJBSXdBREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0N3WUQKVlIwUEJBUURBZ1R3TUZjR0ExVWRFUVJRTUU2Q0NXWjVhWEJsTG1OdmJZSUxLaTVtZVdsd1pTNWpiMjJDQ1d4dgpZMkZzYUc5emRJSUxLaTVzYjJOaGJHaHZjM1NDREdaNWFYQmxZWEJ3TG1OdmJZSU9LaTVtZVdsd1pXRndjQzVqCmIyMHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBREJ3N1JJRVkxNzQ0aE9lUlVwbFdORDBwWGs4dE9SblRTWUgKNHJrZkR2MWtYandvL0pQY3IxcDNPU3A5VVMrTWlyWmxNL240dHVVdW9BNzA3Q2FxOXpuVFphT3ZEZEdWbDF3MwoyelRtbVlIbmk1OGFyK2NwdVN1Z1M2UnpWRlM5OVNQSHNwbVFyRjl4VkY5K3preWsvdHltRHE0MHFJZHJhTm5QCnJWWFB6cG5YUGxUUHZENTFFN2toenFZNDVVNWNtRUNMbmN2T3Z1Y3VlNys5M0V1anhYaE05RTZvT2w2Z2txQW0KSnNPdDdnQWxqd0Y1Vkx1YWVCYWJvWENYUmVBaW9ZZFk2YitCL0tyb21zTTZ6ejZzWnE5N3JRZFg2RkZVMWhlZwpHcGhOQm5vV28zNk1TMVRkbnhXYW5jcTVtcWhIMElzaStwM2pJOU1JeGZYRWw5MHNsMzQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
STATUSPAGE_PRIVATEKEY=LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBcnU0M1Rld2htYk5TNWJSd0Y0ZlRQSjZ0aG8ycjZUSWR0dWJhVER0NXhFUjZCc1Y3CmtCS2VmYjhPaGdqUVMya2N6RzRITFAvU2duMy90OXRORFg4Y2xyWjVBWEVOUFF5Y0VwTDY0TmVXbXlZR1FnQXoKdDNETG84MVp6SjczVCtzeUR0OHUvZmhpV3VwQkRLQUttRnJQVWowZUFrTjdyeUVET2lhdFFHK05wc3NQcFZtQQpRYmIwSDdQZEhzMHBFMU9RTHVMRHM3SEtiYlRsbmdLU3FNUUhwcXI4YURWeUdzOFRFa2E0Z095VkxxakhrK1QzCit0a3ZNTWJzVVhPaVRiNU9TaFVWS3ZnTzRxblBGY1ZaVjBzUnE4VlRtL0Z1ajZpVFBEbXNPQzJBRlhNeUNrRmwKa3NVaTViK1kwcDRtUlMxZ1VDL1IzdkNab2VQT1dWM2dOb1p4SVFJREFRQUJBb0lCQUFFdUJoMTJiRHVYSkFYOAprNHoxRTQyakhGUjkvQnpVZzdMS0Y4clAwK0JvL2RHeDMwVjNlcTRxYmJTbHRwSHJvWkFYWmVEOTBMT2ttZWJwCmlibC9rL2ZJUDBTdE9JT2k1Q0tUN3pFNUF3RUUzcUh2VW1uNFRzZEtDVU1DQjNUNGh4dm1rWENSRGtqQ3I3R2cKR3JJd1dwbVpZK3hyL0JlUVIyOUs5M3dweEhETmh1MlZub3IrbzFWQXJMUjJ2VVNjMGVDWFZpazhEQ0Q3NTlTZwpZN1EvSzRyZ1FINE5qTXQvNVNROTh2RzZDOFNnditlUmU4RThVdmhIU2NBT0h3bWxzMW1YU2tvL2swdEpxaWd1Ck1RazVsWnIrVHdjWlcrMWs1M1dkcDdXRUJzNElMQmMvbUFkTytCcGZ1bnB6SFBIc0tGYzdHY0FpQmZOMHFZZWUKN004NWg0a0NnWUVBNkRxb2ZYbmRJblpyUWlXWHo0RVN0NUVwVm9NUXMwUVNEd2Q1NmdldEcyMGpySXBCTEdMNAp3Q3ByV0xGN1F4OHVxOHpwS2tBbjVKbUEvTlI4OERmQ2d3WXluYm5CTjNNUjB6ZG1welFkZHNBc2VxbkJ5RVhICkxLVUQ3TDNvNVNzcEttZzBMVit1TGhzZkp3cWgveGZlS3NGSkV3eEp2U0ZkcUE1ZVp1TGlSL3NDZ1lFQXdOWWEKV1UySnM1dGc5S3JDMDVOY1hRTDFPZVFPV0plcFVSRXhsdUtjUWVyZzMxUVZYOEMwWEJmZ2VxUUNhTlpxdmNQYwo2MjR4d0dWUVdCODF4ZW1Kc2pENjNIemdPbzVRZkltYllvdzdCbEJzMFM0eWg3d1QzK3NnSVVMUnZhSG5mMGZoCm5zV2YvQjlKRXJFTjRSTXZ4OTMrZ0xiN1g3TWpIZ1U3ZGNQT2xKTUNnWUE2eE1WbzQ1TVRxcFlnS2pWTjNPTW8KczBLYjB4VkIySU1kYkkzc3JMNmhCekNVOUhQajBMUVVwV2QvRFlNZERHSWFOZ1Azbmo2Nk9pS0xXUmE1RDlOWQpweFBlR0drT0tEK2xqUXFjVzdMdEgxcmlPOTEvV2pFNldoUXhNQ29rL0pReFdDZUVLQWVEUVhmVHdId1lleWpNCjl4Y1FDL2NKTnMxbHZ5VWlzbDREU3dLQmdRQ0V5eXdMOFd4eFpmL0huVXhiUFBCdkVObGt5MXJod1ZjVS8zMGgKeGQ0TE9yOHVyQTJvQ2VGcVJmc05HYUtiSllVT056SU1ZcThhS2VyQk5JVG9US0hKTnhlWi9OakJHajNzOVNvdgpIQmlOaVpiV0dqVXI2ZVhaM21ZYTRaUGtQZmxZV2x6UjVJLytwR0RDNFhDSVhaa2F6eEl5KzA5eUlMOS9MZVU3CmZPTG14d0tCZ1FEWmFpTmdlTzk0cG9vZ092UkI1RkVKblFmcGwvMGdvbDNSYXUvQU0yTW93NTdmUjlNb1I0cFUKVFFDV0NwRy8vZHlZYXBTU201MnBNYTlEWEE1a2ZEOW1MclVHWk96S0drUW9Ka2h3dnJYbi9qY0NKY0JBYnBHagpJT01sK3QxMHdBL2xOZ3UwbEhJMHVKTFBOaHFEQ1ZHU21kVTVVWDUrdjFEenk1UklzbFFwSmc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

View File

@@ -10,8 +10,32 @@ const fetch = require('node-fetch');
const { spawn } = require('child_process');
const axios = require('axios');
// mongodb
const MongoClient = require('mongodb').MongoClient;
const mongoUrl =
process.env['MONGO_URL'] || 'mongodb://localhost:27017/fyipedb';
const { NODE_ENV } = process.env;
function getMongoClient() {
return new MongoClient(mongoUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
}
// setup mongodb connection
const client = getMongoClient();
(async function() {
try {
console.log('connecting to db');
await client.connect();
console.log('connected to db');
} catch (error) {
console.log('connection error: ', error);
}
})();
if (!NODE_ENV || NODE_ENV === 'development') {
// Load env vars from /statuspage/.env
require('dotenv').config();
@@ -82,6 +106,33 @@ app.use('/.well-known/acme-challenge/:token', async function(req, res) {
res.send(response.data);
});
// fetch details about a domain from the db
async function handleCustomDomain(client, collection, domain) {
const statusPage = await client
.db('fyipedb')
.collection(collection)
.findOne({
domains: { $elemMatch: { domain } },
});
let domainObj = {};
statusPage &&
statusPage.domains &&
statusPage.domains.forEach(eachDomain => {
if (eachDomain.domain === domain) {
domainObj = eachDomain;
}
});
return {
cert: domainObj.cert,
privateKey: domainObj.privateKey,
autoProvisioning: domainObj.autoProvisioning,
enableHttps: domainObj.enableHttps,
domain: domainObj.domain,
};
}
app.use('/', async function(req, res, next) {
const host = req.hostname;
if (
@@ -94,20 +145,22 @@ app.use('/', async function(req, res, next) {
}
try {
const response = await fetch(
`${apiHost}/statusPage/tlsCredential?domain=${host}`
).then(res => res.json());
const response = await handleCustomDomain(client, 'statuspages', host);
const { enableHttps } = response;
if (enableHttps) {
if (!req.secure) {
res.writeHead(301, { Location: `https://${host}${req.url}` });
res.writeHead(301, {
Location: `https://${host}${req.url}`,
});
return res.end();
}
return next();
} else {
if (req.secure) {
res.writeHead(301, { Location: `http://${host}${req.url}` });
res.writeHead(301, {
Location: `http://${host}${req.url}`,
});
return res.end();
}
return next();
@@ -228,9 +281,11 @@ function createDir(dirPath) {
path.resolve(process.cwd(), 'src', 'credentials', 'private.key')
),
SNICallback: async function(domain, cb) {
const res = await fetch(
`${apiHost}/statusPage/tlsCredential?domain=${domain}`
).then(res => res.json());
const res = await handleCustomDomain(
client,
'statuspages',
domain
);
let certPath, privateKeyPath;
if (res) {

View File

@@ -18,6 +18,7 @@
"markdown-to-jsx": "^7.1.3",
"mocha": "^9.0.1",
"moment": "^2.29.1",
"mongodb": "^4.0.0",
"node-fetch": "^2.6.1",
"prop-types": "^15.6.2",
"puppeteer": "^5.5.0",
@@ -5457,6 +5458,17 @@
"node-int64": "^0.4.0"
}
},
"node_modules/bson": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz",
"integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==",
"dependencies": {
"buffer": "^5.6.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -7785,6 +7797,14 @@
"node": ">=0.4.0"
}
},
"node_modules/denque": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/depcheck": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.1.tgz",
@@ -15031,6 +15051,12 @@
"readable-stream": "^2.0.1"
}
},
"node_modules/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
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -15426,6 +15452,30 @@
"node": "*"
}
},
"node_modules/mongodb": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.0.0.tgz",
"integrity": "sha512-ZsqdUyeSeuP2rfWvHpihvQ3MRDXuzsKHmhr1/vtM37JWj6M4yZvIXYFp8OJ85dYI6FvB9KQ1x0Cy6DQinrjUwA==",
"dependencies": {
"bson": "^4.4.0",
"denque": "^1.5.0",
"mongodb-connection-string-url": "^1.0.0"
},
"engines": {
"node": ">=12.9.0"
},
"optionalDependencies": {
"saslprep": "^1.0.0"
}
},
"node_modules/mongodb-connection-string-url": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.0.1.tgz",
"integrity": "sha512-sXi8w9nwbMrErWbOK+8nofHz531rboasDbYAMS+sQ+W+2YnHN980RlMr+t5SDL6uKEU/kw/wG6jcjCTLiJltoA==",
"dependencies": {
"whatwg-url": "^8.4.0"
}
},
"node_modules/move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -22144,6 +22194,18 @@
"resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz",
"integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
},
"node_modules/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,
"dependencies": {
"sparse-bitfield": "^3.0.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/sass": {
"version": "1.35.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz",
@@ -23082,6 +23144,15 @@
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
},
"node_modules/sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
"optional": true,
"dependencies": {
"memory-pager": "^1.0.2"
}
},
"node_modules/spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -31042,6 +31113,14 @@
"node-int64": "^0.4.0"
}
},
"bson": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz",
"integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==",
"requires": {
"buffer": "^5.6.0"
}
},
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -32840,6 +32919,11 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"denque": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
},
"depcheck": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.1.tgz",
@@ -38263,6 +38347,12 @@
"readable-stream": "^2.0.1"
}
},
"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",
@@ -38568,6 +38658,25 @@
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"mongodb": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.0.0.tgz",
"integrity": "sha512-ZsqdUyeSeuP2rfWvHpihvQ3MRDXuzsKHmhr1/vtM37JWj6M4yZvIXYFp8OJ85dYI6FvB9KQ1x0Cy6DQinrjUwA==",
"requires": {
"bson": "^4.4.0",
"denque": "^1.5.0",
"mongodb-connection-string-url": "^1.0.0",
"saslprep": "^1.0.0"
}
},
"mongodb-connection-string-url": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-1.0.1.tgz",
"integrity": "sha512-sXi8w9nwbMrErWbOK+8nofHz531rboasDbYAMS+sQ+W+2YnHN980RlMr+t5SDL6uKEU/kw/wG6jcjCTLiJltoA==",
"requires": {
"whatwg-url": "^8.4.0"
}
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -43656,6 +43765,15 @@
"resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz",
"integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
},
"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"
}
},
"sass": {
"version": "1.35.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz",
@@ -44419,6 +44537,15 @@
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
},
"sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
"optional": true,
"requires": {
"memory-pager": "^1.0.2"
}
},
"spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",

View File

@@ -13,6 +13,7 @@
"markdown-to-jsx": "^7.1.3",
"mocha": "^9.0.1",
"moment": "^2.29.1",
"mongodb": "^4.0.0",
"node-fetch": "^2.6.1",
"prop-types": "^15.6.2",
"puppeteer": "^5.5.0",