From e3b2915ca964edc1eef7a2b3f47432be1ff2c4db Mon Sep 17 00:00:00 2001 From: 2s2e Date: Thu, 11 Apr 2024 11:28:05 -0700 Subject: [PATCH 01/35] initial scaffolding for excel api --- backend/src/controllers/vsr.ts | 28 ++++++++++++++++++++++++++++ backend/src/routes/vsr.ts | 1 + 2 files changed, 29 insertions(+) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 62f62ca..0241be8 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -7,6 +7,7 @@ import { sendVSRNotificationEmailToStaff, } from "src/services/emails"; import validationErrorParser from "src/util/validationErrorParser"; +import ExcelJS from "exceljs"; /** * Gets all VSRs in the database. Requires the user to be signed in and have @@ -156,3 +157,30 @@ export const deleteVSR: RequestHandler = async (req, res, next) => { next(error); } }; + +const writeSpreadsheet = async (filename: string, data: entry[]) => { + const workbook = new ExcelJS.Workbook(); + + workbook.creator = "PAP Inventory System"; + workbook.lastModifiedBy = "Bot"; + //current date + workbook.created = new Date(); + workbook.modified = new Date(); + workbook.lastPrinted = new Date(); + + const worksheet = workbook.addWorksheet("New Sheet"); + + worksheet.columns = [ + { header: "Id", key: "id" }, + { header: "Name", key: "name" }, + { header: "Age", key: "age" }, + ]; + + for (let i = 0; i < data.length; i++) { + worksheet.addRow(data[i]); + } + + await workbook.xlsx.writeFile(filename); +}; + +export const bulkExportVSR: RequestHandler = async (req, res, next) => {}; diff --git a/backend/src/routes/vsr.ts b/backend/src/routes/vsr.ts index 3a98a70..d36d7c8 100644 --- a/backend/src/routes/vsr.ts +++ b/backend/src/routes/vsr.ts @@ -24,5 +24,6 @@ router.put( VSRValidator.updateVSR, VSRController.updateVSR, ); +router.get("/bulk_export", requireSignedIn, requireStaffOrAdmin, VSRController.bulkExportVSRS); export default router; From 54a1285e355c651ba61e2c20036bb7d9e43dd29f Mon Sep 17 00:00:00 2001 From: 2s2e Date: Thu, 11 Apr 2024 15:42:59 -0700 Subject: [PATCH 02/35] wrote some code to write to a spreadsheet --- backend/src/controllers/vsr.ts | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 0241be8..89b8c1d 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -158,7 +158,7 @@ export const deleteVSR: RequestHandler = async (req, res, next) => { } }; -const writeSpreadsheet = async (filename: string, data: entry[]) => { +const writeSpreadsheet = async (filename: string) => { const workbook = new ExcelJS.Workbook(); workbook.creator = "PAP Inventory System"; @@ -170,17 +170,27 @@ const writeSpreadsheet = async (filename: string, data: entry[]) => { const worksheet = workbook.addWorksheet("New Sheet"); - worksheet.columns = [ - { header: "Id", key: "id" }, - { header: "Name", key: "name" }, - { header: "Age", key: "age" }, - ]; + const vsrs = await VSRModel.find(); - for (let i = 0; i < data.length; i++) { - worksheet.addRow(data[i]); + //make worksheet.columns according to all elements in vsrs + const columns = Object.keys(vsrs[0]); + worksheet.columns = columns.map((column) => { + return { header: column, key: column, width: 20 }; + }); + + for (let i = 0; i < vsrs.length; i++) { + worksheet.addRow(vsrs[i]); } await workbook.xlsx.writeFile(filename); }; -export const bulkExportVSR: RequestHandler = async (req, res, next) => {}; +export const bulkExportVSRS: RequestHandler = async (req, res, next) => { + try { + const filename = "vsrs.xlsx"; + await writeSpreadsheet(filename); + res.download(filename); + } catch (error) { + next(error); + } +}; From bf782ced5fd341220fab8fad641a631a192406bb Mon Sep 17 00:00:00 2001 From: HarshGurnani Date: Thu, 11 Apr 2024 21:43:15 -0700 Subject: [PATCH 03/35] Added frontend api call for bulk excel export --- backend/package-lock.json | 730 +++++++++++++++++++++++++++- backend/package.json | 1 + backend/src/controllers/vsr.ts | 1 + backend/src/routes/vsr.ts | 2 +- frontend/src/api/VSRs.ts | 22 + frontend/src/app/staff/vsr/page.tsx | 32 +- 6 files changed, 770 insertions(+), 18 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 3e3afb8..2549bc4 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,7 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "envalid": "^7.3.1", + "exceljs": "^4.4.0", "express": "^4.18.2", "express-validator": "^7.0.1", "firebase": "^10.7.2", @@ -1555,6 +1556,43 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, "node_modules/@fastify/busboy": { "version": "1.2.1", "dev": true, @@ -4143,6 +4181,90 @@ "node": ">= 8" } }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/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==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/archiver/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/arg": { "version": "4.1.3", "devOptional": true, @@ -4293,6 +4415,11 @@ "version": "2.0.6", "license": "MIT" }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, "node_modules/async-mutex": { "version": "0.4.0", "license": "MIT", @@ -4451,7 +4578,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -4465,8 +4591,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "optional": true + ] + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } }, "node_modules/bignumber.js": { "version": "9.1.2", @@ -4478,6 +4611,18 @@ "node": "*" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "license": "MIT", @@ -4485,6 +4630,21 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, "node_modules/body-parser": { "version": "1.20.1", "license": "MIT", @@ -4596,6 +4756,29 @@ "node": ">=14.20.1" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "license": "MIT", @@ -4612,6 +4795,22 @@ "version": "1.1.2", "license": "MIT" }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "license": "MIT", @@ -4663,6 +4862,17 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "license": "MIT", @@ -4803,6 +5013,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4861,6 +5085,11 @@ "version": "2.1.4", "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cors": { "version": "2.8.5", "license": "MIT", @@ -4872,6 +5101,29 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/create-jest": { "version": "29.7.0", "license": "MIT", @@ -4908,6 +5160,11 @@ "node": ">= 8" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -5059,6 +5316,46 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/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==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/duplexify": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", @@ -5113,8 +5410,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "optional": true, "dependencies": { "once": "^1.4.0" } @@ -5683,6 +5978,33 @@ "node": ">=6" } }, + "node_modules/exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/exceljs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/execa": { "version": "5.1.1", "license": "MIT", @@ -5793,6 +6115,18 @@ "dev": true, "optional": true }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, @@ -6132,10 +6466,40 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "license": "ISC" }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -6603,6 +6967,25 @@ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { "version": "5.3.0", "license": "MIT", @@ -6615,6 +6998,11 @@ "dev": true, "license": "ISC" }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7727,6 +8115,49 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/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==" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -7788,6 +8219,49 @@ "node": ">=6" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/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==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/leven": { "version": "3.1.0", "license": "MIT", @@ -7807,6 +8281,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/limiter": { "version": "1.1.5", "dev": true @@ -7815,6 +8297,11 @@ "version": "1.2.4", "license": "MIT" }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, @@ -7842,6 +8329,31 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, "node_modules/lodash.includes": { "version": "4.3.0", "dev": true, @@ -7849,14 +8361,28 @@ }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "dev": true, "license": "MIT" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "dev": true, "license": "MIT" }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, "node_modules/lodash.isnumber": { "version": "3.0.3", "dev": true, @@ -7864,7 +8390,6 @@ }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "dev": true, "license": "MIT" }, "node_modules/lodash.isstring": { @@ -7872,6 +8397,11 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "license": "MIT" @@ -7886,6 +8416,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/long": { "version": "5.2.3", "license": "Apache-2.0" @@ -8050,12 +8590,22 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/module-alias": { "version": "2.2.3", "license": "MIT" @@ -8625,6 +9175,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8836,6 +9391,11 @@ "version": "18.2.0", "license": "MIT" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prompts": { "version": "2.4.2", "license": "MIT", @@ -9007,8 +9567,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9018,6 +9576,33 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "license": "MIT", @@ -9247,6 +9832,17 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -9336,6 +9932,11 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "license": "ISC" @@ -9499,8 +10100,6 @@ "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==", - "dev": true, - "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -9781,6 +10380,14 @@ "dev": true, "license": "MIT" }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" + } + }, "node_modules/tmpl": { "version": "1.0.5", "license": "BSD-3-Clause" @@ -9830,6 +10437,14 @@ "node": ">=12" } }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, "node_modules/ts-api-utils": { "version": "1.0.3", "dev": true, @@ -10128,6 +10743,55 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/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==" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "funding": [ @@ -10168,9 +10832,7 @@ "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==", - "dev": true, - "optional": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -10390,6 +11052,11 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/y18n": { "version": "5.0.8", "license": "ISC", @@ -10449,6 +11116,39 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } } } diff --git a/backend/package.json b/backend/package.json index 6055535..7cb109b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -16,6 +16,7 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "envalid": "^7.3.1", + "exceljs": "^4.4.0", "express": "^4.18.2", "express-validator": "^7.0.1", "firebase": "^10.7.2", diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 89b8c1d..bddb1b4 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -187,6 +187,7 @@ const writeSpreadsheet = async (filename: string) => { export const bulkExportVSRS: RequestHandler = async (req, res, next) => { try { + console.log("inside bulk export vsrs"); const filename = "vsrs.xlsx"; await writeSpreadsheet(filename); res.download(filename); diff --git a/backend/src/routes/vsr.ts b/backend/src/routes/vsr.ts index d36d7c8..f83c017 100644 --- a/backend/src/routes/vsr.ts +++ b/backend/src/routes/vsr.ts @@ -6,6 +6,7 @@ import * as VSRValidator from "src/validators/vsr"; const router = express.Router(); +router.get("/bulk_export", requireSignedIn, requireStaffOrAdmin, VSRController.bulkExportVSRS); router.get("/", requireSignedIn, requireStaffOrAdmin, VSRController.getAllVSRS); router.post("/", VSRValidator.createVSR, VSRController.createVSR); router.get("/:id", requireSignedIn, requireStaffOrAdmin, VSRController.getVSR); @@ -24,6 +25,5 @@ router.put( VSRValidator.updateVSR, VSRController.updateVSR, ); -router.get("/bulk_export", requireSignedIn, requireStaffOrAdmin, VSRController.bulkExportVSRS); export default router; diff --git a/frontend/src/api/VSRs.ts b/frontend/src/api/VSRs.ts index 8f9b235..38184f1 100644 --- a/frontend/src/api/VSRs.ts +++ b/frontend/src/api/VSRs.ts @@ -216,3 +216,25 @@ export async function updateVSR( return handleAPIError(error); } } + +export async function bulkExportVSRS(firebaseToken: string): Promise> { + try { + const response = await get("/api/vsr/bulk_export", createAuthHeader(firebaseToken)); + const blob = await response.blob(); + + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + + link.setAttribute("download", "vsrs.xlsx"); + document.body.appendChild(link); + + link.click(); + + window.URL.revokeObjectURL(url); + return { success: true, data: null }; + } catch (error) { + console.log(error); + return handleAPIError(error); + } +} diff --git a/frontend/src/app/staff/vsr/page.tsx b/frontend/src/app/staff/vsr/page.tsx index bd5c5e8..4868876 100644 --- a/frontend/src/app/staff/vsr/page.tsx +++ b/frontend/src/app/staff/vsr/page.tsx @@ -12,7 +12,7 @@ import { useMediaQuery } from "@mui/material"; import { useRedirectToLoginIfNotSignedIn } from "@/hooks/useRedirection"; import { UserContext } from "@/contexts/userContext"; import { DeleteVSRsModal } from "@/components/shared/DeleteVSRsModal"; -import { VSR, getAllVSRs } from "@/api/VSRs"; +import { VSR, getAllVSRs, bulkExportVSRS } from "@/api/VSRs"; import { VSRErrorModal } from "@/components/VSRForm/VSRErrorModal"; import { useScreenSizes } from "@/hooks/useScreenSizes"; import { LoadingScreen } from "@/components/shared/LoadingScreen"; @@ -24,6 +24,12 @@ enum VSRTableError { NONE, } +enum VSRExportError { + CANNOT_EXPORT_VSRS_NO_INTERNET, + CANNOT_EXPORT_VSRS_INTERNAL, + NONE, +} + /** * Root component for the VSR list/table view. */ @@ -35,6 +41,7 @@ export default function VSRTableView() { const [loadingVsrs, setLoadingVsrs] = useState(true); const [vsrs, setVsrs] = useState(); const [tableError, setTableError] = useState(VSRTableError.NONE); + const [exportError, setExportError] = useState(VSRExportError.NONE); const [selectedVsrIds, setSelectedVsrIds] = useState([]); const [deleteVsrModalOpen, setDeleteVsrModalOpen] = useState(false); @@ -133,6 +140,27 @@ export default function VSRTableView() { } }; + const exportVSRs = () => { + if (!firebaseUser) { + return; + } + + firebaseUser?.getIdToken().then((firebaseToken) => { + bulkExportVSRS(firebaseToken).then((result) => { + if (result.success) { + return; + } else { + if (result.error === "Failed to fetch") { + setExportError(VSRExportError.CANNOT_EXPORT_VSRS_NO_INTERNET); + } else { + console.error(`Error exporting VSRs: ${result.error}`); + setExportError(VSRExportError.CANNOT_EXPORT_VSRS_INTERNAL); + } + } + }); + }); + }; + return (
@@ -182,7 +210,7 @@ export default function VSRTableView() { text="Export" hideTextOnMobile onClick={() => { - // TODO: implement exporting VSRs + exportVSRs(); }} />
From 2f3a61ce84c5c848fa8f39f37813193d76bbc319 Mon Sep 17 00:00:00 2001 From: 2s2e Date: Fri, 12 Apr 2024 00:15:00 -0700 Subject: [PATCH 04/35] Made it so that the downloaded xlsx file is more properly formatted --- backend/src/controllers/vsr.ts | 24 +- backend/vsrs.xlsx | Bin 0 -> 7875 bytes frontend/package-lock.json | 650 ++++++++++++++++----------------- frontend/package.json | 2 +- 4 files changed, 327 insertions(+), 349 deletions(-) create mode 100644 backend/vsrs.xlsx diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index bddb1b4..5adb837 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -171,17 +171,23 @@ const writeSpreadsheet = async (filename: string) => { const worksheet = workbook.addWorksheet("New Sheet"); const vsrs = await VSRModel.find(); - - //make worksheet.columns according to all elements in vsrs - const columns = Object.keys(vsrs[0]); - worksheet.columns = columns.map((column) => { - return { header: column, key: column, width: 20 }; - }); - - for (let i = 0; i < vsrs.length; i++) { - worksheet.addRow(vsrs[i]); + const plainVsrs = vsrs.map((doc) => doc.toObject()); + + // Setup columns headers based on keys from the first object in the plainVsrs array + if (plainVsrs.length > 0) { + worksheet.columns = Object.keys(plainVsrs[0]).map((key) => ({ + header: key, + key: key, + width: 20, + })); + + // Add data rows to the worksheet + plainVsrs.forEach((item) => { + worksheet.addRow(item); + }); } + // Write to file await workbook.xlsx.writeFile(filename); }; diff --git a/backend/vsrs.xlsx b/backend/vsrs.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2f5b0db71b44fd3ec80fe62e0b379cc525d9096e GIT binary patch literal 7875 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 iW8yEkKEYo{=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.2.tgz", + "integrity": "sha512-6Gv/Fndih+dOEEfsBJEeKlwxw9EvCO9D/y+yJMasblvCmj78wUVtn+T96zguSrbhfZ2yBhLS1vukYiPg6hI49w==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/installations": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -925,14 +933,14 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.8.tgz", + "integrity": "sha512-scvzDPIsP9HcLWM77YQD7F3yLQksGvPUzyfqUrPo9XxIx26txJvGMJAS8O8BHa6jIvsjUenaTZ5oXEtKqNZQ9Q==", + "dependencies": { + "@firebase/analytics": "0.10.2", + "@firebase/analytics-types": "0.8.1", + "@firebase/component": "0.6.6", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -940,30 +948,30 @@ } }, "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.1.tgz", + "integrity": "sha512-niv/67/EOkTlGUxyiOYfIkysSMGYxkIUHJzT9pNkeIGt6zOz759oCUXOAwwjJzckh11dMBFjIYBmtWrdSgbmJw==" }, "node_modules/@firebase/app": { - "version": "0.9.23", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.23.tgz", - "integrity": "sha512-CA5pQ88We3FhyuesGKn1thaPBsJSGJGm6AlFToOmEJagWqBeDoNJqBkry/BsHnCs9xeYWWIprKxvuFmAFkdqoA==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.1.tgz", + "integrity": "sha512-H8hvbSVxNt+QaUQ1O0Gqidksi5ilj6eL8iMYxUNZgsMwZ1yOTgXc2C9zktbPQKokgcMq+EbF0k/t5iouslSkiA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "idb": "7.1.1", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.3.tgz", + "integrity": "sha512-nvlsj5oZBtYDjFTygQJ6xpyiYj8Jao2bFFyNJkUUPdg/QB8uhqDeG74P+gUH6iY9qzd1g5ZokmmGsoIhv9tdSQ==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -971,15 +979,15 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.10.tgz", + "integrity": "sha512-v+jiLG3rQ1fhpIuNIm3WqrL4dkPUIkgOWoic7QABVsZKSAv2YhOFvAenp7IhSP/pz/aiPniJ8G7el/MWieECTg==", + "dependencies": { + "@firebase/app-check": "0.8.3", + "@firebase/app-check-types": "0.5.1", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -987,42 +995,42 @@ } }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", + "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" }, "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.1.tgz", + "integrity": "sha512-NqeIcuGzZjl+khpXV0qsyOoaTqLeiG/K0kIDrebol+gb7xpmfOvXXqPEls+1WFBgHcPGdu+XRLhBA7xLzrVdpA==" }, "node_modules/@firebase/app-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.23.tgz", - "integrity": "sha512-UCv0LEzcoqAgY+sLsau7aOZz0CJNLN2gESY68bHKmukNXEN6onLPxBKJzn68CsZZGcdiIEXwvrum1riWNPe9Gw==", - "dependencies": { - "@firebase/app": "0.9.23", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.2.31", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.31.tgz", + "integrity": "sha512-TP9EwOiqDDL4tsP9EyOJn+RYUTkopS0nCg6TZ0PH8XiUgLlgDAF2waAZNha0+18elUkVjbWoXcudCgJ0iVWEVA==", + "dependencies": { + "@firebase/app": "0.10.1", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" } }, "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", + "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" }, "node_modules/@firebase/auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.4.0.tgz", - "integrity": "sha512-SfFXZCHDbY+7oSR52NSwx0U7LjYiA+N8imloxphCf3/F+MFty/+mhdjSXGtrJYd0Gbud/qcyedfn2XnWJeIB/g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.1.tgz", + "integrity": "sha512-h1nTQ/bKuKmXnwhQP1hi73aSnEp3YQnw+9k8ICwvNB9FhG0XJS5VNtR08cpLUpwl9clSTujg3EP/Hs/chZnq4A==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", + "tslib": "^2.1.0", + "undici": "5.28.4" }, "peerDependencies": { "@firebase/app": "0.x", @@ -1035,92 +1043,93 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.9.tgz", - "integrity": "sha512-Fw03i7vduIciEBG4imLtA1duJbljgkfbxiBo/EuekcB+BnPxHp+e8OGMUfemPYeO7Munj6kUC9gr5DelsQkiNA==", - "dependencies": { - "@firebase/auth": "1.4.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.6.tgz", + "integrity": "sha512-zXo0CnGG8UqFtXW76XfXdKmDaAUW7QEN0BYXYH04VuzdPCmkWaR5Uybjp/Tglh3+UqE4AhYcYe0p2n+mxmkLqA==", + "dependencies": { + "@firebase/auth": "1.7.1", + "@firebase/auth-types": "0.12.1", + "@firebase/component": "0.6.6", + "@firebase/util": "1.9.5", + "tslib": "^2.1.0", + "undici": "5.28.4" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", + "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" }, "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.1.tgz", + "integrity": "sha512-B3dhiWRWf/njWosx4zdhSEoD4WHJmr4zbnBw6t20mRG/IZ4u0rWUBlMP1vFjhMstKIow1XmoGhTwD65X5ZXLjw==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", + "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", "dependencies": { - "@firebase/util": "1.9.3", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" } }, "node_modules/@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", + "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.1", + "@firebase/auth-interop-types": "0.2.2", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", + "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/database": "1.0.4", + "@firebase/database-types": "1.0.2", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" } }, "node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", + "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" + "@firebase/app-types": "0.9.1", + "@firebase/util": "1.9.5" } }, "node_modules/@firebase/firestore": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.3.2.tgz", - "integrity": "sha512-K4TwMbgArWw+XAEUYX/vtk+TVy9n1uLeJKSrQeb89lwfkfyFINGLPME6YleaS0ovD1ziLM5/0WgL1CR4s53fDg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.0.tgz", + "integrity": "sha512-mul4L2Bp+Q5R5mV1nf5Z6OmsHHFid7uSEeR8oTM89p5G0nMam4GKaBAvgLSxwsXQbyy2WW9nNnuAWLfD7HDxFA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", + "@firebase/webchannel-wrapper": "0.10.6", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "tslib": "^2.1.0", + "undici": "5.28.4" }, "engines": { "node": ">=10.10.0" @@ -1130,14 +1139,14 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.22.tgz", - "integrity": "sha512-M166UvFvRri0CK/+5N0MIeXJVxR6BsX0/96xFT506DxRPIFezLjLcvfddtyFgfe0CtyQWoxBXt060uWUg3d/sw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.29.tgz", + "integrity": "sha512-ylBtvIQo2Caj1qXUd7ksj8xcL9l1b/F2Et6rq0smogPvl5CGvrv49xC5wVLJDmkMmH7IBEJb26KKC/RW1XYymg==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/firestore": "4.6.0", + "@firebase/firestore-types": "3.0.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1145,40 +1154,40 @@ } }, "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.1.tgz", + "integrity": "sha512-mVhPcHr5FICjF67m6JHgj+XRvAz/gZ62xifeGfcm00RFl6tNKfCzCfKeyB2BDIEc9dUnEstkmIXlmLIelOWoaA==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.4.tgz", + "integrity": "sha512-FeMpXtlZG8hnxUauI5J8BSmIbY/Gcv7UVlByxHuHmGxxeS8mJPuAdIxPLUBNtV/naf+MeimIPcpPMslYr6tN6w==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.1", + "@firebase/auth-interop-types": "0.2.2", + "@firebase/component": "0.6.6", + "@firebase/messaging-interop-types": "0.2.1", + "@firebase/util": "1.9.5", + "tslib": "^2.1.0", + "undici": "5.28.4" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.10.tgz", + "integrity": "sha512-2Yidp6Dgf2k8LqJDQUTqdYFdf4ySNmZ71yeDX4lThby1HRMww+Y3nN98YaM6hHarZX3PUfaMUiMBZMHCRRT2IA==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/functions": "0.11.4", + "@firebase/functions-types": "0.6.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1186,18 +1195,18 @@ } }, "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.1.tgz", + "integrity": "sha512-DirqgTXSBzyKsQwcKnx/YdGMaRdJhywnThrINP+Iog8QfQnrL7aprTXHDFHlpZEMwykS54YRk53xzz7j396QXQ==" }, "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.6.tgz", + "integrity": "sha512-dNGRGoHmstgEJqh9Kzk22fR2ZrVBH1JWliaL6binQ6pIzlWscreHNczzJDgOKoVT0PjWTrAmh/azztiX/e2uTw==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", + "@firebase/component": "0.6.6", + "@firebase/util": "1.9.5", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1205,14 +1214,14 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.6.tgz", + "integrity": "sha512-uxBAt2WsuEMT5dalA/1O+Uyi9DS25zKHgIPdrQ7KO1ZUdBURiGScIyjdhIM/7NMSvHGYugK4PUVdK9NFIffeiw==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/installations": "0.6.6", + "@firebase/installations-types": "0.5.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1220,36 +1229,31 @@ } }, "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.1.tgz", + "integrity": "sha512-OyREnRTfe2wIWTrzCz65ajyo4lFm6VgbeVqMMP+3GJLfCtNvY9VXkmqs3WFEsyYezzdcRqOt39FynZoLlkO+cQ==", "peerDependencies": { "@firebase/app-types": "0.x" } }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", + "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", + "version": "0.12.8", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.8.tgz", + "integrity": "sha512-FbCTNhv5DUBo8It+Wj3XbKM1xf3PeoHsHk8PjMWBNm0yP+LL8Jhd3ejRsukEYdysTMvgxY4sU5Cs5YNTK44qTQ==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/installations": "0.6.6", + "@firebase/messaging-interop-types": "0.2.1", + "@firebase/util": "1.9.5", + "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1257,13 +1261,13 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.8.tgz", + "integrity": "sha512-/2ibL9u64jn76g67qjAZutVnPTV6euu0z3BvCjcqlNbMMdtoyNjyHOBRe/D7eVcrRt0uB4rTPnjr3A6sVKdjuA==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", + "@firebase/component": "0.6.6", + "@firebase/messaging": "0.12.8", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1271,24 +1275,19 @@ } }, "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.1.tgz", + "integrity": "sha512-jfGJ7Jc32BDHXvXHyXi34mVLzZY8X0t929DTMwz7Tj2Hc40Zuzx8VRCIPLRrRUyvBrJCd5EpIcQgCygXhtaN1A==" }, "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.6.tgz", + "integrity": "sha512-UOUHhvj2GJcjyJewdX1ShnON0/eqTswHvYzzQPC4nrIuMFvHwMGk8NpCaqh7JZmpaxh9AMr6kM+M/p37DrKWXA==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/installations": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1296,15 +1295,15 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.6.tgz", + "integrity": "sha512-JSGdNNHBAMRTocGpN+m+7tk+9rulBcwuG+Ejw/ooDj45FGcON1Eymxh/qbe5M6Dlj5P1ClbkHLj4yf7MiCHOag==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/performance": "0.6.6", + "@firebase/performance-types": "0.2.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1312,19 +1311,19 @@ } }, "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.1.tgz", + "integrity": "sha512-kQ8pEr4d6ArhPoYrngcFlEJMNWMdEZTpvMAttWH0C2vegBgj47cm6xXFy9+0j27OBhOIiPn48Z+2WE2XNu33CQ==" }, "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.6.tgz", + "integrity": "sha512-qtanFS+AX5k/7e/+Azf27Hq4reX28QsUvRcYWyS5cOaRMS9jtll4MK4winWmzX8MdJY637nFzIx43PlMKVnaKw==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/installations": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1332,15 +1331,15 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.6.tgz", + "integrity": "sha512-cFdpmN/rzDhm4pbk0WpOzK9JQ9I1ZhXzhtYbKRBwUag3pG1odEfIORygMDCGQniPpcae/QGXho4srJHfoijKuw==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/logger": "0.4.1", + "@firebase/remote-config": "0.4.6", + "@firebase/remote-config-types": "0.3.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1348,33 +1347,33 @@ } }, "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.1.tgz", + "integrity": "sha512-PgmfUugcJAinPLsJlYcBbNZe7KE2omdQw1WCT/z46nKkNVGkuHdVFSq54s3wiFa9BoHmLZ01u4hGXIhm6MdLOw==" }, "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.4.tgz", + "integrity": "sha512-HcmUcp2kSSr5cHkIqFrgUW+i20925EEjkXepQxgBcI2Vx0cyqshr8iETtGow2+cMBFeY8H2swsKKabOKAjIwlQ==", "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "@firebase/component": "0.6.6", + "@firebase/util": "1.9.5", + "tslib": "^2.1.0", + "undici": "5.28.4" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.7.tgz", + "integrity": "sha512-pTlNAm8/QPN7vhYRyd5thr2ouCykP+wIFXHY1AV42WTrk98sTGdIlt/tusHzmrH4mJ34MPaICS0cn2lYikiq8w==", + "dependencies": { + "@firebase/component": "0.6.6", + "@firebase/storage": "0.12.4", + "@firebase/storage-types": "0.8.1", + "@firebase/util": "1.9.5", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1382,26 +1381,26 @@ } }, "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.1.tgz", + "integrity": "sha512-yj0vypPT9UbbfYYwzpXPYchnjWqCADcTbGNawAIebww8rnQYPGbESYTKQdFRPXiLspYPB7xCHTXThmMJuvDcsQ==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", + "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==" + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.6.tgz", + "integrity": "sha512-EnfRJvrnzkHwN3BPMCayCFT5lCqInzg3RdlRsDjDvB1EJli6Usj26T6lJ67BU2UcYXBS5xcp1Wj4+zRzj2NaZg==" }, "node_modules/@floating-ui/core": { "version": "1.5.3", @@ -1438,9 +1437,9 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@grpc/grpc-js": { - "version": "1.9.11", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.11.tgz", - "integrity": "sha512-QDhMfbTROOXUhLHMroow8f3EHiCKUOh6UwxMP5S3EuXMnWMNSVIhatGZRwkpg9OUTYdZPsDUVH3cOAkWhGFUJw==", + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -1450,9 +1449,9 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", + "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -5085,36 +5084,36 @@ } }, "node_modules/firebase": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.6.0.tgz", - "integrity": "sha512-bnYwHwZ6zB+dM6mGQPEXcFHtAT2WoVzG6H4SIR8HzURVGKJxBW+TqfP3qcJQjTZV3tDqDTo/XZkVmoU/SovV8A==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.23", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.23", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.4.0", - "@firebase/auth-compat": "0.4.9", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-compat": "0.3.22", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.11.0.tgz", + "integrity": "sha512-stWqB0cmUBFidaWCgDV6on6uQyAV8jFe9XdOp0Y1GRM/LUn0MjPSgW06Tc3pFlaefQ+WTLR/CNwL+0qGhxDLIA==", + "dependencies": { + "@firebase/analytics": "0.10.2", + "@firebase/analytics-compat": "0.2.8", + "@firebase/app": "0.10.1", + "@firebase/app-check": "0.8.3", + "@firebase/app-check-compat": "0.3.10", + "@firebase/app-compat": "0.2.31", + "@firebase/app-types": "0.9.1", + "@firebase/auth": "1.7.1", + "@firebase/auth-compat": "0.5.6", + "@firebase/database": "1.0.4", + "@firebase/database-compat": "1.0.4", + "@firebase/firestore": "4.6.0", + "@firebase/firestore-compat": "0.3.29", + "@firebase/functions": "0.11.4", + "@firebase/functions-compat": "0.3.10", + "@firebase/installations": "0.6.6", + "@firebase/installations-compat": "0.2.6", + "@firebase/messaging": "0.12.8", + "@firebase/messaging-compat": "0.2.8", + "@firebase/performance": "0.6.6", + "@firebase/performance-compat": "0.2.6", + "@firebase/remote-config": "0.4.6", + "@firebase/remote-config-compat": "0.2.6", + "@firebase/storage": "0.12.4", + "@firebase/storage-compat": "0.3.7", + "@firebase/util": "1.9.5" } }, "node_modules/flat-cache": { @@ -7101,25 +7100,6 @@ } } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -7626,9 +7606,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -8484,11 +8464,6 @@ "node": ">=6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -8695,6 +8670,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -8799,11 +8785,6 @@ "node": ">=10.13.0" } }, - "node_modules/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==" - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -8844,15 +8825,6 @@ "node": ">=12" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index d7af5cc..786d499 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -25,7 +25,7 @@ "@testing-library/react": "^14.1.2", "email-validator": "^2.0.4", "envalid": "^8.0.0", - "firebase": "^10.6.0", + "firebase": "^10.11.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "moment": "^2.30.1", From ac69d66a6773a53b233201943680ec8cd6c03e2c Mon Sep 17 00:00:00 2001 From: 2s2e Date: Sat, 13 Apr 2024 13:49:12 -0700 Subject: [PATCH 05/35] Reformatted array brackets --- backend/src/controllers/vsr.ts | 28 +++++++++++++++++++++++++--- backend/vsrs.xlsx | Bin 7875 -> 7848 bytes 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 5adb837..7143073 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -184,11 +184,33 @@ const writeSpreadsheet = async (filename: string) => { // Add data rows to the worksheet plainVsrs.forEach((item) => { worksheet.addRow(item); + + //cast each element in the row to a string + + //for the row that was just added in the spreadsheet, if there are brackets surrounding any of the entries, remove them + if (worksheet.lastRow) { + worksheet.lastRow.eachCell((cell) => { + if (cell.value && !(typeof cell.value === "number")) { + cell.value = cell.value.toString(); + } + }); + + worksheet.lastRow.eachCell((cell) => { + if ( + cell.value && + typeof cell.value == "string" && + cell.value[0] === "[" && + cell.value[cell.value.length - 1] === "]" + ) { + cell.value = cell.value.slice(1, -1); + } + }); + } }); - } - // Write to file - await workbook.xlsx.writeFile(filename); + // Write to file + await workbook.xlsx.writeFile(filename); + } }; export const bulkExportVSRS: RequestHandler = async (req, res, next) => { diff --git a/backend/vsrs.xlsx b/backend/vsrs.xlsx index 2f5b0db71b44fd3ec80fe62e0b379cc525d9096e..c93a369b499320baa930b3bcc0238a731c7bd32c 100644 GIT binary patch delta 3648 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 CoREG1 From 828502fe9abda4ade1558de3f32cc14859e81f42 Mon Sep 17 00:00:00 2001 From: HarshGurnani Date: Sat, 13 Apr 2024 16:09:01 -0700 Subject: [PATCH 06/35] added success and error popups --- backend/vsrs.xlsx | Bin 7875 -> 8336 bytes frontend/src/app/staff/vsr/page.tsx | 72 +++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/backend/vsrs.xlsx b/backend/vsrs.xlsx index 2f5b0db71b44fd3ec80fe62e0b379cc525d9096e..639984658efdaae4ddd019813f9bcbf8893f8715 100644 GIT binary patch delta 3432 zcmZ8k2{e@J8~EE!`7A!Hk}CD&56 z#-vR`$P&5{N_KzrzxSMbzw^HD?>*1&InVc=@A=O2{N66r6b%+5Jvs;z002+`)|_0+ z5(lC?Kw=h%?+_`iAhzEIDwyYpSONczrM8oR(3N8VaPAb*2f~ZX zwhJh{!j502RTnflXy8G$ZzXmJEt>|iR=@5}mc5O-4w{?Z*^;@IcCoQo{8KTQ7AUi3 z(5_mRn_sP4shTL8IP;`J0Z~#F?<0~m6g>X!3x&cfVK=aPtrh0f%we~y@4Q9(q@K%_ zy+@VToFQGQp|)%Z(L#K>dOMSKqAGEGAx;&&S4wnKDh2|5oLe!F0cnwVmI2w*XBZ0~ zNA|ulXeVB*GB*~%OOFXV8D)p%x)kHgjmoMX zI=y?h>pGf$p=Ic6dNi$H_fzpllgg+F@~U*T9&T0kV{wtpbr0%7&cHPYhy~j{mcRLJ@v2K?eCB3Jg^ifvm|OEz9ySG% zHW>>&>!t`>Eg06FP0Y;XuCv1#rE5^^oRz|=MrxX@11(|e@7#mLO^0c!lKx=D^jsPKn2yjv~6PigCAi%>Q?4mz#2z2o)@WJE-QZ>~? z0-1GZqD>l8E~%Xj7D!|3AJ-JyESTg@>thh4r5LD*gyCaWHAZBL)7hBvch6-!Xz6yV zs4?*5Fqb>?x{(c)76PD5LfqeF4nw<9R2ra_IxSY8`uPNqI%x`|ergA_{PXDuOlx4Y zz?k4|ohESrm+ChR@WIUra=wsG0l@hnrPGwKCMYG#EAy~X&Q9D>r}~T zpnk=OclL*;)28%>mTicRz-N9%5ow5To|pc*1Q>h30IfOhj}6ssMV?8C<_h#UcAstt z8e?n<7~AcD+4bj<==ydppirWvUbJf@eagGvZ#@f7`Fjs1j~>`M{p4K~`TZP;c#4#X=BktxqE80^DB|{ACp`J#umwR}t)%VKJZ)_j}oW2Uf z$>vi-j0`BXDFD|kY|HWFmA$QhzaLo|SqkfEmpxoXyNo|lMHIiJPboSo8gSo*+WNir z+v&YnHRA7M+NR%47bQ#EzCtC?!6vH{G5uarQQqy$~U(!@J{b_#)U(gm)@zO^$iT%$jDr+m-IuphqR z6!6^);lWwp`J`sA4G-NYC)JHs)}YI`w>g5*t6Dp6e6wvkn(x4y7lz|(NfY!SBU<9+ zGZQYm*WiDmocVrqnY2Eei>PAZn!$5D$ap1~@Kle4=}rH9a^sd*fothKjp3j@t=AyV z3?nvKTxnsrmQar&cM{)UP4)_YNGH7#2@ejzg~~FiubsxVGwH&j95XsrA&(JPnUBRa z+gc!bD)nq>%M8(uivI8A=$XpDw9^t}#uNSK+sQfN{`_VT#NeKHa7aj`y;{(~JrDZh zrHsw}Kkyl)D701LXcV`L+E7` z);~M8U-+Xm6OnXm$ZNls`s2Rshies+k;7^2Hhs_VNv<&SoXz}Gc>>PXaAopK3#_*u zDxvgI_~)HJPL>j~&dushFH_dZ8J!9f*cq1Hsiatqm-wzS-~EVv2AbLo=H#eGo<$4I z2{)RvVt;?R;BDl$Jr(3fezHb@q7g&S2n|7>9kJ#1Y z>5EMtNC+uC<~)a^&2z0t@S^i(rsXqev3^s}E^NKO_A)?D1~!qqH; zUzT0Zr}yTxP)HNiw@5%po7oygFHu;f%dcXShwWLaXhqailc4gl&>`kA&Z(yAR{R~_ zkz?KvM_Di}{^V)%*106HHdN`l7RE17v_i=yGC{PZ&{}#+^gV1`f}C5V%zX~3>Na!t zsl~GTtI%iT-YG>{iBz0^m~~Dc>p#^BIMkKIX4r4pI0-YPKhlrVCz`-Vg7O>3ZwAg; z4T2sD$=*yX195B>XQZIZwT=^VYU7*;TqCBMpLi5( zxH6aoq~jVD;YX#c?Eo+fVY!#$_)Jp$cn;o{sJps2KX* z$O>4Eo6y*QZ}gM6JBpQ>=c@ZvG2rk|mw_B6j^f2l_^tETPpKW{O965I2)z*UM_7!I zJi>v~2;z4H_t74P)ILHCQt7{UgB+wH>M+ayZC?i+?ElX@M&cTh|L>T{P}ZZ~7U=Hc z<8sbO4+Mq-|6EsyhNltW0#@QOjDzjJRLTLh3MW23jrcp1(&K|x>Fj&m$lup5;J=|P zPtUn4$AADphzrgh{7mEmdTd2 zt7I*MPIT1)k-Pq_1{^GhDTV~I+NzLp9OiF21FSi80va2qM}%81jz9QG8^sQA2!4vC}TU;yXbH|->Rg)LptQ<{V zH+rS`bJaC@4*8@CMv7E-G&*gf*$>e+tSZmfj3g{9R{N|$Q#_O$^gUUL^bBW$iN$)+ zE$x8omz87{w2u4u%aZy7KWHe^I}cCZ)1?IU$}xb}W^P<68+NbtZ&3bfyGj z?CLD+gr(~>>PO^LAt9Of2^DDRhc$!VOJ8U2wr?ZkCI>%w^C7YRZKM{@*U}U5(xr88 zj8PHYmP@u~~I|rR%#94)uWI`A8YsF|CFsMee2s3WVlb>IuhdltKAHQdD| zPOhbGY6LcB1{MNlVCPDq9*cX<0vnhiEd67p@4=)18`x1K_-kothnBMI4auWa6Q$}m z>w>dq#f4OQjKwvvdBl-8#K_TBzc9H%_lm8ckMnA!+Jw;7w|U6HPm1ni!+f)%ou@UM zo|Uj-wZ-7WT0t41F{{@P`(=be{(z46deB7)Xzu>ZJ{MLo8U#G_P~A*3QeQX3ksBfr zXn@MAFOHmh5F~)kBAw9ifyYckLCbZgQ4duhO{-BKy7cI`9N|09M3>UR6I)fKM)hP& zR;ssJ@f4=GI+!y}*#9KeQebSp%xCxvy;Jk)!tiG3_&sq@qv&N&BP&mE@C3Lm(U<`L z@ukW8X^{tyhJ?p*o&`$y8(UKuUg-PM^Tktq4~Nd<&~muB!5t|L4S;5R^37n^h%2gSH`6rma%jph?f< z<3!VQMFMSMKR1MO5P1B1saG;L@Mee|)_*iGJKt5~Q}N6IGeBb}G1w3UqK$U|LIwVF z^kPnR+nNcr`perWe$u5&$b9@PFnixTzf6na2dZ~K3mxD1#y76?o*{H4s=9kY+@pe4 zCX+DwlY$<~z5aTpP)aRPJPM=iFwwegneMSAzK%Ye>16IrX5#!YM^f-MFr29$AF zVoDQH>!TPS{tU9<-j#gIt<4er*7Db3!@19EGJo8*7zoolOefSqLo$7_-AR0NxsbJx z7wrOPO`*rWiXE2KPNk_(1zLi-fnsLKpxsxLHR75+a zdDp*t+9Nqnk8_N3BRkF`)m31JQiYjDd_$1C<|EoFD5jd>=-(Y9zgW#Z%IYue+l@{hBlw1!dgxg3o zs(fqMHNFH7mQFs>Yci4JnMM>$3d&|JwdoStEtC+MaN!}^=Oqm3ib;qieMHj2V}9!`x1138Z`pHBA*3H zm>~OzF*_1nMoK#>^1GSEn-iQ-i`%i%>+;^|fVCqRvzac)gIf=U6+J2be8Y0$?B-(I zW(Bm7_<*s#EYo7{xAC}Oh9~pBAS8~yqlej z_&V{yOe@;h>66-Qk+6veez7h_BN-Q(RlJ}|CdrBgK)Q45Oy`M8iukPDArU!7zje{A zab9W5?CuYN$vv8JNZS?nN)ZSWa zKa`s&u2blQQn3TUNseN_bM%UG@f~4AVm5myFz-yZJ3WxPbwVG%waJ96T}g|y3!gT> zzgR}1GNZE@-tUrZKIks`EUjhBcT0us(kM9~LT;6!anIzK@@=Uy z^n>O$CG#?C|A+Y>G)$bD8l^OlR3?lI`!&jN(B%*JnMX~G2J1@`gu;Ii2Lod5uAe+}S!-g8a>zpkU~WSG5fRltInSD&!Xde0O0C#+0x&~ zH{kz@()Oyb@{{I8gb&uTe>sDg06>%(0J#3UBv36tl17Of?1d>x5ae`}(); const [tableError, setTableError] = useState(VSRTableError.NONE); const [exportError, setExportError] = useState(VSRExportError.NONE); + const [exportSuccess, setExportSucess] = useState(false); const [selectedVsrIds, setSelectedVsrIds] = useState([]); const [deleteVsrModalOpen, setDeleteVsrModalOpen] = useState(false); @@ -140,6 +142,62 @@ export default function VSRTableView() { } }; + const renderExportErrorModal = () => { + switch (exportError) { + case VSRExportError.CANNOT_EXPORT_VSRS_NO_INTERNET: + return ( + { + setExportError(VSRExportError.NONE); + }} + imageComponent={ + No Internet + } + title="No Internet Connection" + content="Unable to export VSRs due to no internet connection. Please check your connection and try again" + buttonText="Try Again" + onButtonClicked={() => { + setExportError(VSRExportError.NONE); + exportVSRs(); + }} + /> + ); + + case VSRExportError.CANNOT_EXPORT_VSRS_INTERNAL: + return ( + { + setExportError(VSRExportError.NONE); + }} + imageComponent={ + Internal Error + } + title="Internal Error" + content="Something went wrong with exporting the VSRs. Our team is working to fix it. Please try again later." + buttonText="Try Again" + onButtonClicked={() => { + setExportError(VSRExportError.NONE); + exportVSRs(); + }} + /> + ); + default: + return null; + } + }; + const exportVSRs = () => { if (!firebaseUser) { return; @@ -148,6 +206,7 @@ export default function VSRTableView() { firebaseUser?.getIdToken().then((firebaseToken) => { bulkExportVSRS(firebaseToken).then((result) => { if (result.success) { + setExportSucess(true); return; } else { if (result.error === "Failed to fetch") { @@ -229,8 +288,19 @@ export default function VSRTableView() { - {/* Error modal and delete modal */} + {/* Error modals, success model, and delete modal */} + setExportSucess(false), + }, + ]} + /> {renderErrorModal()} + {renderExportErrorModal()} setDeleteVsrModalOpen(false)} From bc71c1fa7b65f70c40817fc30b8840c6d89bd125 Mon Sep 17 00:00:00 2001 From: HarshGurnani Date: Mon, 15 Apr 2024 17:57:46 -0700 Subject: [PATCH 07/35] added loading state to export button --- backend/vsrs.xlsx | Bin 8336 -> 8353 bytes frontend/src/app/staff/vsr/page.tsx | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/vsrs.xlsx b/backend/vsrs.xlsx index 639984658efdaae4ddd019813f9bcbf8893f8715..a8b0ef66b151e3a1f5fbd15b5288fae4f39af5fb 100644 GIT binary patch delta 4148 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 delta 4108 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 F{{YgUYdin| diff --git a/frontend/src/app/staff/vsr/page.tsx b/frontend/src/app/staff/vsr/page.tsx index af07ca2..5a618d5 100644 --- a/frontend/src/app/staff/vsr/page.tsx +++ b/frontend/src/app/staff/vsr/page.tsx @@ -44,6 +44,7 @@ export default function VSRTableView() { const [tableError, setTableError] = useState(VSRTableError.NONE); const [exportError, setExportError] = useState(VSRExportError.NONE); const [exportSuccess, setExportSucess] = useState(false); + const [loadingExport, setLoadingExport] = useState(false); const [selectedVsrIds, setSelectedVsrIds] = useState([]); const [deleteVsrModalOpen, setDeleteVsrModalOpen] = useState(false); @@ -203,11 +204,11 @@ export default function VSRTableView() { return; } + setLoadingExport(true); firebaseUser?.getIdToken().then((firebaseToken) => { bulkExportVSRS(firebaseToken).then((result) => { if (result.success) { setExportSucess(true); - return; } else { if (result.error === "Failed to fetch") { setExportError(VSRExportError.CANNOT_EXPORT_VSRS_NO_INTERNET); @@ -216,6 +217,7 @@ export default function VSRTableView() { setExportError(VSRExportError.CANNOT_EXPORT_VSRS_INTERNAL); } } + setLoadingExport(false); }); }); }; @@ -266,6 +268,7 @@ export default function VSRTableView() { outlined={false} iconPath="/upload.svg" iconAlt="Export" + loading={loadingExport} text="Export" hideTextOnMobile onClick={() => { From e2dbc01a20796fd0725eeeeba86eb692c1330166 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 09:23:33 -0700 Subject: [PATCH 08/35] Fix image path issue with no internet error message --- frontend/src/app/staff/vsr/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/staff/vsr/page.tsx b/frontend/src/app/staff/vsr/page.tsx index 5a618d5..e4a496d 100644 --- a/frontend/src/app/staff/vsr/page.tsx +++ b/frontend/src/app/staff/vsr/page.tsx @@ -154,7 +154,7 @@ export default function VSRTableView() { }} imageComponent={ No Internet Date: Thu, 18 Apr 2024 09:53:11 -0700 Subject: [PATCH 09/35] Clean up VSRs spreadsheet formatting --- backend/src/controllers/vsr.ts | 152 +++++++++++++++++++++------- backend/src/models/furnitureItem.ts | 2 +- backend/src/models/vsr.ts | 5 +- backend/vsrs.xlsx | Bin 8353 -> 0 bytes 4 files changed, 117 insertions(+), 42 deletions(-) delete mode 100644 backend/vsrs.xlsx diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 7143073..6b9a0f7 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -1,13 +1,15 @@ import { RequestHandler } from "express"; import { validationResult } from "express-validator"; import createHttpError from "http-errors"; -import VSRModel from "src/models/vsr"; +import FurnitureItemModel, { FurnitureItem } from "src/models/furnitureItem"; +import VSRModel, { FurnitureInput, VSR } from "src/models/vsr"; import { sendVSRConfirmationEmailToVeteran, sendVSRNotificationEmailToStaff, } from "src/services/emails"; import validationErrorParser from "src/util/validationErrorParser"; import ExcelJS from "exceljs"; +import { ObjectId } from "mongodb"; /** * Gets all VSRs in the database. Requires the user to be signed in and have @@ -158,11 +160,56 @@ export const deleteVSR: RequestHandler = async (req, res, next) => { } }; +/** + * Converts an entry in a VSR to a formatted string to write to the Excel spreadsheet + */ +const stringifyEntry = ( + entry: string | number | string[] | number[] | boolean | Date | undefined, +) => { + if (!entry) { + return ""; + } + + if (Array.isArray(entry)) { + return entry.join(", "); + } else { + return entry.toString(); + } +}; + +type FurnitureItemEntry = FurnitureItem & { _id: ObjectId }; + +/** + * Formats a VSR's selected furniture items as a string + */ +const stringifySelectedFurnitureItems = ( + selectedItems: FurnitureInput[] | undefined, + allFurnitureItems: FurnitureItemEntry[], +) => { + if (!selectedItems) { + return ""; + } + + const itemIdsToItems: Record = {}; + + for (const furnitureItem of allFurnitureItems) { + itemIdsToItems[furnitureItem._id.toString()] = furnitureItem; + } + + return selectedItems + .map((selectedItem) => { + const furnitureItem = itemIdsToItems[selectedItem.furnitureItemId]; + return furnitureItem ? `${furnitureItem.name}: ${selectedItem.quantity}` : "[unknown]"; + }) + .join(", "); +}; + const writeSpreadsheet = async (filename: string) => { const workbook = new ExcelJS.Workbook(); workbook.creator = "PAP Inventory System"; workbook.lastModifiedBy = "Bot"; + //current date workbook.created = new Date(); workbook.modified = new Date(); @@ -173,49 +220,76 @@ const writeSpreadsheet = async (filename: string) => { const vsrs = await VSRModel.find(); const plainVsrs = vsrs.map((doc) => doc.toObject()); - // Setup columns headers based on keys from the first object in the plainVsrs array - if (plainVsrs.length > 0) { - worksheet.columns = Object.keys(plainVsrs[0]).map((key) => ({ - header: key, - key: key, - width: 20, - })); - - // Add data rows to the worksheet - plainVsrs.forEach((item) => { - worksheet.addRow(item); - - //cast each element in the row to a string - - //for the row that was just added in the spreadsheet, if there are brackets surrounding any of the entries, remove them - if (worksheet.lastRow) { - worksheet.lastRow.eachCell((cell) => { - if (cell.value && !(typeof cell.value === "number")) { - cell.value = cell.value.toString(); - } - }); - - worksheet.lastRow.eachCell((cell) => { - if ( - cell.value && - typeof cell.value == "string" && - cell.value[0] === "[" && - cell.value[cell.value.length - 1] === "]" - ) { - cell.value = cell.value.slice(1, -1); - } - }); - } - }); + // Fields that we want to write to the spreadsheet. First is field name, second is display name. + const fieldsToWrite: [keyof VSR, string][] = [ + ["name", "Name"], + ["gender", "Gender"], + ["age", "Age"], + ["maritalStatus", "Marital Status"], + ["spouseName", "Spouse Name"], + ["agesOfBoys", "Ages of boys"], + ["agesOfGirls", "Ages of girls"], + ["ethnicity", "Ethnicity"], + ["employmentStatus", "Employment Status"], + ["incomeLevel", "Income Level"], + ["sizeOfHome", "Size of Home"], + + ["streetAddress", "Street Address"], + ["city", "City"], + ["state", "State"], + ["zipCode", "Zip Code"], + ["phoneNumber", "Phone Number"], + ["email", "Email Address"], + ["branch", "Branch"], + ["conflicts", "Conflicts"], + ["dischargeStatus", "Discharge Status"], + ["serviceConnected", "Service Connected"], + ["lastRank", "Last Rank"], + ["militaryID", "Military ID"], + ["petCompanion", "Pet Companion Desired"], + ["hearFrom", "Referral Source"], + + ["selectedFurnitureItems", "Selected Furniture Items"], + ["additionalItems", "Additional Items"], + + ["dateReceived", "Date Received"], + ["lastUpdated", "Last Updated"], + ["status", "Status"], + ]; + + worksheet.columns = fieldsToWrite.map((field) => ({ + header: field[1], + key: field[0], + width: 20, + })); + + const allFurnitureItems = await FurnitureItemModel.find(); + + // Add data rows to the worksheet + plainVsrs.forEach((vsr) => { + worksheet.addRow( + fieldsToWrite.reduce( + (prev, field) => ({ + ...prev, + [field[0]]: + field[0] === "selectedFurnitureItems" + ? stringifySelectedFurnitureItems( + vsr[field[0]] as FurnitureInput[] | undefined, + allFurnitureItems, + ) + : stringifyEntry(vsr[field[0]]), + }), + {}, + ), + ); + }); - // Write to file - await workbook.xlsx.writeFile(filename); - } + // Write to file + await workbook.xlsx.writeFile(filename); }; export const bulkExportVSRS: RequestHandler = async (req, res, next) => { try { - console.log("inside bulk export vsrs"); const filename = "vsrs.xlsx"; await writeSpreadsheet(filename); res.download(filename); diff --git a/backend/src/models/furnitureItem.ts b/backend/src/models/furnitureItem.ts index f5998bc..2c4f6d2 100644 --- a/backend/src/models/furnitureItem.ts +++ b/backend/src/models/furnitureItem.ts @@ -17,6 +17,6 @@ const furnitureItemSchema = new Schema({ categoryIndex: { type: Number, required: true }, }); -type FurnitureItem = InferSchemaType; +export type FurnitureItem = InferSchemaType; export default model("FurnitureItem", furnitureItemSchema); diff --git a/backend/src/models/vsr.ts b/backend/src/models/vsr.ts index 556cddf..cd46f87 100644 --- a/backend/src/models/vsr.ts +++ b/backend/src/models/vsr.ts @@ -3,7 +3,7 @@ import { InferSchemaType, Schema, model } from "mongoose"; /** * A schema for a single furniture item that a veteran can request */ -const furntitureInputSchema = new Schema({ +export const furntitureInputSchema = new Schema({ // ID of the furniture item being required (Object ID for an instance of the furniture item model) furnitureItemId: { type: String, required: true }, @@ -55,6 +55,7 @@ const vsrSchema = new Schema({ status: { type: String, required: true }, }); -type VSR = InferSchemaType; +export type FurnitureInput = InferSchemaType; +export type VSR = InferSchemaType; export default model("VSR", vsrSchema); diff --git a/backend/vsrs.xlsx b/backend/vsrs.xlsx deleted file mode 100644 index a8b0ef66b151e3a1f5fbd15b5288fae4f39af5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8353 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 Wtc?8gzlI0zO1j_?*-7<7{Qm$c8w3Xc From 42ea73f19984011df91ee39b436740e48e31da08 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 10:05:19 -0700 Subject: [PATCH 10/35] Minor frontend changes for exporting VSRs --- frontend/src/api/VSRs.ts | 1 - frontend/src/app/staff/vsr/page.tsx | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/frontend/src/api/VSRs.ts b/frontend/src/api/VSRs.ts index 38184f1..682a637 100644 --- a/frontend/src/api/VSRs.ts +++ b/frontend/src/api/VSRs.ts @@ -234,7 +234,6 @@ export async function bulkExportVSRS(firebaseToken: string): Promise(); const [tableError, setTableError] = useState(VSRTableError.NONE); const [exportError, setExportError] = useState(VSRExportError.NONE); - const [exportSuccess, setExportSucess] = useState(false); + const [exportSuccess, setExportSuccess] = useState(false); const [loadingExport, setLoadingExport] = useState(false); const [selectedVsrIds, setSelectedVsrIds] = useState([]); @@ -204,11 +204,13 @@ export default function VSRTableView() { return; } + setExportSuccess(false); + setExportError(VSRExportError.NONE); setLoadingExport(true); firebaseUser?.getIdToken().then((firebaseToken) => { bulkExportVSRS(firebaseToken).then((result) => { if (result.success) { - setExportSucess(true); + setExportSuccess(true); } else { if (result.error === "Failed to fetch") { setExportError(VSRExportError.CANNOT_EXPORT_VSRS_NO_INTERNET); @@ -271,9 +273,7 @@ export default function VSRTableView() { loading={loadingExport} text="Export" hideTextOnMobile - onClick={() => { - exportVSRs(); - }} + onClick={exportVSRs} /> @@ -298,7 +298,7 @@ export default function VSRTableView() { actions={[ { text: "Dismiss", - onClick: () => setExportSucess(false), + onClick: () => setExportSuccess(false), }, ]} /> From 431dd42d843bc4addb0070fbca2a18fc2b6bd9dd Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 10:06:37 -0700 Subject: [PATCH 11/35] Remove Excel file from backend filesystem after sending to client --- backend/src/controllers/vsr.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 6b9a0f7..65e0f42 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -1,5 +1,6 @@ import { RequestHandler } from "express"; import { validationResult } from "express-validator"; +import fs from "fs"; import createHttpError from "http-errors"; import FurnitureItemModel, { FurnitureItem } from "src/models/furnitureItem"; import VSRModel, { FurnitureInput, VSR } from "src/models/vsr"; @@ -292,7 +293,10 @@ export const bulkExportVSRS: RequestHandler = async (req, res, next) => { try { const filename = "vsrs.xlsx"; await writeSpreadsheet(filename); - res.download(filename); + res.download(filename, () => { + // Once the flie has been sent to the requestor, remove it from our filesystem + fs.unlinkSync(filename); + }); } catch (error) { next(error); } From 8e4b729981040a6139fe6516736554b9b723f592 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 10:15:53 -0700 Subject: [PATCH 12/35] Add backend tests for exporting VSRs --- backend/__tests__/vsrTest.test.ts | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/backend/__tests__/vsrTest.test.ts b/backend/__tests__/vsrTest.test.ts index ad85067..502b705 100644 --- a/backend/__tests__/vsrTest.test.ts +++ b/backend/__tests__/vsrTest.test.ts @@ -89,7 +89,7 @@ describe("VSR Tests", () => { it("GET /api/vsr returns all submitted VSRs to admin", async () => { await Promise.all(Array(3).fill(null).map(createTestVSR)); - const { testToken } = await signInAsRole(UserRole.STAFF); + const { testToken } = await signInAsRole(UserRole.ADMIN); const res = await request(app).get("/api/vsr").set("Authorization", `Bearer ${testToken}`); expect(res.statusCode).toBe(200); @@ -357,4 +357,29 @@ describe("VSR Tests", () => { expect(currentVsr!.name).toBe("Updated name"); expect(currentVsr!.email).toBe("updatedemail@gmail.com"); }); + + it("GET /api/vsr/bulk_export requires user to be signed in", async () => { + const res = await request(app).get("/api/vsr/bulk_export"); + expect(res.statusCode).toBe(401); + }); + + it("GET /api/vsr/bulk_export as staff with no VSRs in database", async () => { + const { testToken } = await signInAsRole(UserRole.STAFF); + + const res = await request(app) + .get("/api/vsr/bulk_export") + .set("Authorization", `Bearer ${testToken}`); + expect(res.statusCode).toBe(200); + }); + + it("GET /api/vsr/bulk_export as staff with VSRs in database", async () => { + await Promise.all(Array(3).fill(null).map(createTestVSR)); + + const { testToken } = await signInAsRole(UserRole.STAFF); + + const res = await request(app) + .get("/api/vsr/bulk_export") + .set("Authorization", `Bearer ${testToken}`); + expect(res.statusCode).toBe(200); + }); }); From 3f9797cc2ca7ff1f4809a37cb43023062c171b31 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 11:59:13 -0700 Subject: [PATCH 13/35] Capitalize Twin Mat. in furniture items list --- backend/__tests__/furnitureItems.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/__tests__/furnitureItems.json b/backend/__tests__/furnitureItems.json index e16ab8f..7f5bb58 100644 --- a/backend/__tests__/furnitureItems.json +++ b/backend/__tests__/furnitureItems.json @@ -1,7 +1,7 @@ [ { "category": "bedroom", - "name": "Twin mat.", + "name": "Twin Mat.", "allowMultiple": true, "categoryIndex": 1 }, From 831652abfac9914545553b0d53ba3fd1f53c214e Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:00:35 -0700 Subject: [PATCH 14/35] Re-order VSR status options & remove Resubmit --- backend/src/validators/vsr.ts | 3 +-- .../src/components/shared/StatusDropdown/index.tsx | 12 ++++-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/backend/src/validators/vsr.ts b/backend/src/validators/vsr.ts index 2c62a0d..3f33376 100644 --- a/backend/src/validators/vsr.ts +++ b/backend/src/validators/vsr.ts @@ -190,10 +190,9 @@ const makeHearFromValidator = () => const ALLOWED_STATUSES = [ "Received", - "Appointment Scheduled", "Approved", + "Appointment Scheduled", "Complete", - "Resubmit", "No-show / Incomplete", "Archived", ]; diff --git a/frontend/src/components/shared/StatusDropdown/index.tsx b/frontend/src/components/shared/StatusDropdown/index.tsx index 4cd1589..8932a24 100644 --- a/frontend/src/components/shared/StatusDropdown/index.tsx +++ b/frontend/src/components/shared/StatusDropdown/index.tsx @@ -19,21 +19,17 @@ export const STATUS_OPTIONS: StatusOption[] = [ value: "Received", color: "#e6e6e6", }, - { - value: "Appointment Scheduled", - color: "#c5e1f6", - }, { value: "Approved", color: "#d7eebc", }, { - value: "Complete", - color: "#bfe1f6", + value: "Appointment Scheduled", + color: "#c5e1f6", }, { - value: "Resubmit", - color: "#fae69e", + value: "Complete", + color: "#bfe1f6", }, { value: "No-show / Incomplete", From f80a1b46cf9cba3ff72df1397a931932c78241a1 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:03:58 -0700 Subject: [PATCH 15/35] Fix VSR page & submission messages about emails --- frontend/src/app/vsr/page.tsx | 5 ++--- .../components/VSRForm/ConfirmVSRSubmissionModal/index.tsx | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/vsr/page.tsx b/frontend/src/app/vsr/page.tsx index 4eadbf1..02b3545 100644 --- a/frontend/src/app/vsr/page.tsx +++ b/frontend/src/app/vsr/page.tsx @@ -398,9 +398,8 @@ const VeteranServiceRequest: React.FC = () => { to request what you require.



- Upon submission, a copy of your VSR form will be sent to your email. We'll - promptly review it and respond via email as soon as possible. Remember to check your - spam folder if you don't receive a response within 48 business hours. + Upon submission, you will receive an email to schedule an appointment. Remember to + check your spam folder if you don't receive a response within 48 business hours.



If you have any questions or concerns, send us an email at{" "} diff --git a/frontend/src/components/VSRForm/ConfirmVSRSubmissionModal/index.tsx b/frontend/src/components/VSRForm/ConfirmVSRSubmissionModal/index.tsx index 7612f0c..1afeece 100644 --- a/frontend/src/components/VSRForm/ConfirmVSRSubmissionModal/index.tsx +++ b/frontend/src/components/VSRForm/ConfirmVSRSubmissionModal/index.tsx @@ -16,9 +16,8 @@ export const ConfirmVSRSubmissionModal = ({ isOpen, onClose }: ConfirmVSRSubmiss title="Submitted successfully!" content={ <> - A copy of your submitted VSR form has been sent to your email. We'll review it - promptly and respond via email as soon as possible. Allow up to 48 business hours to be - contacted for appointment scheduling. + An email has been sent to your inbox. Please review the information in the email and + respond in order to schedule your appointment.



Please check your spam folder if you don't receive a response within 48 business From e23d1f241b119b690fe28f761244581db563c8b2 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:04:34 -0700 Subject: [PATCH 16/35] Fix text opacity for dropdown input placeholder --- frontend/src/components/shared/input/Dropdown/styles.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/components/shared/input/Dropdown/styles.module.css b/frontend/src/components/shared/input/Dropdown/styles.module.css index 0a9c1b5..c86e55d 100644 --- a/frontend/src/components/shared/input/Dropdown/styles.module.css +++ b/frontend/src/components/shared/input/Dropdown/styles.module.css @@ -18,4 +18,5 @@ font-style: italic; font-weight: 300; color: var(--Dark-Gray, #484848); + opacity: 0.5; } From bc84f5e56475fbf46ba72da8269f66654b46e872 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:06:47 -0700 Subject: [PATCH 17/35] Dont show asterisks on children input on VSR edit view --- frontend/src/app/vsr/page.tsx | 4 ++-- .../PageSections/PersonalInformation/index.tsx | 4 ++-- .../src/components/shared/input/ChildrenInput/index.tsx | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/vsr/page.tsx b/frontend/src/app/vsr/page.tsx index 02b3545..52b49fc 100644 --- a/frontend/src/app/vsr/page.tsx +++ b/frontend/src/app/vsr/page.tsx @@ -530,10 +530,10 @@ const VeteranServiceRequest: React.FC = () => {
- +
- +
diff --git a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx index 4d4981e..e78b785 100644 --- a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx @@ -150,7 +150,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor
{isEditing ? ( <> - + ) : ( <> @@ -167,7 +167,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor
{isEditing ? ( <> - + ) : ( <> diff --git a/frontend/src/components/shared/input/ChildrenInput/index.tsx b/frontend/src/components/shared/input/ChildrenInput/index.tsx index f81b7db..aac1206 100644 --- a/frontend/src/components/shared/input/ChildrenInput/index.tsx +++ b/frontend/src/components/shared/input/ChildrenInput/index.tsx @@ -6,13 +6,14 @@ import { useScreenSizes } from "@/hooks/useScreenSizes"; interface ChildrenInputProps { gender: "boy" | "girl"; + showAsterisks: boolean; formProps: UseFormReturn | UseFormReturn; } /** * A component that renders the text fields to input the children of the given gender. */ -export const ChildrenInput = ({ gender, formProps }: ChildrenInputProps) => { +export const ChildrenInput = ({ gender, showAsterisks, formProps }: ChildrenInputProps) => { const numChildrenThisGender = formProps.watch()[`num_${gender}s`]; const fieldInputName = `agesOf${gender[0].toUpperCase()}${gender.substring(1)}s` as | "agesOfBoys" @@ -36,7 +37,7 @@ export const ChildrenInput = ({ gender, formProps }: ChildrenInputProps) => { message: "This field must be a positive number less than 100", }, })} - required + required={showAsterisks} error={!!formProps.formState.errors[`num_${gender}s`]} helperText={formProps.formState.errors[`num_${gender}s`]?.message} /> @@ -67,7 +68,7 @@ export const ChildrenInput = ({ gender, formProps }: ChildrenInputProps) => { )} error={!!formProps.formState.errors[fieldInputName]?.[index]} helperText={formProps.formState.errors[fieldInputName]?.[index]?.message} - required + required={showAsterisks} />
))} From 6b0e3f1f0d164eddf0a0bab9b55322484fad9fdf Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:08:08 -0700 Subject: [PATCH 18/35] Rename other field placeholder to Please specify --- frontend/src/app/vsr/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/vsr/page.tsx b/frontend/src/app/vsr/page.tsx index 52b49fc..c5437cc 100644 --- a/frontend/src/app/vsr/page.tsx +++ b/frontend/src/app/vsr/page.tsx @@ -867,7 +867,7 @@ const VeteranServiceRequest: React.FC = () => { { @@ -1021,7 +1021,7 @@ const VeteranServiceRequest: React.FC = () => { { From 8970540b8ced4fc17539d2ced5722a9a6433c182 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:09:58 -0700 Subject: [PATCH 19/35] Disable status approve button & dropdown when editing VSR --- .../VSRIndividual/PageSections/CaseDetails/index.tsx | 8 ++++++-- .../components/VSRIndividual/VSRIndividualPage/index.tsx | 9 +++++++-- .../VSRIndividual/VSRIndividualPage/styles.module.css | 5 +++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/VSRIndividual/PageSections/CaseDetails/index.tsx b/frontend/src/components/VSRIndividual/PageSections/CaseDetails/index.tsx index cd1521b..e1bcdc7 100644 --- a/frontend/src/components/VSRIndividual/PageSections/CaseDetails/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/CaseDetails/index.tsx @@ -40,10 +40,14 @@ export const CaseDetails = ({ return ; } - if (vsr.status === "Received" || vsr.status === undefined) { + if (vsr.status === "Received" || vsr.status === undefined || isEditing) { return ( statusOption.value === "Received")!} + status={ + STATUS_OPTIONS.find( + (statusOption) => statusOption.value === (vsr.status ?? "Received"), + )! + } /> ); } diff --git a/frontend/src/components/VSRIndividual/VSRIndividualPage/index.tsx b/frontend/src/components/VSRIndividual/VSRIndividualPage/index.tsx index 0753d4f..fbcdd8e 100644 --- a/frontend/src/components/VSRIndividual/VSRIndividualPage/index.tsx +++ b/frontend/src/components/VSRIndividual/VSRIndividualPage/index.tsx @@ -214,8 +214,13 @@ export const VSRIndividualPage = () => { outlined={false} text="Approve VSR" loading={loadingUpdateStatus} - className={styles.approveButton} - onClick={() => onUpdateVSRStatus("Approved")} + className={`${styles.approveButton} ${isEditing ? styles.disabledButton : ""}`} + onClick={() => { + if (!isEditing) { + onUpdateVSRStatus("Approved"); + } + }} + disabled={isEditing} /> ) : null; diff --git a/frontend/src/components/VSRIndividual/VSRIndividualPage/styles.module.css b/frontend/src/components/VSRIndividual/VSRIndividualPage/styles.module.css index 89f660c..26fbf58 100644 --- a/frontend/src/components/VSRIndividual/VSRIndividualPage/styles.module.css +++ b/frontend/src/components/VSRIndividual/VSRIndividualPage/styles.module.css @@ -146,6 +146,11 @@ padding: 20px 24px; } +.disabledButton { + background-color: grey !important; + cursor: unset; +} + .footer { height: 64px; } From adef7604f1cb36a7c4348965a43d44923824752f Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:14:03 -0700 Subject: [PATCH 20/35] Rename N/A to No items selected for several VSR fields --- .../FieldDetails/ListDetail/index.tsx | 7 +++--- .../FieldDetails/SingleDetail/index.tsx | 13 +++++++--- .../PageSections/MilitaryBackground/index.tsx | 17 ++++++++++--- .../PersonalInformation/index.tsx | 25 +++++++++++++------ .../RequestedFurnishings/index.tsx | 8 ++++-- 5 files changed, 50 insertions(+), 20 deletions(-) diff --git a/frontend/src/components/VSRIndividual/FieldDetails/ListDetail/index.tsx b/frontend/src/components/VSRIndividual/FieldDetails/ListDetail/index.tsx index 5c37f43..a59fb27 100644 --- a/frontend/src/components/VSRIndividual/FieldDetails/ListDetail/index.tsx +++ b/frontend/src/components/VSRIndividual/FieldDetails/ListDetail/index.tsx @@ -5,12 +5,13 @@ import { FieldDetail } from "@/components/VSRIndividual/FieldDetails/FieldDetail export interface ListDetailProps { title: string; values: string[]; + isEmpty: boolean; } /** * A component that displays a list of values separated by commas on the VSR individual page. */ -export function ListDetail({ title, values }: ListDetailProps) { +export function ListDetail({ title, values, isEmpty }: ListDetailProps) { const list = (
{values.map((value, index) => ( @@ -20,7 +21,7 @@ export function ListDetail({ title, values }: ListDetailProps) { ))}
); - const noList =
N/A
; + const noList =
{values[0]}
; - return {values.includes("N/A") ? noList : list}; + return {isEmpty ? noList : list}; } diff --git a/frontend/src/components/VSRIndividual/FieldDetails/SingleDetail/index.tsx b/frontend/src/components/VSRIndividual/FieldDetails/SingleDetail/index.tsx index bee47f4..a2f05c0 100644 --- a/frontend/src/components/VSRIndividual/FieldDetails/SingleDetail/index.tsx +++ b/frontend/src/components/VSRIndividual/FieldDetails/SingleDetail/index.tsx @@ -7,12 +7,19 @@ export interface SingleDetailProps { value: string | number | number[] | ReactNode; valueFontSize?: string | number; className?: string; + isEmpty?: boolean; } /** * A component for a single (non-list) field on the VSR individual page. */ -export function SingleDetail({ title, value, valueFontSize, className }: SingleDetailProps) { +export function SingleDetail({ + title, + value, + valueFontSize, + className, + isEmpty, +}: SingleDetailProps) { const valueStyle = { fontSize: valueFontSize, // Use the passed font size or default to CSS class }; @@ -29,13 +36,13 @@ export function SingleDetail({ title, value, valueFontSize, className }: SingleD
); - const noValue =
N/A
; + const noValue =
{value}
; return ( {typeof value === "string" && value.includes("@") ? email - : typeof value === "string" && value.includes("N/A") + : typeof value === "string" && isEmpty ? noValue : basic} diff --git a/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx b/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx index 0872fab..1f0f8eb 100644 --- a/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx @@ -53,7 +53,8 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr ) : ( 0 ? vsr.branch : ["N/A"]} + values={vsr.branch && vsr.branch.length > 0 ? vsr.branch : ["No branch selected"]} + isEmpty={!(vsr.branch && vsr.branch.length > 0)} /> )} @@ -70,7 +71,10 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr ) : ( 0 ? vsr.conflicts : ["N/A"]} + values={ + vsr.conflicts && vsr.conflicts.length > 0 ? vsr.conflicts : ["No conflicts selected"] + } + isEmpty={!(vsr.conflicts && vsr.conflicts.length > 0)} /> )} @@ -89,8 +93,9 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr values={ vsr.dischargeStatus && vsr.dischargeStatus.length > 0 ? [vsr.dischargeStatus] - : ["N/A"] + : ["No discharge status"] } + isEmpty={!(vsr.dischargeStatus && vsr.dischargeStatus.length > 0)} /> )} @@ -102,7 +107,11 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr formProps={formProps} /> ) : ( - + )}
diff --git a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx index e78b785..c53bfa0 100644 --- a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx @@ -127,7 +127,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor allowMultiple={false} /> ) : ( - + )}
{formProps.watch().maritalStatus === "Married" ? ( @@ -142,7 +142,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor ) : ( 0 ? vsr.spouseName : "N/A"} + value={vsr.spouseName && vsr.spouseName.length > 0 ? vsr.spouseName : "No spouse"} /> )} @@ -158,8 +158,11 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor 0 ? vsr.agesOfBoys.join(", ") : "N/A" + vsr.agesOfBoys && vsr.agesOfBoys.length > 0 + ? vsr.agesOfBoys.join(", ") + : "No male children" } + isEmpty={!(vsr.agesOfBoys && vsr.agesOfBoys.length > 0)} /> )} @@ -175,8 +178,11 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor 0 ? vsr.agesOfGirls.join(", ") : "N/A" + vsr.agesOfGirls && vsr.agesOfGirls.length > 0 + ? vsr.agesOfGirls.join(", ") + : "No female children" } + isEmpty={!(vsr.agesOfGirls && vsr.agesOfGirls.length > 0)} /> )} @@ -194,7 +200,10 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor ) : ( 0 ? vsr.ethnicity : ["N/A"]} + values={ + vsr.ethnicity && vsr.ethnicity.length > 0 ? vsr.ethnicity : ["No items selected"] + } + isEmpty={!(vsr.ethnicity && vsr.ethnicity.length > 0)} /> )} @@ -208,7 +217,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor allowMultiple={false} /> ) : ( - + )}
@@ -221,7 +230,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor allowMultiple={false} /> ) : ( - + )}
@@ -234,7 +243,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor allowMultiple={false} /> ) : ( - + )}
diff --git a/frontend/src/components/VSRIndividual/PageSections/RequestedFurnishings/index.tsx b/frontend/src/components/VSRIndividual/PageSections/RequestedFurnishings/index.tsx index f08f890..76922d3 100644 --- a/frontend/src/components/VSRIndividual/PageSections/RequestedFurnishings/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/RequestedFurnishings/index.tsx @@ -118,8 +118,9 @@ export const RequestedFurnishings = ({ : "" }`, ) - : ["N/A"] + : ["No items selected"] } + isEmpty={!(selectedItemsForCategory && selectedItemsForCategory.length > 0)} /> ); @@ -141,8 +142,11 @@ export const RequestedFurnishings = ({ 0 ? vsr.additionalItems : "n/a" + vsr.additionalItems && vsr.additionalItems.length > 0 + ? vsr.additionalItems + : "No items selected" } + isEmpty={!(vsr.additionalItems && vsr.additionalItems.length > 0)} /> )} From ad3b163bde3dfca0dd54b93d045712d4e3f4e5cd Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:47:18 -0700 Subject: [PATCH 21/35] Fix validation error with multiple choice & other fields on VSR edit page --- .../src/components/VSRForm/VSRFormTypes.ts | 3 + .../index.tsx | 73 +++++++++++++++---- .../PageSections/AdditionalInfo/index.tsx | 5 +- .../PageSections/MilitaryBackground/index.tsx | 2 + .../PersonalInformation/index.tsx | 2 + 5 files changed, 68 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/VSRForm/VSRFormTypes.ts b/frontend/src/components/VSRForm/VSRFormTypes.ts index 46eb697..a6f0377 100644 --- a/frontend/src/components/VSRForm/VSRFormTypes.ts +++ b/frontend/src/components/VSRForm/VSRFormTypes.ts @@ -12,6 +12,7 @@ export interface IVSRFormInput { age: number; ethnicity: string[]; other_ethnicity: string; + form_ethnicity: string; employment_status: string; income_level: string; size_of_home: string; @@ -29,6 +30,7 @@ export interface IVSRFormInput { branch: string[]; conflicts: string[]; other_conflicts: string; + form_conflicts: string; dischargeStatus: string; serviceConnected: boolean; lastRank: string; @@ -36,6 +38,7 @@ export interface IVSRFormInput { petCompanion: boolean; hearFrom: string; other_hearFrom: string; + form_hearFrom: string; selectedFurnitureItems: Record; additionalItems: string; diff --git a/frontend/src/components/VSRIndividual/FieldDetails/MultipleChoiceWithOtherInputDetail/index.tsx b/frontend/src/components/VSRIndividual/FieldDetails/MultipleChoiceWithOtherInputDetail/index.tsx index a7e69a4..3c954c6 100644 --- a/frontend/src/components/VSRIndividual/FieldDetails/MultipleChoiceWithOtherInputDetail/index.tsx +++ b/frontend/src/components/VSRIndividual/FieldDetails/MultipleChoiceWithOtherInputDetail/index.tsx @@ -9,6 +9,7 @@ interface MultipleChoiceWithOtherInputDetailProps { title: string; name: keyof IEditVSRFormInput; otherName: keyof IEditVSRFormInput; + formName: keyof IEditVSRFormInput; options: string[]; allowMultiple: boolean; formProps: UseFormReturn; @@ -23,32 +24,72 @@ export const MultipleChoiceWithOtherInputDetail = ({ title, name, otherName, + formName, options, allowMultiple, formProps, ...props }: MultipleChoiceWithOtherInputDetailProps) => { + /** + * Callback fired when one of the inputs (multiple choice or "Other" text input) changes, + * to handle the change and update all our form inputs + * + * @param fieldValue the new value of the multiple choice field + * @param otherFieldValue the new value of the "Other" field + * @param otherJustChanged whether the "Other" field just changed (if true), or the multiple + * choice field just changed (if false) + * @param onOtherChange callback to fire when "Other" input changes; since this changes often + * (every time the user presses a key), we want this to be fast, so we use the field.onChange + * instead of formProps.setValue() + */ + const handleInputChange = ( + fieldValue: string | string[], + otherFieldValue: string, + otherJustChanged: boolean, + onOtherChange: (value: string) => unknown, + ) => { + // Whether either field is non-empty (used to determine whether there is a form error) + const isNonEmpty = + (allowMultiple ? (fieldValue as string[]).length > 0 : fieldValue.toString().length > 0) || + otherFieldValue.length > 0; + + // Update both fields to their new values. If we don't allow multiple, clear the + // field (multiple vs. other) that didn't just change + if (otherJustChanged) { + formProps.setValue(name, allowMultiple ? fieldValue : ""); + onOtherChange(otherFieldValue); + } else { + formProps.setValue(name, fieldValue); + formProps.setValue(otherName, allowMultiple ? otherFieldValue : ""); + } + + // Update our formName phantom field to store whether the field is empty and + // throw a validation error if so + formProps.setValue(formName, isNonEmpty ? "full" : ""); + }; + return ( ( + render={() => ( { - field.onChange(value); - if (!allowMultiple && value.length > 0) { - // If user can't enter multiple options, clear the "other" text field when they select an option - formProps.setValue(otherName, ""); - } + handleInputChange( + value, + formProps.getValues()[otherName] as string, + false, + (otherValue) => formProps.setValue(otherName, otherValue), + ); }} required={false} - error={!!formProps.formState.errors[name]} - helperText={formProps.formState.errors[name]?.message as string} + error={!!formProps.formState.errors[formName]} + helperText={formProps.formState.errors[formName]?.message as string} allowMultiple={allowMultiple} {...props} /> @@ -66,12 +107,12 @@ export const MultipleChoiceWithOtherInputDetail = ({ value={field.value} onChange={(e) => { const value = e.target.value; - field.onChange(value); - if (!allowMultiple && value.length > 0) { - // If user can't enter multiple options, clear the chips field when - // they enter something into the "other" text field - formProps.setValue(name, ""); - } + handleInputChange( + formProps.getValues()[name] as string | string[], + value, + true, + field.onChange, + ); }} variant={"outlined"} required={false} diff --git a/frontend/src/components/VSRIndividual/PageSections/AdditionalInfo/index.tsx b/frontend/src/components/VSRIndividual/PageSections/AdditionalInfo/index.tsx index 1e5785d..56606b5 100644 --- a/frontend/src/components/VSRIndividual/PageSections/AdditionalInfo/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/AdditionalInfo/index.tsx @@ -24,6 +24,7 @@ export const AdditionalInfo = ({ vsr, isEditing, formProps }: AdditionalInfoProp const isHearFromChip = hearFromOptions.includes(vsr.hearFrom); formProps.setValue("hearFrom", isHearFromChip ? vsr.hearFrom : ""); formProps.setValue("other_hearFrom", isHearFromChip ? "" : vsr.hearFrom); + formProps.setValue("form_hearFrom", vsr.hearFrom.length > 0 ? "full" : ""); }, [vsr]); return ( @@ -39,6 +40,7 @@ export const AdditionalInfo = ({ vsr, isEditing, formProps }: AdditionalInfoProp )} @@ -47,13 +49,14 @@ export const AdditionalInfo = ({ vsr, isEditing, formProps }: AdditionalInfoProp ) : ( - + )} diff --git a/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx b/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx index 1f0f8eb..1c6b67a 100644 --- a/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/MilitaryBackground/index.tsx @@ -33,6 +33,7 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr } } formProps.setValue("conflicts", conflictChips); + formProps.setValue("form_conflicts", vsr.conflicts.length > 0 ? "full" : ""); formProps.setValue("dischargeStatus", vsr.dischargeStatus); formProps.setValue("serviceConnected", vsr.serviceConnected); formProps.setValue("lastRank", vsr.lastRank); @@ -63,6 +64,7 @@ export const MilitaryBackground = ({ vsr, isEditing, formProps }: MilitaryBackgr 0 ? "full" : ""); formProps.setValue("employment_status", vsr.employmentStatus); formProps.setValue("income_level", vsr.incomeLevel); formProps.setValue("size_of_home", vsr.sizeOfHome); @@ -193,6 +194,7 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor title="Ethnicity" name="ethnicity" otherName="other_ethnicity" + formName="form_ethnicity" options={ethnicityOptions} allowMultiple formProps={formProps} From f9cdac993cb918eb89ec502fe646b37f812b87ca Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:58:20 -0700 Subject: [PATCH 22/35] Fix search bar width on VSR table --- frontend/src/app/staff/vsr/page.module.css | 2 ++ .../src/components/VSRTable/SearchKeyword/styles.module.css | 2 ++ 2 files changed, 4 insertions(+) diff --git a/frontend/src/app/staff/vsr/page.module.css b/frontend/src/app/staff/vsr/page.module.css index e664bfc..bf37fb8 100644 --- a/frontend/src/app/staff/vsr/page.module.css +++ b/frontend/src/app/staff/vsr/page.module.css @@ -24,6 +24,7 @@ flex-direction: row; align-items: center; justify-content: space-between; + gap: 44px; } .row_left { @@ -31,6 +32,7 @@ display: flex; flex-direction: row; align-items: center; + width: 100%; } .statusContainer { diff --git a/frontend/src/components/VSRTable/SearchKeyword/styles.module.css b/frontend/src/components/VSRTable/SearchKeyword/styles.module.css index fc0c9fd..f05d881 100644 --- a/frontend/src/components/VSRTable/SearchKeyword/styles.module.css +++ b/frontend/src/components/VSRTable/SearchKeyword/styles.module.css @@ -7,6 +7,7 @@ align-items: center; align-self: stretch; + width: 100%; border-radius: 4px; border: 1px solid var(--Neutral-Gray2, #d8d8d8); background: #fff; @@ -20,6 +21,7 @@ color: black; color: var(--Neutral-Gray4, #909090); outline: 0px; + width: 100%; /* Desktop/Body 2 */ font-family: "Open Sans"; From 353742758ec39504c22ab5b2c845b85d960e0eb2 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 12:59:34 -0700 Subject: [PATCH 23/35] Add new backend build for deployment --- backend/dist/src/controllers/vsr.js | 110 +++++++++++++++++++++++++++- backend/dist/src/models/vsr.js | 5 +- backend/dist/src/routes/vsr.js | 1 + backend/dist/src/validators/vsr.js | 3 +- 4 files changed, 114 insertions(+), 5 deletions(-) diff --git a/backend/dist/src/controllers/vsr.js b/backend/dist/src/controllers/vsr.js index 10b0625..3c434db 100644 --- a/backend/dist/src/controllers/vsr.js +++ b/backend/dist/src/controllers/vsr.js @@ -12,12 +12,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.deleteVSR = exports.updateVSR = exports.updateStatus = exports.createVSR = exports.getVSR = exports.getAllVSRS = void 0; +exports.bulkExportVSRS = exports.deleteVSR = exports.updateVSR = exports.updateStatus = exports.createVSR = exports.getVSR = exports.getAllVSRS = void 0; const express_validator_1 = require("express-validator"); +const fs_1 = __importDefault(require("fs")); const http_errors_1 = __importDefault(require("http-errors")); +const furnitureItem_1 = __importDefault(require("../models/furnitureItem")); const vsr_1 = __importDefault(require("../models/vsr")); const emails_1 = require("../services/emails"); const validationErrorParser_1 = __importDefault(require("../util/validationErrorParser")); +const exceljs_1 = __importDefault(require("exceljs")); /** * Gets all VSRs in the database. Requires the user to be signed in and have * staff or admin permission. @@ -142,3 +145,108 @@ const deleteVSR = (req, res, next) => __awaiter(void 0, void 0, void 0, function } }); exports.deleteVSR = deleteVSR; +/** + * Converts an entry in a VSR to a formatted string to write to the Excel spreadsheet + */ +const stringifyEntry = (entry) => { + if (!entry) { + return ""; + } + if (Array.isArray(entry)) { + return entry.join(", "); + } + else { + return entry.toString(); + } +}; +/** + * Formats a VSR's selected furniture items as a string + */ +const stringifySelectedFurnitureItems = (selectedItems, allFurnitureItems) => { + if (!selectedItems) { + return ""; + } + const itemIdsToItems = {}; + for (const furnitureItem of allFurnitureItems) { + itemIdsToItems[furnitureItem._id.toString()] = furnitureItem; + } + return selectedItems + .map((selectedItem) => { + const furnitureItem = itemIdsToItems[selectedItem.furnitureItemId]; + return furnitureItem ? `${furnitureItem.name}: ${selectedItem.quantity}` : "[unknown]"; + }) + .join(", "); +}; +const writeSpreadsheet = (filename) => __awaiter(void 0, void 0, void 0, function* () { + const workbook = new exceljs_1.default.Workbook(); + workbook.creator = "PAP Inventory System"; + workbook.lastModifiedBy = "Bot"; + //current date + workbook.created = new Date(); + workbook.modified = new Date(); + workbook.lastPrinted = new Date(); + const worksheet = workbook.addWorksheet("New Sheet"); + const vsrs = yield vsr_1.default.find(); + const plainVsrs = vsrs.map((doc) => doc.toObject()); + // Fields that we want to write to the spreadsheet. First is field name, second is display name. + const fieldsToWrite = [ + ["name", "Name"], + ["gender", "Gender"], + ["age", "Age"], + ["maritalStatus", "Marital Status"], + ["spouseName", "Spouse Name"], + ["agesOfBoys", "Ages of boys"], + ["agesOfGirls", "Ages of girls"], + ["ethnicity", "Ethnicity"], + ["employmentStatus", "Employment Status"], + ["incomeLevel", "Income Level"], + ["sizeOfHome", "Size of Home"], + ["streetAddress", "Street Address"], + ["city", "City"], + ["state", "State"], + ["zipCode", "Zip Code"], + ["phoneNumber", "Phone Number"], + ["email", "Email Address"], + ["branch", "Branch"], + ["conflicts", "Conflicts"], + ["dischargeStatus", "Discharge Status"], + ["serviceConnected", "Service Connected"], + ["lastRank", "Last Rank"], + ["militaryID", "Military ID"], + ["petCompanion", "Pet Companion Desired"], + ["hearFrom", "Referral Source"], + ["selectedFurnitureItems", "Selected Furniture Items"], + ["additionalItems", "Additional Items"], + ["dateReceived", "Date Received"], + ["lastUpdated", "Last Updated"], + ["status", "Status"], + ]; + worksheet.columns = fieldsToWrite.map((field) => ({ + header: field[1], + key: field[0], + width: 20, + })); + const allFurnitureItems = yield furnitureItem_1.default.find(); + // Add data rows to the worksheet + plainVsrs.forEach((vsr) => { + worksheet.addRow(fieldsToWrite.reduce((prev, field) => (Object.assign(Object.assign({}, prev), { [field[0]]: field[0] === "selectedFurnitureItems" + ? stringifySelectedFurnitureItems(vsr[field[0]], allFurnitureItems) + : stringifyEntry(vsr[field[0]]) })), {})); + }); + // Write to file + yield workbook.xlsx.writeFile(filename); +}); +const bulkExportVSRS = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { + try { + const filename = "vsrs.xlsx"; + yield writeSpreadsheet(filename); + res.download(filename, () => { + // Once the flie has been sent to the requestor, remove it from our filesystem + fs_1.default.unlinkSync(filename); + }); + } + catch (error) { + next(error); + } +}); +exports.bulkExportVSRS = bulkExportVSRS; diff --git a/backend/dist/src/models/vsr.js b/backend/dist/src/models/vsr.js index 5177886..963323a 100644 --- a/backend/dist/src/models/vsr.js +++ b/backend/dist/src/models/vsr.js @@ -1,10 +1,11 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.furntitureInputSchema = void 0; const mongoose_1 = require("mongoose"); /** * A schema for a single furniture item that a veteran can request */ -const furntitureInputSchema = new mongoose_1.Schema({ +exports.furntitureInputSchema = new mongoose_1.Schema({ // ID of the furniture item being required (Object ID for an instance of the furniture item model) furnitureItemId: { type: String, required: true }, // Quantity being requested by this veteran @@ -43,7 +44,7 @@ const vsrSchema = new mongoose_1.Schema({ petCompanion: { type: Boolean, required: true }, hearFrom: { type: String, required: true }, /** Page 3 of VSR */ - selectedFurnitureItems: { type: [furntitureInputSchema], required: true }, + selectedFurnitureItems: { type: [exports.furntitureInputSchema], required: true }, additionalItems: { type: String, required: false }, /** Fields that are created/updated automatically or on staff side */ dateReceived: { type: Date, required: true }, diff --git a/backend/dist/src/routes/vsr.js b/backend/dist/src/routes/vsr.js index 5acf3f0..dab5039 100644 --- a/backend/dist/src/routes/vsr.js +++ b/backend/dist/src/routes/vsr.js @@ -31,6 +31,7 @@ const VSRController = __importStar(require("../controllers/vsr")); const auth_1 = require("../middleware/auth"); const VSRValidator = __importStar(require("../validators/vsr")); const router = express_1.default.Router(); +router.get("/bulk_export", auth_1.requireSignedIn, auth_1.requireStaffOrAdmin, VSRController.bulkExportVSRS); router.get("/", auth_1.requireSignedIn, auth_1.requireStaffOrAdmin, VSRController.getAllVSRS); router.post("/", VSRValidator.createVSR, VSRController.createVSR); router.get("/:id", auth_1.requireSignedIn, auth_1.requireStaffOrAdmin, VSRController.getVSR); diff --git a/backend/dist/src/validators/vsr.js b/backend/dist/src/validators/vsr.js index a7b4be9..85faff2 100644 --- a/backend/dist/src/validators/vsr.js +++ b/backend/dist/src/validators/vsr.js @@ -139,10 +139,9 @@ const makeHearFromValidator = () => (0, express_validator_1.body)("hearFrom") .withMessage("Referral source must be a string"); const ALLOWED_STATUSES = [ "Received", - "Appointment Scheduled", "Approved", + "Appointment Scheduled", "Complete", - "Resubmit", "No-show / Incomplete", "Archived", ]; From 53783b4f483cf5549a118a6106a5036250462c62 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 15:25:34 -0700 Subject: [PATCH 24/35] Redo package-lock.json to hopefully fix deployment issue --- backend/package-lock.json | 710 +++++++++++++------------------------- 1 file changed, 235 insertions(+), 475 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 2549bc4..a457ad8 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1526,9 +1526,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1549,17 +1548,15 @@ }, "node_modules/@eslint/js": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@fast-csv/format": { "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "license": "MIT", "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -1571,13 +1568,11 @@ }, "node_modules/@fast-csv/format/node_modules/@types/node": { "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + "license": "MIT" }, "node_modules/@fast-csv/parse": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "license": "MIT", "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -1590,8 +1585,7 @@ }, "node_modules/@fast-csv/parse/node_modules/@types/node": { "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + "license": "MIT" }, "node_modules/@fastify/busboy": { "version": "1.2.1", @@ -1606,8 +1600,7 @@ }, "node_modules/@firebase/analytics": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1621,8 +1614,7 @@ }, "node_modules/@firebase/analytics-compat": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "license": "Apache-2.0", "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-types": "0.8.0", @@ -1636,13 +1628,11 @@ }, "node_modules/@firebase/analytics-types": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + "license": "Apache-2.0" }, "node_modules/@firebase/app": { "version": "0.9.26", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.26.tgz", - "integrity": "sha512-zCjo6KhNhbuFB+V+Z4H9g4+BZ78E7n3ShxaBtuIcRkpwdm7+1BsafzChOsDYuI86m97HUWsyLPurLBhqcupFFA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1653,8 +1643,7 @@ }, "node_modules/@firebase/app-check": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.1.tgz", - "integrity": "sha512-zi3vbM5tb/eGRWyiqf+1DXbxFu9Q07dnm46rweodgUpH9B8svxYkHfNwYWx7F5mjHU70SQDuaojH1We5ws9OKA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1667,8 +1656,7 @@ }, "node_modules/@firebase/app-check-compat": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.8.tgz", - "integrity": "sha512-EaETtChR4UgMokJFw+r6jfcIyCTUZSe0a6ivF37D9MxlG9G3wzK1COyXgxoX96GzXmDPc2aubX4PxCrdVHhrnA==", + "license": "Apache-2.0", "dependencies": { "@firebase/app-check": "0.8.1", "@firebase/app-check-types": "0.5.0", @@ -1683,18 +1671,15 @@ }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + "license": "Apache-2.0" }, "node_modules/@firebase/app-check-types": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + "license": "Apache-2.0" }, "node_modules/@firebase/app-compat": { "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.26.tgz", - "integrity": "sha512-tVNOYvB3lIFkN3RmcTieo5qYRIkYak9iC6E7dZMxax52uMIUJiIKKtPkarbwZh6EnUxru5hJRo8tfUZGuaQDQw==", + "license": "Apache-2.0", "dependencies": { "@firebase/app": "0.9.26", "@firebase/component": "0.6.4", @@ -1709,8 +1694,7 @@ }, "node_modules/@firebase/auth": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.5.1.tgz", - "integrity": "sha512-sVi7rq2YneLGJFqHa5S6nDfCHix9yuVV3RLhj/pWPlB4a36ofXal4E6PJwpeMc8uLjWEr1aovYN1jkXWNB6Avw==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1730,8 +1714,7 @@ }, "node_modules/@firebase/auth-compat": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.1.tgz", - "integrity": "sha512-rgDZnrDoekRvtzXVji8Z61wxxkof6pTkjYEkybILrjM8tGP9tx4xa9qGpF4ax3AzF+rKr7mIa9NnoXEK4UNqmQ==", + "license": "Apache-2.0", "dependencies": { "@firebase/auth": "1.5.1", "@firebase/auth-types": "0.12.0", @@ -1750,8 +1733,7 @@ }, "node_modules/@firebase/auth-types": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -1767,8 +1749,7 @@ }, "node_modules/@firebase/database": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", - "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", + "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -1781,8 +1762,7 @@ }, "node_modules/@firebase/database-compat": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", - "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/database": "1.0.2", @@ -1794,8 +1774,7 @@ }, "node_modules/@firebase/database-types": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "license": "Apache-2.0", "dependencies": { "@firebase/app-types": "0.9.0", "@firebase/util": "1.9.3" @@ -1803,8 +1782,7 @@ }, "node_modules/@firebase/firestore": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.1.tgz", - "integrity": "sha512-LCWZZ+rgNET1qw3vpugmGCJZVbz7c5NkgKect5pZn36gaBzGVb8+pRQ8WSZ1veYVMOK6SKrBkS1Rw6EqcmPnyw==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1824,8 +1802,7 @@ }, "node_modules/@firebase/firestore-compat": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.24.tgz", - "integrity": "sha512-Wj5cgqmQwTnqHS4KabOpXCNIaSTtVDP1NitnhjXff04Q4QK0aeIbeO1TPlSSTmUb6S7KzoKD4XR99hfKZDYbfA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/firestore": "4.4.1", @@ -1839,8 +1816,7 @@ }, "node_modules/@firebase/firestore-types": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -1848,8 +1824,7 @@ }, "node_modules/@firebase/functions": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.0.tgz", - "integrity": "sha512-n1PZxKnJ++k73Q8khTPwihlbeKo6emnGzE0hX6QVQJsMq82y/XKmNpw2t/q30VJgwaia3ZXU1fd1C5wHncL+Zg==", + "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -1865,8 +1840,7 @@ }, "node_modules/@firebase/functions-compat": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.6.tgz", - "integrity": "sha512-RQpO3yuHtnkqLqExuAT2d0u3zh8SDbeBYK5EwSCBKI9mjrFeJRXBnd3pEG+x5SxGJLy56/5pQf73mwt0OuH5yg==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/functions": "0.11.0", @@ -1880,13 +1854,11 @@ }, "node_modules/@firebase/functions-types": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + "license": "Apache-2.0" }, "node_modules/@firebase/installations": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", @@ -1899,8 +1871,7 @@ }, "node_modules/@firebase/installations-compat": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1914,16 +1885,14 @@ }, "node_modules/@firebase/installations-types": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x" } }, "node_modules/@firebase/installations/node_modules/idb": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + "license": "ISC" }, "node_modules/@firebase/logger": { "version": "0.4.0", @@ -1934,8 +1903,7 @@ }, "node_modules/@firebase/messaging": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.5.tgz", - "integrity": "sha512-i/rrEI2k9ueFhdIr8KQsptWGskrsnkC5TkohCTrJKz9P0C/PbNv14IAMkwhMJTqIur5VwuOnrUkc9Kdz7awekw==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1950,8 +1918,7 @@ }, "node_modules/@firebase/messaging-compat": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.5.tgz", - "integrity": "sha512-qHQZxm4hEG8/HFU/ls5/bU+rpnlPDoZoqi3ATMeb6s4hovYV9+PfV5I7ZrKV5eFFv47Hx1PWLe5uPnS4e7gMwQ==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/messaging": "0.12.5", @@ -1964,13 +1931,11 @@ }, "node_modules/@firebase/messaging-interop-types": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + "license": "Apache-2.0" }, "node_modules/@firebase/performance": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1984,8 +1949,7 @@ }, "node_modules/@firebase/performance-compat": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -2000,13 +1964,11 @@ }, "node_modules/@firebase/performance-types": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + "license": "Apache-2.0" }, "node_modules/@firebase/remote-config": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -2020,8 +1982,7 @@ }, "node_modules/@firebase/remote-config-compat": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -2036,13 +1997,11 @@ }, "node_modules/@firebase/remote-config-types": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + "license": "Apache-2.0" }, "node_modules/@firebase/storage": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.0.tgz", - "integrity": "sha512-SGs02Y/mmWBRsqZiYLpv4Sf7uZYZzMWVNN+aKiDqPsFBCzD6hLvGkXz+u98KAl8FqcjgB8BtSu01wm4pm76KHA==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", @@ -2055,8 +2014,7 @@ }, "node_modules/@firebase/storage-compat": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.3.tgz", - "integrity": "sha512-WNtjYPhpOA1nKcRu5lIodX0wZtP8pI0VxDJnk6lr+av7QZNS1s6zvr+ERDTve+Qu4Hq/ZnNaf3kBEQR2ccXn6A==", + "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.4", "@firebase/storage": "0.12.0", @@ -2070,8 +2028,7 @@ }, "node_modules/@firebase/storage-types": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -2086,14 +2043,12 @@ }, "node_modules/@firebase/webchannel-wrapper": { "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", - "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" + "license": "Apache-2.0" }, "node_modules/@google-cloud/firestore": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.2.0.tgz", - "integrity": "sha512-rBIiy3o+OxWwUT0EMAAq0OZUduF1l0/GQ9WTnUyiHxixsLR1qU5Y6pC4BOIsYPnup1OESMhFSX0EEx6oriT0pw==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2107,9 +2062,8 @@ }, "node_modules/@google-cloud/paginator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "arrify": "^2.0.0", @@ -2121,9 +2075,8 @@ }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "dev": true, + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=14.0.0" @@ -2131,9 +2084,8 @@ }, "node_modules/@google-cloud/promisify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "dev": true, + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=14" @@ -2141,9 +2093,8 @@ }, "node_modules/@google-cloud/storage": { "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", - "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "@google-cloud/paginator": "^5.0.0", @@ -2170,9 +2121,8 @@ }, "node_modules/@google-cloud/storage/node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "optional": true, "bin": { "mime": "cli.js" @@ -2183,9 +2133,8 @@ }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "optional": true, "bin": { "uuid": "dist/bin/uuid" @@ -2193,8 +2142,7 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.9.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", - "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -3529,9 +3477,8 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -3601,9 +3548,8 @@ }, "node_modules/@types/caseless": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/connect": { @@ -3690,15 +3636,13 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/jsonwebtoken": { "version": "9.0.5", @@ -3710,9 +3654,8 @@ }, "node_modules/@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/mime": { @@ -3722,8 +3665,7 @@ }, "node_modules/@types/node": { "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -3748,9 +3690,8 @@ }, "node_modules/@types/request": { "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/caseless": "*", @@ -3761,9 +3702,8 @@ }, "node_modules/@types/request/node_modules/form-data": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "asynckit": "^0.4.0", @@ -3776,9 +3716,8 @@ }, "node_modules/@types/semver": { "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", @@ -3822,9 +3761,8 @@ }, "node_modules/@types/tough-cookie": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/webidl-conversions": { @@ -3852,9 +3790,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.14.0", @@ -3887,9 +3824,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.14.0", "@typescript-eslint/types": "6.14.0", @@ -3915,9 +3851,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.14.0", "@typescript-eslint/visitor-keys": "6.14.0" @@ -3932,9 +3867,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "6.14.0", "@typescript-eslint/utils": "6.14.0", @@ -3959,9 +3893,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -3972,9 +3905,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.14.0", "@typescript-eslint/visitor-keys": "6.14.0", @@ -3999,9 +3931,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -4024,9 +3955,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.14.0", "eslint-visitor-keys": "^3.4.1" @@ -4051,9 +3981,8 @@ }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "event-target-shim": "^5.0.0" @@ -4102,8 +4031,7 @@ }, "node_modules/agent-base": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -4113,9 +4041,8 @@ }, "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, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4183,8 +4110,7 @@ }, "node_modules/archiver": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "license": "MIT", "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.4", @@ -4200,8 +4126,7 @@ }, "node_modules/archiver-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "license": "MIT", "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", @@ -4220,13 +4145,11 @@ }, "node_modules/archiver-utils/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/archiver-utils/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4239,21 +4162,18 @@ }, "node_modules/archiver-utils/node_modules/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==" + "license": "MIT" }, "node_modules/archiver-utils/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/archiver/node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -4311,8 +4231,7 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4403,9 +4322,8 @@ }, "node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4417,8 +4335,7 @@ }, "node_modules/async": { "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "license": "MIT" }, "node_modules/async-mutex": { "version": "0.4.0", @@ -4433,9 +4350,8 @@ }, "node_modules/async-retry": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "retry": "0.13.1" @@ -4576,8 +4492,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4591,21 +4505,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/big-integer": { "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/bignumber.js": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": "*" @@ -4613,14 +4526,10 @@ }, "node_modules/binary": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "license": "MIT", "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" } }, "node_modules/binary-extensions": { @@ -4632,8 +4541,7 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -4642,8 +4550,7 @@ }, "node_modules/bluebird": { "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.1", @@ -4758,8 +4665,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -4774,6 +4679,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4797,16 +4703,13 @@ }, "node_modules/buffer-indexof-polyfill": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/buffers": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", "engines": { "node": ">=0.2.0" } @@ -4864,13 +4767,9 @@ }, "node_modules/chainsaw": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "license": "MIT/X11", "dependencies": { "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" } }, "node_modules/chalk": { @@ -4996,8 +4895,7 @@ }, "node_modules/commander": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } @@ -5015,8 +4913,7 @@ }, "node_modules/compress-commons": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "license": "MIT", "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", @@ -5029,9 +4926,8 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -5087,8 +4983,7 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", @@ -5103,8 +4998,7 @@ }, "node_modules/crc-32": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -5114,8 +5008,7 @@ }, "node_modules/crc32-stream": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "license": "MIT", "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -5162,8 +5055,7 @@ }, "node_modules/dayjs": { "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + "license": "MIT" }, "node_modules/debug": { "version": "4.3.4", @@ -5286,8 +5178,7 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5318,21 +5209,18 @@ }, "node_modules/duplexer2": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, "node_modules/duplexer2/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5345,22 +5233,19 @@ }, "node_modules/duplexer2/node_modules/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==" + "license": "MIT" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/duplexify": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "end-of-stream": "^1.4.1", @@ -5408,17 +5293,15 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5429,9 +5312,8 @@ }, "node_modules/ent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/envalid": { @@ -5585,9 +5467,8 @@ }, "node_modules/eslint": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5666,9 +5547,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5696,9 +5576,8 @@ }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -5745,9 +5624,8 @@ }, "node_modules/eslint-plugin-import": { "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -5970,9 +5848,8 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -5980,8 +5857,7 @@ }, "node_modules/exceljs": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", - "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "license": "MIT", "dependencies": { "archiver": "^5.0.0", "dayjs": "^1.8.34", @@ -5999,8 +5875,7 @@ }, "node_modules/exceljs/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -6110,15 +5985,13 @@ }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/fast-csv": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "license": "MIT", "dependencies": { "@fast-csv/format": "4.3.5", "@fast-csv/parse": "4.3.6" @@ -6138,8 +6011,7 @@ }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6153,8 +6025,7 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -6177,8 +6048,6 @@ }, "node_modules/fast-xml-parser": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz", - "integrity": "sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==", "dev": true, "funding": [ { @@ -6190,6 +6059,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "license": "MIT", "optional": true, "dependencies": { "strnum": "^1.0.5" @@ -6329,8 +6199,7 @@ }, "node_modules/firebase": { "version": "10.7.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.7.2.tgz", - "integrity": "sha512-zED3kAJyf+Xx5tXpC3vjmlWTm/SIVoJJ6MOLuXYJkqKAUJLG7Q1Jxy6l1DxCzGgBqZHxc0Jh6q+qG++9kimHsw==", + "license": "Apache-2.0", "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-compat": "0.2.6", @@ -6362,9 +6231,8 @@ }, "node_modules/firebase-admin": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", - "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^1.2.1", "@firebase/database-compat": "^1.0.2", @@ -6468,8 +6336,7 @@ }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "license": "MIT" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -6477,8 +6344,7 @@ }, "node_modules/fstream": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -6491,8 +6357,7 @@ }, "node_modules/fstream/node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6526,9 +6391,8 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/functions-have-names": { @@ -6541,9 +6405,8 @@ }, "node_modules/gaxios": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", - "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "extend": "^3.0.2", @@ -6557,9 +6420,8 @@ }, "node_modules/gcp-metadata": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "gaxios": "^6.0.0", @@ -6630,9 +6492,8 @@ }, "node_modules/get-tsconfig": { "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -6671,9 +6532,8 @@ }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6700,8 +6560,7 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6719,9 +6578,8 @@ }, "node_modules/google-auth-library": { "version": "9.4.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.4.2.tgz", - "integrity": "sha512-rTLO4gjhqqo3WvYKL5IdtlCvRqeQ4hxUx/p4lObobY2xotFW3bCQC+Qf1N51CYOfiqfMecdMwW9RIo7dFWYjqw==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "base64-js": "^1.3.0", @@ -6737,9 +6595,8 @@ }, "node_modules/google-gax": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.2.0.tgz", - "integrity": "sha512-ysBZvCcstvG1vYr5/Nd7IOPH3p4g2sJNmxrxOkFI4pJjWJexH98fpJym1N4LsI2pIVCopVvEcXrDmg5QIaFmfA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "@grpc/grpc-js": "~1.9.6", @@ -6780,9 +6637,8 @@ }, "node_modules/gtoken": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", - "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "gaxios": "^6.0.0", @@ -6892,9 +6748,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@tootallnate/once": "2", @@ -6907,9 +6762,8 @@ }, "node_modules/http-proxy-agent/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==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "debug": "4" @@ -6920,8 +6774,7 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6939,9 +6792,8 @@ }, "node_modules/husky": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, + "license": "MIT", "bin": { "husky": "lib/bin.js" }, @@ -6964,13 +6816,10 @@ }, "node_modules/idb": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "license": "ISC" }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -6984,7 +6833,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.0", @@ -7000,14 +6850,12 @@ }, "node_modules/immediate": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7999,9 +7847,8 @@ }, "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, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8021,9 +7868,8 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "bignumber.js": "^9.0.0" @@ -8040,9 +7886,8 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8051,9 +7896,8 @@ }, "node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -8117,8 +7961,7 @@ }, "node_modules/jszip": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -8128,13 +7971,11 @@ }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8147,22 +7988,19 @@ }, "node_modules/jszip/node_modules/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==" + "license": "MIT" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/jwa": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", @@ -8188,9 +8026,8 @@ }, "node_modules/jws": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "jwa": "^2.0.0", @@ -8221,8 +8058,7 @@ }, "node_modules/lazystream": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", "dependencies": { "readable-stream": "^2.0.5" }, @@ -8232,13 +8068,11 @@ }, "node_modules/lazystream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8251,13 +8085,11 @@ }, "node_modules/lazystream/node_modules/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==" + "license": "MIT" }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -8283,8 +8115,7 @@ }, "node_modules/lie": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -8299,8 +8130,7 @@ }, "node_modules/listenercount": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + "license": "ISC" }, "node_modules/locate-path": { "version": "6.0.0", @@ -8331,28 +8161,23 @@ }, "node_modules/lodash.defaults": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + "license": "MIT" }, "node_modules/lodash.difference": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + "license": "MIT" }, "node_modules/lodash.flatten": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + "license": "MIT" }, "node_modules/lodash.groupby": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -8365,13 +8190,11 @@ }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "license": "MIT" }, "node_modules/lodash.isfunction": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", @@ -8380,8 +8203,7 @@ }, "node_modules/lodash.isnil": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", @@ -8399,8 +8221,7 @@ }, "node_modules/lodash.isundefined": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -8418,13 +8239,11 @@ }, "node_modules/lodash.union": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "license": "MIT" }, "node_modules/long": { "version": "5.2.3", @@ -8520,8 +8339,7 @@ }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -8597,8 +8415,7 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -8794,8 +8611,7 @@ }, "node_modules/mylas": { "version": "2.1.13", - "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", - "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -8827,9 +8643,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -8848,23 +8663,20 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-fetch/node_modules/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==", "dev": true, + "license": "BSD-2-Clause", "optional": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tr46": "~0.0.3", @@ -8873,9 +8685,8 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -8890,8 +8701,7 @@ }, "node_modules/nodemailer": { "version": "6.9.8", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", - "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", + "license": "MIT-0", "engines": { "node": ">=6.0.0" } @@ -8987,9 +8797,8 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 6" @@ -9177,14 +8986,12 @@ }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "license": "(MIT AND Zlib)" }, "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, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9246,8 +9053,7 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -9333,8 +9139,7 @@ }, "node_modules/plimit-lit": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", - "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "license": "MIT", "dependencies": { "queue-lit": "^1.5.1" }, @@ -9352,9 +9157,8 @@ }, "node_modules/prettier": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -9393,8 +9197,7 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", @@ -9419,9 +9222,8 @@ }, "node_modules/proto3-json-serializer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "protobufjs": "^7.2.5" @@ -9432,9 +9234,8 @@ }, "node_modules/protobufjs": { "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -9510,8 +9311,7 @@ }, "node_modules/queue-lit": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", - "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "license": "MIT", "engines": { "node": ">=12" } @@ -9565,8 +9365,7 @@ }, "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==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9578,24 +9377,21 @@ }, "node_modules/readdir-glob": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.1.0" } }, "node_modules/readdir-glob/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9689,18 +9485,16 @@ }, "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, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -9714,9 +9508,8 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 4" @@ -9724,9 +9517,8 @@ }, "node_modules/retry-request": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/request": "^2.48.8", @@ -9834,8 +9626,7 @@ }, "node_modules/saxes": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -9934,8 +9725,7 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -10073,9 +9863,8 @@ }, "node_modules/stream-events": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "stubs": "^3.0.0" @@ -10083,9 +9872,8 @@ }, "node_modules/stream-shift": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/streamx": { @@ -10098,8 +9886,7 @@ }, "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==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -10200,9 +9987,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10231,9 +10017,8 @@ }, "node_modules/stubs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/superagent": { @@ -10298,9 +10083,8 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10316,9 +10100,8 @@ }, "node_modules/teeny-request": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "http-proxy-agent": "^5.0.0", @@ -10333,9 +10116,8 @@ }, "node_modules/teeny-request/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==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "debug": "4" @@ -10346,9 +10128,8 @@ }, "node_modules/teeny-request/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==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "agent-base": "6", @@ -10382,8 +10163,7 @@ }, "node_modules/tmp": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "license": "MIT", "engines": { "node": ">=14.14" } @@ -10439,11 +10219,7 @@ }, "node_modules/traverse": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "engines": { - "node": "*" - } + "license": "MIT/X11" }, "node_modules/ts-api-utils": { "version": "1.0.3", @@ -10551,8 +10327,7 @@ }, "node_modules/tsc-alias": { "version": "1.8.8", - "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.8.tgz", - "integrity": "sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==", + "license": "MIT", "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", @@ -10567,9 +10342,8 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -10601,9 +10375,8 @@ }, "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, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -10715,8 +10488,7 @@ }, "node_modules/undici": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -10730,8 +10502,7 @@ }, "node_modules/undici/node_modules/@fastify/busboy": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "license": "MIT", "engines": { "node": ">=14" } @@ -10745,8 +10516,7 @@ }, "node_modules/unzipper": { "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "license": "MIT", "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -10762,13 +10532,11 @@ }, "node_modules/unzipper/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/unzipper/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10781,13 +10549,11 @@ }, "node_modules/unzipper/node_modules/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==" + "license": "MIT" }, "node_modules/unzipper/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -10822,17 +10588,15 @@ }, "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, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "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==" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -10843,13 +10607,12 @@ }, "node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -11054,8 +10817,7 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", @@ -11119,8 +10881,7 @@ }, "node_modules/zip-stream": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "license": "MIT", "dependencies": { "archiver-utils": "^3.0.4", "compress-commons": "^4.1.2", @@ -11132,8 +10893,7 @@ }, "node_modules/zip-stream/node_modules/archiver-utils": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "license": "MIT", "dependencies": { "glob": "^7.2.3", "graceful-fs": "^4.2.0", From 8f6902f54dbd1745715716aa88134adf85e3d030 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 15:32:54 -0700 Subject: [PATCH 25/35] Try (hopefully) working version of backend/package-lock.json --- backend/package-lock.json | 710 +++++++++++++++++++++++++------------- 1 file changed, 475 insertions(+), 235 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index a457ad8..2549bc4 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1526,8 +1526,9 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1548,15 +1549,17 @@ }, "node_modules/@eslint/js": { "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@fast-csv/format": { "version": "4.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -1568,11 +1571,13 @@ }, "node_modules/@fast-csv/format/node_modules/@types/node": { "version": "14.18.63", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@fast-csv/parse": { "version": "4.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", "dependencies": { "@types/node": "^14.0.1", "lodash.escaperegexp": "^4.1.2", @@ -1585,7 +1590,8 @@ }, "node_modules/@fast-csv/parse/node_modules/@types/node": { "version": "14.18.63", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@fastify/busboy": { "version": "1.2.1", @@ -1600,7 +1606,8 @@ }, "node_modules/@firebase/analytics": { "version": "0.10.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1614,7 +1621,8 @@ }, "node_modules/@firebase/analytics-compat": { "version": "0.2.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-types": "0.8.0", @@ -1628,11 +1636,13 @@ }, "node_modules/@firebase/analytics-types": { "version": "0.8.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" }, "node_modules/@firebase/app": { "version": "0.9.26", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.26.tgz", + "integrity": "sha512-zCjo6KhNhbuFB+V+Z4H9g4+BZ78E7n3ShxaBtuIcRkpwdm7+1BsafzChOsDYuI86m97HUWsyLPurLBhqcupFFA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1643,7 +1653,8 @@ }, "node_modules/@firebase/app-check": { "version": "0.8.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.1.tgz", + "integrity": "sha512-zi3vbM5tb/eGRWyiqf+1DXbxFu9Q07dnm46rweodgUpH9B8svxYkHfNwYWx7F5mjHU70SQDuaojH1We5ws9OKA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1656,7 +1667,8 @@ }, "node_modules/@firebase/app-check-compat": { "version": "0.3.8", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.8.tgz", + "integrity": "sha512-EaETtChR4UgMokJFw+r6jfcIyCTUZSe0a6ivF37D9MxlG9G3wzK1COyXgxoX96GzXmDPc2aubX4PxCrdVHhrnA==", "dependencies": { "@firebase/app-check": "0.8.1", "@firebase/app-check-types": "0.5.0", @@ -1671,15 +1683,18 @@ }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" }, "node_modules/@firebase/app-check-types": { "version": "0.5.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" }, "node_modules/@firebase/app-compat": { "version": "0.2.26", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.26.tgz", + "integrity": "sha512-tVNOYvB3lIFkN3RmcTieo5qYRIkYak9iC6E7dZMxax52uMIUJiIKKtPkarbwZh6EnUxru5hJRo8tfUZGuaQDQw==", "dependencies": { "@firebase/app": "0.9.26", "@firebase/component": "0.6.4", @@ -1694,7 +1709,8 @@ }, "node_modules/@firebase/auth": { "version": "1.5.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.5.1.tgz", + "integrity": "sha512-sVi7rq2YneLGJFqHa5S6nDfCHix9yuVV3RLhj/pWPlB4a36ofXal4E6PJwpeMc8uLjWEr1aovYN1jkXWNB6Avw==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1714,7 +1730,8 @@ }, "node_modules/@firebase/auth-compat": { "version": "0.5.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.1.tgz", + "integrity": "sha512-rgDZnrDoekRvtzXVji8Z61wxxkof6pTkjYEkybILrjM8tGP9tx4xa9qGpF4ax3AzF+rKr7mIa9NnoXEK4UNqmQ==", "dependencies": { "@firebase/auth": "1.5.1", "@firebase/auth-types": "0.12.0", @@ -1733,7 +1750,8 @@ }, "node_modules/@firebase/auth-types": { "version": "0.12.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -1749,7 +1767,8 @@ }, "node_modules/@firebase/database": { "version": "1.0.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.2.tgz", + "integrity": "sha512-8X6NBJgUQzDz0xQVaCISoOLINKat594N2eBbMR3Mu/MH/ei4WM+aAMlsNzngF22eljXu1SILP5G3evkyvsG3Ng==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -1762,7 +1781,8 @@ }, "node_modules/@firebase/database-compat": { "version": "1.0.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.2.tgz", + "integrity": "sha512-09ryJnXDvuycsxn8aXBzLhBTuCos3HEnCOBWY6hosxfYlNCGnLvG8YMlbSAt5eNhf7/00B095AEfDsdrrLjxqA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/database": "1.0.2", @@ -1774,7 +1794,8 @@ }, "node_modules/@firebase/database-types": { "version": "1.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", + "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", "dependencies": { "@firebase/app-types": "0.9.0", "@firebase/util": "1.9.3" @@ -1782,7 +1803,8 @@ }, "node_modules/@firebase/firestore": { "version": "4.4.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.1.tgz", + "integrity": "sha512-LCWZZ+rgNET1qw3vpugmGCJZVbz7c5NkgKect5pZn36gaBzGVb8+pRQ8WSZ1veYVMOK6SKrBkS1Rw6EqcmPnyw==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1802,7 +1824,8 @@ }, "node_modules/@firebase/firestore-compat": { "version": "0.3.24", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.24.tgz", + "integrity": "sha512-Wj5cgqmQwTnqHS4KabOpXCNIaSTtVDP1NitnhjXff04Q4QK0aeIbeO1TPlSSTmUb6S7KzoKD4XR99hfKZDYbfA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/firestore": "4.4.1", @@ -1816,7 +1839,8 @@ }, "node_modules/@firebase/firestore-types": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -1824,7 +1848,8 @@ }, "node_modules/@firebase/functions": { "version": "0.11.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.0.tgz", + "integrity": "sha512-n1PZxKnJ++k73Q8khTPwihlbeKo6emnGzE0hX6QVQJsMq82y/XKmNpw2t/q30VJgwaia3ZXU1fd1C5wHncL+Zg==", "dependencies": { "@firebase/app-check-interop-types": "0.3.0", "@firebase/auth-interop-types": "0.2.1", @@ -1840,7 +1865,8 @@ }, "node_modules/@firebase/functions-compat": { "version": "0.3.6", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.6.tgz", + "integrity": "sha512-RQpO3yuHtnkqLqExuAT2d0u3zh8SDbeBYK5EwSCBKI9mjrFeJRXBnd3pEG+x5SxGJLy56/5pQf73mwt0OuH5yg==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/functions": "0.11.0", @@ -1854,11 +1880,13 @@ }, "node_modules/@firebase/functions-types": { "version": "0.6.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" }, "node_modules/@firebase/installations": { "version": "0.6.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", @@ -1871,7 +1899,8 @@ }, "node_modules/@firebase/installations-compat": { "version": "0.2.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1885,14 +1914,16 @@ }, "node_modules/@firebase/installations-types": { "version": "0.5.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", "peerDependencies": { "@firebase/app-types": "0.x" } }, "node_modules/@firebase/installations/node_modules/idb": { "version": "7.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" }, "node_modules/@firebase/logger": { "version": "0.4.0", @@ -1903,7 +1934,8 @@ }, "node_modules/@firebase/messaging": { "version": "0.12.5", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.5.tgz", + "integrity": "sha512-i/rrEI2k9ueFhdIr8KQsptWGskrsnkC5TkohCTrJKz9P0C/PbNv14IAMkwhMJTqIur5VwuOnrUkc9Kdz7awekw==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1918,7 +1950,8 @@ }, "node_modules/@firebase/messaging-compat": { "version": "0.2.5", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.5.tgz", + "integrity": "sha512-qHQZxm4hEG8/HFU/ls5/bU+rpnlPDoZoqi3ATMeb6s4hovYV9+PfV5I7ZrKV5eFFv47Hx1PWLe5uPnS4e7gMwQ==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/messaging": "0.12.5", @@ -1931,11 +1964,13 @@ }, "node_modules/@firebase/messaging-interop-types": { "version": "0.2.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" }, "node_modules/@firebase/performance": { "version": "0.6.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1949,7 +1984,8 @@ }, "node_modules/@firebase/performance-compat": { "version": "0.2.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1964,11 +2000,13 @@ }, "node_modules/@firebase/performance-types": { "version": "0.2.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" }, "node_modules/@firebase/remote-config": { "version": "0.4.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/installations": "0.6.4", @@ -1982,7 +2020,8 @@ }, "node_modules/@firebase/remote-config-compat": { "version": "0.2.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/logger": "0.4.0", @@ -1997,11 +2036,13 @@ }, "node_modules/@firebase/remote-config-types": { "version": "0.3.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" }, "node_modules/@firebase/storage": { "version": "0.12.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.0.tgz", + "integrity": "sha512-SGs02Y/mmWBRsqZiYLpv4Sf7uZYZzMWVNN+aKiDqPsFBCzD6hLvGkXz+u98KAl8FqcjgB8BtSu01wm4pm76KHA==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/util": "1.9.3", @@ -2014,7 +2055,8 @@ }, "node_modules/@firebase/storage-compat": { "version": "0.3.3", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.3.tgz", + "integrity": "sha512-WNtjYPhpOA1nKcRu5lIodX0wZtP8pI0VxDJnk6lr+av7QZNS1s6zvr+ERDTve+Qu4Hq/ZnNaf3kBEQR2ccXn6A==", "dependencies": { "@firebase/component": "0.6.4", "@firebase/storage": "0.12.0", @@ -2028,7 +2070,8 @@ }, "node_modules/@firebase/storage-types": { "version": "0.8.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -2043,12 +2086,14 @@ }, "node_modules/@firebase/webchannel-wrapper": { "version": "0.10.5", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" }, "node_modules/@google-cloud/firestore": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.2.0.tgz", + "integrity": "sha512-rBIiy3o+OxWwUT0EMAAq0OZUduF1l0/GQ9WTnUyiHxixsLR1qU5Y6pC4BOIsYPnup1OESMhFSX0EEx6oriT0pw==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2062,8 +2107,9 @@ }, "node_modules/@google-cloud/paginator": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", + "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "arrify": "^2.0.0", @@ -2075,8 +2121,9 @@ }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "dev": true, - "license": "Apache-2.0", "optional": true, "engines": { "node": ">=14.0.0" @@ -2084,8 +2131,9 @@ }, "node_modules/@google-cloud/promisify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "dev": true, - "license": "Apache-2.0", "optional": true, "engines": { "node": ">=14" @@ -2093,8 +2141,9 @@ }, "node_modules/@google-cloud/storage": { "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", + "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "@google-cloud/paginator": "^5.0.0", @@ -2121,8 +2170,9 @@ }, "node_modules/@google-cloud/storage/node_modules/mime": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, - "license": "MIT", "optional": true, "bin": { "mime": "cli.js" @@ -2133,8 +2183,9 @@ }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "optional": true, "bin": { "uuid": "dist/bin/uuid" @@ -2142,7 +2193,8 @@ }, "node_modules/@grpc/grpc-js": { "version": "1.9.14", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -3477,8 +3529,9 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 10" @@ -3548,8 +3601,9 @@ }, "node_modules/@types/caseless": { "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/@types/connect": { @@ -3636,13 +3690,15 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/jsonwebtoken": { "version": "9.0.5", @@ -3654,8 +3710,9 @@ }, "node_modules/@types/long": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/@types/mime": { @@ -3665,7 +3722,8 @@ }, "node_modules/@types/node": { "version": "20.11.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", "dependencies": { "undici-types": "~5.26.4" } @@ -3690,8 +3748,9 @@ }, "node_modules/@types/request": { "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@types/caseless": "*", @@ -3702,8 +3761,9 @@ }, "node_modules/@types/request/node_modules/form-data": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "asynckit": "^0.4.0", @@ -3716,8 +3776,9 @@ }, "node_modules/@types/semver": { "version": "7.5.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.4", @@ -3761,8 +3822,9 @@ }, "node_modules/@types/tough-cookie": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/@types/webidl-conversions": { @@ -3790,8 +3852,9 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", + "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.14.0", @@ -3824,8 +3887,9 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", + "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.14.0", "@typescript-eslint/types": "6.14.0", @@ -3851,8 +3915,9 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", + "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.14.0", "@typescript-eslint/visitor-keys": "6.14.0" @@ -3867,8 +3932,9 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", + "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "6.14.0", "@typescript-eslint/utils": "6.14.0", @@ -3893,8 +3959,9 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", + "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "dev": true, - "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -3905,8 +3972,9 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", + "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.14.0", "@typescript-eslint/visitor-keys": "6.14.0", @@ -3931,8 +3999,9 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", + "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -3955,8 +4024,9 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", + "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.14.0", "eslint-visitor-keys": "^3.4.1" @@ -3981,8 +4051,9 @@ }, "node_modules/abort-controller": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "event-target-shim": "^5.0.0" @@ -4031,7 +4102,8 @@ }, "node_modules/agent-base": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { "debug": "^4.3.4" }, @@ -4041,8 +4113,9 @@ }, "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, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4110,7 +4183,8 @@ }, "node_modules/archiver": { "version": "5.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.4", @@ -4126,7 +4200,8 @@ }, "node_modules/archiver-utils": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", @@ -4145,11 +4220,13 @@ }, "node_modules/archiver-utils/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/archiver-utils/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4162,18 +4239,21 @@ }, "node_modules/archiver-utils/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/archiver-utils/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/archiver/node_modules/tar-stream": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -4231,7 +4311,8 @@ }, "node_modules/array-union": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "engines": { "node": ">=8" } @@ -4322,8 +4403,9 @@ }, "node_modules/arrify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4335,7 +4417,8 @@ }, "node_modules/async": { "version": "3.2.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-mutex": { "version": "0.4.0", @@ -4350,8 +4433,9 @@ }, "node_modules/async-retry": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "retry": "0.13.1" @@ -4492,6 +4576,8 @@ }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4505,20 +4591,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/big-integer": { "version": "1.6.52", - "license": "Unlicense", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "engines": { "node": ">=0.6" } }, "node_modules/bignumber.js": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": "*" @@ -4526,10 +4613,14 @@ }, "node_modules/binary": { "version": "0.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" } }, "node_modules/binary-extensions": { @@ -4541,7 +4632,8 @@ }, "node_modules/bl": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -4550,7 +4642,8 @@ }, "node_modules/bluebird": { "version": "3.4.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, "node_modules/body-parser": { "version": "1.20.1", @@ -4665,6 +4758,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -4679,7 +4774,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4703,13 +4797,16 @@ }, "node_modules/buffer-indexof-polyfill": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", "engines": { "node": ">=0.10" } }, "node_modules/buffers": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", "engines": { "node": ">=0.2.0" } @@ -4767,9 +4864,13 @@ }, "node_modules/chainsaw": { "version": "0.1.0", - "license": "MIT/X11", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dependencies": { "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" } }, "node_modules/chalk": { @@ -4895,7 +4996,8 @@ }, "node_modules/commander": { "version": "9.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "engines": { "node": "^12.20.0 || >=14" } @@ -4913,7 +5015,8 @@ }, "node_modules/compress-commons": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", @@ -4926,8 +5029,9 @@ }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -4983,7 +5087,8 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -4998,7 +5103,8 @@ }, "node_modules/crc-32": { "version": "1.2.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "bin": { "crc32": "bin/crc32.njs" }, @@ -5008,7 +5114,8 @@ }, "node_modules/crc32-stream": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -5055,7 +5162,8 @@ }, "node_modules/dayjs": { "version": "1.11.10", - "license": "MIT" + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -5178,7 +5286,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { "path-type": "^4.0.0" }, @@ -5209,18 +5318,21 @@ }, "node_modules/duplexer2": { "version": "0.1.4", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dependencies": { "readable-stream": "^2.0.2" } }, "node_modules/duplexer2/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5233,19 +5345,22 @@ }, "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/duplexify": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "end-of-stream": "^1.4.1", @@ -5293,15 +5408,17 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5312,8 +5429,9 @@ }, "node_modules/ent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/envalid": { @@ -5467,8 +5585,9 @@ }, "node_modules/eslint": { "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5547,8 +5666,9 @@ }, "node_modules/eslint-config-prettier": { "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5576,8 +5696,9 @@ }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -5624,8 +5745,9 @@ }, "node_modules/eslint-plugin-import": { "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", @@ -5848,8 +5970,9 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -5857,7 +5980,8 @@ }, "node_modules/exceljs": { "version": "4.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", "dependencies": { "archiver": "^5.0.0", "dayjs": "^1.8.34", @@ -5875,7 +5999,8 @@ }, "node_modules/exceljs/node_modules/uuid": { "version": "8.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } @@ -5985,13 +6110,15 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/fast-csv": { "version": "4.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", "dependencies": { "@fast-csv/format": "4.3.5", "@fast-csv/parse": "4.3.6" @@ -6011,7 +6138,8 @@ }, "node_modules/fast-glob": { "version": "3.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6025,7 +6153,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -6048,6 +6177,8 @@ }, "node_modules/fast-xml-parser": { "version": "4.3.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz", + "integrity": "sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==", "dev": true, "funding": [ { @@ -6059,7 +6190,6 @@ "url": "https://paypal.me/naturalintelligence" } ], - "license": "MIT", "optional": true, "dependencies": { "strnum": "^1.0.5" @@ -6199,7 +6329,8 @@ }, "node_modules/firebase": { "version": "10.7.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.7.2.tgz", + "integrity": "sha512-zED3kAJyf+Xx5tXpC3vjmlWTm/SIVoJJ6MOLuXYJkqKAUJLG7Q1Jxy6l1DxCzGgBqZHxc0Jh6q+qG++9kimHsw==", "dependencies": { "@firebase/analytics": "0.10.0", "@firebase/analytics-compat": "0.2.6", @@ -6231,8 +6362,9 @@ }, "node_modules/firebase-admin": { "version": "12.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", + "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@fastify/busboy": "^1.2.1", "@firebase/database-compat": "^1.0.2", @@ -6336,7 +6468,8 @@ }, "node_modules/fs-constants": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -6344,7 +6477,8 @@ }, "node_modules/fstream": { "version": "1.0.12", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -6357,7 +6491,8 @@ }, "node_modules/fstream/node_modules/rimraf": { "version": "2.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, @@ -6391,8 +6526,9 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/functions-have-names": { @@ -6405,8 +6541,9 @@ }, "node_modules/gaxios": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "extend": "^3.0.2", @@ -6420,8 +6557,9 @@ }, "node_modules/gcp-metadata": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "gaxios": "^6.0.0", @@ -6492,8 +6630,9 @@ }, "node_modules/get-tsconfig": { "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -6532,8 +6671,9 @@ }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6560,7 +6700,8 @@ }, "node_modules/globby": { "version": "11.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6578,8 +6719,9 @@ }, "node_modules/google-auth-library": { "version": "9.4.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.4.2.tgz", + "integrity": "sha512-rTLO4gjhqqo3WvYKL5IdtlCvRqeQ4hxUx/p4lObobY2xotFW3bCQC+Qf1N51CYOfiqfMecdMwW9RIo7dFWYjqw==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "base64-js": "^1.3.0", @@ -6595,8 +6737,9 @@ }, "node_modules/google-gax": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.2.0.tgz", + "integrity": "sha512-ysBZvCcstvG1vYr5/Nd7IOPH3p4g2sJNmxrxOkFI4pJjWJexH98fpJym1N4LsI2pIVCopVvEcXrDmg5QIaFmfA==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "@grpc/grpc-js": "~1.9.6", @@ -6637,8 +6780,9 @@ }, "node_modules/gtoken": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "gaxios": "^6.0.0", @@ -6748,8 +6892,9 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@tootallnate/once": "2", @@ -6762,8 +6907,9 @@ }, "node_modules/http-proxy-agent/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==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "debug": "4" @@ -6774,7 +6920,8 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6792,8 +6939,9 @@ }, "node_modules/husky": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, - "license": "MIT", "bin": { "husky": "lib/bin.js" }, @@ -6816,10 +6964,13 @@ }, "node_modules/idb": { "version": "7.1.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -6833,8 +6984,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.3.0", @@ -6850,12 +7000,14 @@ }, "node_modules/immediate": { "version": "3.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "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, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7847,8 +7999,9 @@ }, "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, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7868,8 +8021,9 @@ }, "node_modules/json-bigint": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "bignumber.js": "^9.0.0" @@ -7886,8 +8040,9 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "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", @@ -7896,8 +8051,9 @@ }, "node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7961,7 +8117,8 @@ }, "node_modules/jszip": { "version": "3.10.1", - "license": "(MIT OR GPL-3.0-or-later)", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -7971,11 +8128,13 @@ }, "node_modules/jszip/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7988,19 +8147,22 @@ }, "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/jwa": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", @@ -8026,8 +8188,9 @@ }, "node_modules/jws": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "jwa": "^2.0.0", @@ -8058,7 +8221,8 @@ }, "node_modules/lazystream": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dependencies": { "readable-stream": "^2.0.5" }, @@ -8068,11 +8232,13 @@ }, "node_modules/lazystream/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8085,11 +8251,13 @@ }, "node_modules/lazystream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } @@ -8115,7 +8283,8 @@ }, "node_modules/lie": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dependencies": { "immediate": "~3.0.5" } @@ -8130,7 +8299,8 @@ }, "node_modules/listenercount": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" }, "node_modules/locate-path": { "version": "6.0.0", @@ -8161,23 +8331,28 @@ }, "node_modules/lodash.defaults": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "node_modules/lodash.difference": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" }, "node_modules/lodash.flatten": { "version": "4.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, "node_modules/lodash.groupby": { "version": "4.6.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -8190,11 +8365,13 @@ }, "node_modules/lodash.isequal": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.isfunction": { "version": "3.0.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" }, "node_modules/lodash.isinteger": { "version": "4.0.4", @@ -8203,7 +8380,8 @@ }, "node_modules/lodash.isnil": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" }, "node_modules/lodash.isnumber": { "version": "3.0.3", @@ -8221,7 +8399,8 @@ }, "node_modules/lodash.isundefined": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" }, "node_modules/lodash.memoize": { "version": "4.1.2", @@ -8239,11 +8418,13 @@ }, "node_modules/lodash.union": { "version": "4.6.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/long": { "version": "5.2.3", @@ -8339,7 +8520,8 @@ }, "node_modules/merge2": { "version": "1.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { "node": ">= 8" } @@ -8415,7 +8597,8 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -8611,7 +8794,8 @@ }, "node_modules/mylas": { "version": "2.1.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", "engines": { "node": ">=12.0.0" }, @@ -8643,8 +8827,9 @@ }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -8663,20 +8848,23 @@ }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/node-fetch/node_modules/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==", "dev": true, - "license": "BSD-2-Clause", "optional": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tr46": "~0.0.3", @@ -8685,8 +8873,9 @@ }, "node_modules/node-forge": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -8701,7 +8890,8 @@ }, "node_modules/nodemailer": { "version": "6.9.8", - "license": "MIT-0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", "engines": { "node": ">=6.0.0" } @@ -8797,8 +8987,9 @@ }, "node_modules/object-hash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 6" @@ -8986,12 +9177,14 @@ }, "node_modules/pako": { "version": "1.0.11", - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "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, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9053,7 +9246,8 @@ }, "node_modules/path-type": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { "node": ">=8" } @@ -9139,7 +9333,8 @@ }, "node_modules/plimit-lit": { "version": "1.6.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", "dependencies": { "queue-lit": "^1.5.1" }, @@ -9157,8 +9352,9 @@ }, "node_modules/prettier": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -9197,7 +9393,8 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/prompts": { "version": "2.4.2", @@ -9222,8 +9419,9 @@ }, "node_modules/proto3-json-serializer": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", + "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "protobufjs": "^7.2.5" @@ -9234,8 +9432,9 @@ }, "node_modules/protobufjs": { "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -9311,7 +9510,8 @@ }, "node_modules/queue-lit": { "version": "1.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", "engines": { "node": ">=12" } @@ -9365,7 +9565,8 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "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", @@ -9377,21 +9578,24 @@ }, "node_modules/readdir-glob": { "version": "1.1.3", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dependencies": { "minimatch": "^5.1.0" } }, "node_modules/readdir-glob/node_modules/brace-expansion": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9485,16 +9689,18 @@ }, "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, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -9508,8 +9714,9 @@ }, "node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 4" @@ -9517,8 +9724,9 @@ }, "node_modules/retry-request": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@types/request": "^2.48.8", @@ -9626,7 +9834,8 @@ }, "node_modules/saxes": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dependencies": { "xmlchars": "^2.2.0" }, @@ -9725,7 +9934,8 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -9863,8 +10073,9 @@ }, "node_modules/stream-events": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "stubs": "^3.0.0" @@ -9872,8 +10083,9 @@ }, "node_modules/stream-shift": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/streamx": { @@ -9886,7 +10098,8 @@ }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", + "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" } @@ -9987,8 +10200,9 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -10017,8 +10231,9 @@ }, "node_modules/stubs": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/superagent": { @@ -10083,8 +10298,9 @@ }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10100,8 +10316,9 @@ }, "node_modules/teeny-request": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "http-proxy-agent": "^5.0.0", @@ -10116,8 +10333,9 @@ }, "node_modules/teeny-request/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==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "debug": "4" @@ -10128,8 +10346,9 @@ }, "node_modules/teeny-request/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==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "agent-base": "6", @@ -10163,7 +10382,8 @@ }, "node_modules/tmp": { "version": "0.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { "node": ">=14.14" } @@ -10219,7 +10439,11 @@ }, "node_modules/traverse": { "version": "0.3.9", - "license": "MIT/X11" + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } }, "node_modules/ts-api-utils": { "version": "1.0.3", @@ -10327,7 +10551,8 @@ }, "node_modules/tsc-alias": { "version": "1.8.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.8.tgz", + "integrity": "sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==", "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", @@ -10342,8 +10567,9 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -10375,8 +10601,9 @@ }, "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, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -10488,7 +10715,8 @@ }, "node_modules/undici": { "version": "5.26.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -10502,7 +10730,8 @@ }, "node_modules/undici/node_modules/@fastify/busboy": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", "engines": { "node": ">=14" } @@ -10516,7 +10745,8 @@ }, "node_modules/unzipper": { "version": "0.10.14", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -10532,11 +10762,13 @@ }, "node_modules/unzipper/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/unzipper/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10549,11 +10781,13 @@ }, "node_modules/unzipper/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/unzipper/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } @@ -10588,15 +10822,17 @@ }, "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, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "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", @@ -10607,12 +10843,13 @@ }, "node_modules/uuid": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -10817,7 +11054,8 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/y18n": { "version": "5.0.8", @@ -10881,7 +11119,8 @@ }, "node_modules/zip-stream": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", "dependencies": { "archiver-utils": "^3.0.4", "compress-commons": "^4.1.2", @@ -10893,7 +11132,8 @@ }, "node_modules/zip-stream/node_modules/archiver-utils": { "version": "3.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", "dependencies": { "glob": "^7.2.3", "graceful-fs": "^4.2.0", From a410612dc61d87c70d3aef6eb7560a0c0d1dd5f0 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 15:42:05 -0700 Subject: [PATCH 26/35] Change VSR export function to send file directly to response instead of saving to disk (doesn't work on Vercel) --- backend/src/controllers/vsr.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 65e0f42..7634bad 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -1,6 +1,5 @@ -import { RequestHandler } from "express"; +import { RequestHandler, Response } from "express"; import { validationResult } from "express-validator"; -import fs from "fs"; import createHttpError from "http-errors"; import FurnitureItemModel, { FurnitureItem } from "src/models/furnitureItem"; import VSRModel, { FurnitureInput, VSR } from "src/models/vsr"; @@ -205,7 +204,7 @@ const stringifySelectedFurnitureItems = ( .join(", "); }; -const writeSpreadsheet = async (filename: string) => { +const writeSpreadsheet = async (filename: string, res: Response) => { const workbook = new ExcelJS.Workbook(); workbook.creator = "PAP Inventory System"; @@ -286,17 +285,19 @@ const writeSpreadsheet = async (filename: string) => { }); // Write to file - await workbook.xlsx.writeFile(filename); + await workbook.xlsx.write(res); }; export const bulkExportVSRS: RequestHandler = async (req, res, next) => { try { const filename = "vsrs.xlsx"; - await writeSpreadsheet(filename); - res.download(filename, () => { - // Once the flie has been sent to the requestor, remove it from our filesystem - fs.unlinkSync(filename); + // Set some headers on the response so the client knows that a file is attached + res.set({ + "Content-Disposition": `attachment; filename="${filename}"`, + "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); + + await writeSpreadsheet(filename, res); } catch (error) { next(error); } From b7d8645e0fa367e20edaa1a0b955d419be160298 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 15:43:38 -0700 Subject: [PATCH 27/35] Rebuild backend w/ VSR export changes --- backend/dist/src/controllers/vsr.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/dist/src/controllers/vsr.js b/backend/dist/src/controllers/vsr.js index 3c434db..b557770 100644 --- a/backend/dist/src/controllers/vsr.js +++ b/backend/dist/src/controllers/vsr.js @@ -14,7 +14,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); exports.bulkExportVSRS = exports.deleteVSR = exports.updateVSR = exports.updateStatus = exports.createVSR = exports.getVSR = exports.getAllVSRS = void 0; const express_validator_1 = require("express-validator"); -const fs_1 = __importDefault(require("fs")); const http_errors_1 = __importDefault(require("http-errors")); const furnitureItem_1 = __importDefault(require("../models/furnitureItem")); const vsr_1 = __importDefault(require("../models/vsr")); @@ -177,7 +176,7 @@ const stringifySelectedFurnitureItems = (selectedItems, allFurnitureItems) => { }) .join(", "); }; -const writeSpreadsheet = (filename) => __awaiter(void 0, void 0, void 0, function* () { +const writeSpreadsheet = (filename, res) => __awaiter(void 0, void 0, void 0, function* () { const workbook = new exceljs_1.default.Workbook(); workbook.creator = "PAP Inventory System"; workbook.lastModifiedBy = "Bot"; @@ -234,16 +233,17 @@ const writeSpreadsheet = (filename) => __awaiter(void 0, void 0, void 0, functio : stringifyEntry(vsr[field[0]]) })), {})); }); // Write to file - yield workbook.xlsx.writeFile(filename); + yield workbook.xlsx.write(res); }); const bulkExportVSRS = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { try { const filename = "vsrs.xlsx"; - yield writeSpreadsheet(filename); - res.download(filename, () => { - // Once the flie has been sent to the requestor, remove it from our filesystem - fs_1.default.unlinkSync(filename); + // Set some headers on the response so the client knows that a file is attached + res.set({ + "Content-Disposition": `attachment; filename="${filename}"`, + "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); + yield writeSpreadsheet(filename, res); } catch (error) { next(error); From 03247138c7eb7ef3badf39df461685e0acb70e86 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 23:05:50 -0700 Subject: [PATCH 28/35] Move fields between personal & contact info sections of VSR individual --- .../PageSections/ContactInfo/index.tsx | 24 --------- .../PersonalInformation/index.tsx | 50 +++++-------------- 2 files changed, 12 insertions(+), 62 deletions(-) diff --git a/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx b/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx index f947153..69a7916 100644 --- a/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx @@ -21,8 +21,6 @@ export const ContactInfo = ({ vsr, isEditing, formProps }: ContactInfoProps) => useEffect(() => { formProps.setValue("phoneNumber", vsr.phoneNumber); formProps.setValue("email", vsr.email); - formProps.setValue("gender", vsr.gender); - formProps.setValue("age", vsr.age); formProps.setValue("streetAddress", vsr.streetAddress); formProps.setValue("city", vsr.city); formProps.setValue("zipCode", vsr.zipCode); @@ -57,28 +55,6 @@ export const ContactInfo = ({ vsr, isEditing, formProps }: ContactInfoProps) => )} -
- {isEditing ? ( - - ) : ( - - )} - {isEditing ? ( - - ) : ( - - )} -
{isEditing ? ( <>
diff --git a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx index ed3d57c..98311d1 100644 --- a/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/PersonalInformation/index.tsx @@ -10,10 +10,10 @@ import { SelectInputDetail } from "@/components/VSRIndividual/FieldDetails/Selec import { employmentOptions, ethnicityOptions, + genderOptions, homeOptions, incomeOptions, maritalOptions, - stateOptions, } from "@/constants/fieldOptions"; import { MultipleChoiceInputDetail } from "@/components/VSRIndividual/FieldDetails/MultipleChoiceInputDetail"; import { MultipleChoiceWithOtherInputDetail } from "@/components/VSRIndividual/FieldDetails/MultipleChoiceWithOtherInputDetail"; @@ -31,10 +31,8 @@ export interface PersonalInformationProps { export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInformationProps) => { useEffect(() => { formProps.setValue("name", vsr.name); - formProps.setValue("streetAddress", vsr.streetAddress); - formProps.setValue("city", vsr.city); - formProps.setValue("zipCode", vsr.zipCode); - formProps.setValue("state", vsr.state); + formProps.setValue("gender", vsr.gender); + formProps.setValue("age", vsr.age); formProps.setValue("maritalStatus", vsr.maritalStatus); formProps.setValue("spouseName", vsr.spouseName ?? ""); formProps.setValue("num_boys", vsr.agesOfBoys.length); @@ -71,51 +69,27 @@ export const PersonalInformation = ({ vsr, isEditing, formProps }: PersonalInfor )}
- {isEditing ? ( - <> -
- -
-
- -
- - ) : ( -
- - -
- )} +
{isEditing ? ( ) : ( - + )} {isEditing ? ( ) : ( - + )}
From 35dd498f02ede2590e9c967ec13b52350634f8cf Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 23:06:13 -0700 Subject: [PATCH 29/35] Fix linter warning --- .../components/VSRIndividual/PageSections/ContactInfo/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx b/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx index 69a7916..c66b3fa 100644 --- a/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx +++ b/frontend/src/components/VSRIndividual/PageSections/ContactInfo/index.tsx @@ -7,7 +7,7 @@ import { TextInputDetail } from "@/components/VSRIndividual/FieldDetails/TextInp import { UseFormReturn } from "react-hook-form"; import { IEditVSRFormInput } from "@/components/VSRForm/VSRFormTypes"; import { SelectInputDetail } from "@/components/VSRIndividual/FieldDetails/SelectInputDetail"; -import { genderOptions, stateOptions } from "@/constants/fieldOptions"; +import { stateOptions } from "@/constants/fieldOptions"; export interface ContactInfoProps { vsr: VSR; From f773974097eee0f13b0226b0f7d1bfc5e6dccd62 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 23:30:06 -0700 Subject: [PATCH 30/35] Add spacing between VSR table columns --- .../components/VSRTable/VSRTable/index.tsx | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/VSRTable/VSRTable/index.tsx b/frontend/src/components/VSRTable/VSRTable/index.tsx index c520edd..d9318de 100644 --- a/frontend/src/components/VSRTable/VSRTable/index.tsx +++ b/frontend/src/components/VSRTable/VSRTable/index.tsx @@ -11,6 +11,7 @@ import { STATUS_OPTIONS } from "@/components/shared/StatusDropdown"; import { useScreenSizes } from "@/hooks/useScreenSizes"; import { VSR } from "@/api/VSRs"; import { StatusChip } from "@/components/shared/StatusChip"; +import { useMediaQuery } from "@mui/material"; const formatDateReceived = (dateReceived: Date) => { // Return the empty string on a falsy date received, instead of defaulting to today's date @@ -30,6 +31,9 @@ export default function VSRTable({ vsrs, selectedVsrIds, onChangeSelectedVsrIds const { isMobile, isTablet } = useScreenSizes(); const router = useRouter(); + // Remove gap between columns on small screens so it will fit better + const columnsGap = useMediaQuery("@media screen and (max-width: 450px)") ? 0 : 32; + // Define the columns to show in the table (some columns are hidden on smaller screens) const columns: GridColDef[] = React.useMemo(() => { const result = [ @@ -97,6 +101,21 @@ export default function VSRTable({ vsrs, selectedVsrIds, onChangeSelectedVsrIds width: 100, }); + /** + * Hacky solution to make the table fit: add a fake column with a width of + * columnsGap for each gap + */ + result.push({ + field: "phantom", + headerName: "", + type: "string", + flex: 1, + headerClassName: "header", + disableColumnMenu: true, + hideSortIcons: true, + width: columnsGap * (result.length - 1), + }); + return result; }, [isMobile, isTablet]); @@ -104,9 +123,15 @@ export default function VSRTable({ vsrs, selectedVsrIds, onChangeSelectedVsrIds Date: Thu, 18 Apr 2024 23:45:37 -0700 Subject: [PATCH 31/35] Add ability to export only some VSRs from table by selecting --- backend/src/controllers/vsr.ts | 27 ++++++++++++++++++++++----- frontend/src/api/VSRs.ts | 8 ++++++-- frontend/src/app/staff/vsr/page.tsx | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 7634bad..6420b91 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -204,7 +204,7 @@ const stringifySelectedFurnitureItems = ( .join(", "); }; -const writeSpreadsheet = async (filename: string, res: Response) => { +const writeSpreadsheet = async (plainVsrs: VSR[], res: Response) => { const workbook = new ExcelJS.Workbook(); workbook.creator = "PAP Inventory System"; @@ -217,9 +217,6 @@ const writeSpreadsheet = async (filename: string, res: Response) => { const worksheet = workbook.addWorksheet("New Sheet"); - const vsrs = await VSRModel.find(); - const plainVsrs = vsrs.map((doc) => doc.toObject()); - // Fields that we want to write to the spreadsheet. First is field name, second is display name. const fieldsToWrite: [keyof VSR, string][] = [ ["name", "Name"], @@ -297,7 +294,27 @@ export const bulkExportVSRS: RequestHandler = async (req, res, next) => { "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); - await writeSpreadsheet(filename, res); + let vsrs; + + if (req.query.vsrIds && ((req.query.vsrIds.length ?? 0) as number) > 0) { + // If the "vsrIds" query parameter exists and is non-empty, then find & export all VSRs + // with an _id in the vsrIds list + + // Need to convert each ID string to an ObjectId object + const vsrObjectIds = (req.query.vsrIds as string)?.split(",").map((_id) => new ObjectId(_id)); + vsrs = await VSRModel.find({ + _id: { + $in: vsrObjectIds, + }, + }); + } else { + // If the "vsrIds" query parameter is not provided or is empty, export all VSRs in the database + vsrs = await VSRModel.find(); + } + + const plainVsrs = vsrs.map((doc) => doc.toObject()); + + await writeSpreadsheet(plainVsrs, res); } catch (error) { next(error); } diff --git a/frontend/src/api/VSRs.ts b/frontend/src/api/VSRs.ts index 682a637..cfce611 100644 --- a/frontend/src/api/VSRs.ts +++ b/frontend/src/api/VSRs.ts @@ -217,9 +217,13 @@ export async function updateVSR( } } -export async function bulkExportVSRS(firebaseToken: string): Promise> { +export async function bulkExportVSRS( + firebaseToken: string, + vsrIds: string[], +): Promise> { try { - const response = await get("/api/vsr/bulk_export", createAuthHeader(firebaseToken)); + const query = vsrIds.length === 0 ? "" : `?vsrIds=${vsrIds.join(",")}`; + const response = await get(`/api/vsr/bulk_export${query}`, createAuthHeader(firebaseToken)); const blob = await response.blob(); const url = window.URL.createObjectURL(blob); diff --git a/frontend/src/app/staff/vsr/page.tsx b/frontend/src/app/staff/vsr/page.tsx index 5f530b1..1adbde3 100644 --- a/frontend/src/app/staff/vsr/page.tsx +++ b/frontend/src/app/staff/vsr/page.tsx @@ -208,7 +208,7 @@ export default function VSRTableView() { setExportError(VSRExportError.NONE); setLoadingExport(true); firebaseUser?.getIdToken().then((firebaseToken) => { - bulkExportVSRS(firebaseToken).then((result) => { + bulkExportVSRS(firebaseToken, selectedVsrIds).then((result) => { if (result.success) { setExportSuccess(true); } else { From 801e01eb2da18ad45c5ce5546a7c70f1b7ff3031 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 23:50:08 -0700 Subject: [PATCH 32/35] Change boolean fields in VSR excel sheet from true/false to yes/no --- backend/src/controllers/vsr.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 6420b91..00b09f9 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -166,12 +166,14 @@ export const deleteVSR: RequestHandler = async (req, res, next) => { const stringifyEntry = ( entry: string | number | string[] | number[] | boolean | Date | undefined, ) => { - if (!entry) { + if (entry === undefined || entry === null) { return ""; } if (Array.isArray(entry)) { return entry.join(", "); + } else if (typeof entry === "boolean") { + return entry ? "yes" : "no"; } else { return entry.toString(); } From 9d8094ecf7a3875afe992ef8a90e572984873ee0 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Thu, 18 Apr 2024 23:58:11 -0700 Subject: [PATCH 33/35] Add new backend build --- backend/dist/src/controllers/vsr.js | 30 ++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/backend/dist/src/controllers/vsr.js b/backend/dist/src/controllers/vsr.js index b557770..12af104 100644 --- a/backend/dist/src/controllers/vsr.js +++ b/backend/dist/src/controllers/vsr.js @@ -20,6 +20,7 @@ const vsr_1 = __importDefault(require("../models/vsr")); const emails_1 = require("../services/emails"); const validationErrorParser_1 = __importDefault(require("../util/validationErrorParser")); const exceljs_1 = __importDefault(require("exceljs")); +const mongodb_1 = require("mongodb"); /** * Gets all VSRs in the database. Requires the user to be signed in and have * staff or admin permission. @@ -148,12 +149,15 @@ exports.deleteVSR = deleteVSR; * Converts an entry in a VSR to a formatted string to write to the Excel spreadsheet */ const stringifyEntry = (entry) => { - if (!entry) { + if (entry === undefined || entry === null) { return ""; } if (Array.isArray(entry)) { return entry.join(", "); } + else if (typeof entry === "boolean") { + return entry ? "yes" : "no"; + } else { return entry.toString(); } @@ -176,7 +180,7 @@ const stringifySelectedFurnitureItems = (selectedItems, allFurnitureItems) => { }) .join(", "); }; -const writeSpreadsheet = (filename, res) => __awaiter(void 0, void 0, void 0, function* () { +const writeSpreadsheet = (plainVsrs, res) => __awaiter(void 0, void 0, void 0, function* () { const workbook = new exceljs_1.default.Workbook(); workbook.creator = "PAP Inventory System"; workbook.lastModifiedBy = "Bot"; @@ -185,8 +189,6 @@ const writeSpreadsheet = (filename, res) => __awaiter(void 0, void 0, void 0, fu workbook.modified = new Date(); workbook.lastPrinted = new Date(); const worksheet = workbook.addWorksheet("New Sheet"); - const vsrs = yield vsr_1.default.find(); - const plainVsrs = vsrs.map((doc) => doc.toObject()); // Fields that we want to write to the spreadsheet. First is field name, second is display name. const fieldsToWrite = [ ["name", "Name"], @@ -236,6 +238,7 @@ const writeSpreadsheet = (filename, res) => __awaiter(void 0, void 0, void 0, fu yield workbook.xlsx.write(res); }); const bulkExportVSRS = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { + var _a, _b; try { const filename = "vsrs.xlsx"; // Set some headers on the response so the client knows that a file is attached @@ -243,7 +246,24 @@ const bulkExportVSRS = (req, res, next) => __awaiter(void 0, void 0, void 0, fun "Content-Disposition": `attachment; filename="${filename}"`, "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); - yield writeSpreadsheet(filename, res); + let vsrs; + if (req.query.vsrIds && ((_a = req.query.vsrIds.length) !== null && _a !== void 0 ? _a : 0) > 0) { + // If the "vsrIds" query parameter exists and is non-empty, then find & export all VSRs + // with an _id in the vsrIds list + // Need to convert each ID string to an ObjectId object + const vsrObjectIds = (_b = req.query.vsrIds) === null || _b === void 0 ? void 0 : _b.split(",").map((_id) => new mongodb_1.ObjectId(_id)); + vsrs = yield vsr_1.default.find({ + _id: { + $in: vsrObjectIds, + }, + }); + } + else { + // If the "vsrIds" query parameter is not provided or is empty, export all VSRs in the database + vsrs = yield vsr_1.default.find(); + } + const plainVsrs = vsrs.map((doc) => doc.toObject()); + yield writeSpreadsheet(plainVsrs, res); } catch (error) { next(error); From 57259ccdc75c3fdd2b87c1d32a92746c5c267504 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Fri, 19 Apr 2024 00:00:19 -0700 Subject: [PATCH 34/35] Test backend change to fix deployment --- backend/src/controllers/vsr.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 00b09f9..3c0cfff 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -11,6 +11,8 @@ import validationErrorParser from "src/util/validationErrorParser"; import ExcelJS from "exceljs"; import { ObjectId } from "mongodb"; +type FurnitureItemEntry = FurnitureItem & { _id: ObjectId }; + /** * Gets all VSRs in the database. Requires the user to be signed in and have * staff or admin permission. @@ -179,8 +181,6 @@ const stringifyEntry = ( } }; -type FurnitureItemEntry = FurnitureItem & { _id: ObjectId }; - /** * Formats a VSR's selected furniture items as a string */ From 8e9c77dc67ab551737b311e9fdec88707dcb6532 Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Fri, 19 Apr 2024 00:04:23 -0700 Subject: [PATCH 35/35] Attempt to fix TS error in backend --- backend/dist/src/controllers/vsr.js | 9 ++++----- backend/src/controllers/vsr.ts | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/backend/dist/src/controllers/vsr.js b/backend/dist/src/controllers/vsr.js index 12af104..2a1ba94 100644 --- a/backend/dist/src/controllers/vsr.js +++ b/backend/dist/src/controllers/vsr.js @@ -252,18 +252,17 @@ const bulkExportVSRS = (req, res, next) => __awaiter(void 0, void 0, void 0, fun // with an _id in the vsrIds list // Need to convert each ID string to an ObjectId object const vsrObjectIds = (_b = req.query.vsrIds) === null || _b === void 0 ? void 0 : _b.split(",").map((_id) => new mongodb_1.ObjectId(_id)); - vsrs = yield vsr_1.default.find({ + vsrs = (yield vsr_1.default.find({ _id: { $in: vsrObjectIds, }, - }); + })).map((doc) => doc.toObject()); } else { // If the "vsrIds" query parameter is not provided or is empty, export all VSRs in the database - vsrs = yield vsr_1.default.find(); + vsrs = (yield vsr_1.default.find()).map((doc) => doc.toObject()); } - const plainVsrs = vsrs.map((doc) => doc.toObject()); - yield writeSpreadsheet(plainVsrs, res); + yield writeSpreadsheet(vsrs, res); } catch (error) { next(error); diff --git a/backend/src/controllers/vsr.ts b/backend/src/controllers/vsr.ts index 3c0cfff..6e73bb9 100644 --- a/backend/src/controllers/vsr.ts +++ b/backend/src/controllers/vsr.ts @@ -296,7 +296,7 @@ export const bulkExportVSRS: RequestHandler = async (req, res, next) => { "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); - let vsrs; + let vsrs: VSR[]; if (req.query.vsrIds && ((req.query.vsrIds.length ?? 0) as number) > 0) { // If the "vsrIds" query parameter exists and is non-empty, then find & export all VSRs @@ -304,19 +304,19 @@ export const bulkExportVSRS: RequestHandler = async (req, res, next) => { // Need to convert each ID string to an ObjectId object const vsrObjectIds = (req.query.vsrIds as string)?.split(",").map((_id) => new ObjectId(_id)); - vsrs = await VSRModel.find({ - _id: { - $in: vsrObjectIds, - }, - }); + vsrs = ( + await VSRModel.find({ + _id: { + $in: vsrObjectIds, + }, + }) + ).map((doc) => doc.toObject()); } else { // If the "vsrIds" query parameter is not provided or is empty, export all VSRs in the database - vsrs = await VSRModel.find(); + vsrs = (await VSRModel.find()).map((doc) => doc.toObject()); } - const plainVsrs = vsrs.map((doc) => doc.toObject()); - - await writeSpreadsheet(plainVsrs, res); + await writeSpreadsheet(vsrs, res); } catch (error) { next(error); }