From 728186797f599d546c04a4f0ecf2c326bf93c063 Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:07:24 +0100 Subject: [PATCH 1/7] fix: add limit and offset for /_twake/identity/v1/lookup/diff endpoint --- .../matrix-identity-server/src/db/index.ts | 8 +- .../src/identity-server/index.test.ts | 80 +++++++++++++++++++ .../tom-server/src/identity-server/index.ts | 7 ++ .../src/identity-server/lookup/diff.ts | 28 +++++-- 4 files changed, 114 insertions(+), 9 deletions(-) diff --git a/packages/matrix-identity-server/src/db/index.ts b/packages/matrix-identity-server/src/db/index.ts index fcaf7db0..2acd9efe 100644 --- a/packages/matrix-identity-server/src/db/index.ts +++ b/packages/matrix-identity-server/src/db/index.ts @@ -41,7 +41,8 @@ type Update = ( type Get = ( table: Collections, fields: string[], - filterFields: Record> + filterFields: Record>, + order?: string ) => Promise type GetCount = ( table: Collections, @@ -202,9 +203,10 @@ class IdentityServerDb implements IdDbBackend { getHigherThan( table: Collections, fields: string[], - filterFields: Record> + filterFields: Record>, + order?: string ): Promise { - return this.db.getHigherThan(table, fields, filterFields) + return this.db.getHigherThan(table, fields, filterFields, order) } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/promise-function-async diff --git a/packages/tom-server/src/identity-server/index.test.ts b/packages/tom-server/src/identity-server/index.test.ts index cdb97ca0..3b8ef1d4 100644 --- a/packages/tom-server/src/identity-server/index.test.ts +++ b/packages/tom-server/src/identity-server/index.test.ts @@ -328,6 +328,86 @@ describe('Using Matrix Token', () => { ) }) }) + + it('should respect limit and offset', (done) => { + const matrixDb = new sqlite3.Database( + twakeServer.conf.matrix_database_host + ) + matrixDb.run( + "INSERT INTO users VALUES('@user08:example.com', '', 0)", + (err1) => { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (err1) return done(err1) + matrixDb.run( + "INSERT INTO users VALUES('@user09:example.com', '', 0)", + (err2) => { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (err2) return done(err2) + matrixDb.run( + "INSERT INTO users VALUES('@user10:example.com', '', 0)", + (err3) => { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (err3) return done(err3) + matrixDb.run( + "INSERT INTO users VALUES('@user11:example.com', '', 0)", + (err4) => { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (err4) return done(err4) + updateUsers( + twakeServer.conf, + twakeServer.idServer.db, + twakeServer.idServer.userDB, + twakeServer.logger + ) + .then(async () => { + const response = await request(app) + .post('/_twake/identity/v1/lookup/diff') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + .send({ + since: 1685071800, + fields: ['uid', 'mail'], + limit: 3, + offset: 1 + }) + expect(response.status).toBe(200) + expect( + response.body.timestamp + ).toBeGreaterThanOrEqual(timestamp) + expect(response.body).toEqual({ + deleted: [], + new: [ + { + uid: 'user08', + address: '@user08:example.com', + mail: 'user08@example.com' + }, + { + uid: 'user09', + address: '@user09:example.com', + mail: 'user09@example.com' + }, + { + uid: 'user10', + address: '@user10:example.com', + mail: 'user10@example.com' + } + ], + timestamp: response.body.timestamp + }) + + done() + }) + .catch(done) + } + ) + } + ) + } + ) + } + ) + }) }) }) diff --git a/packages/tom-server/src/identity-server/index.ts b/packages/tom-server/src/identity-server/index.ts index 2d1ed325..59c23427 100644 --- a/packages/tom-server/src/identity-server/index.ts +++ b/packages/tom-server/src/identity-server/index.ts @@ -122,9 +122,16 @@ export default class AugmentedIdentityServer extends MatrixIdentityServer { * items: * type: string * description: List of fields to return for matching users + * limit: + * type: integer + * description: Optional max number of result to return (default 30) + * offset: + * type: integer + * description: Optional offset for pagination * example: * since: 1685074279 * fields: [uid, mail] + * limit: 3 * responses: * 200: * description: Success diff --git a/packages/tom-server/src/identity-server/lookup/diff.ts b/packages/tom-server/src/identity-server/lookup/diff.ts index baccb688..0a67c22b 100644 --- a/packages/tom-server/src/identity-server/lookup/diff.ts +++ b/packages/tom-server/src/identity-server/lookup/diff.ts @@ -5,7 +5,16 @@ import { type expressAppHandler } from '../../types' const schema = { since: true, - fields: false + fields: false, + limit: false, + offset: false +} + +interface DiffQueryBody { + since: number + fields?: string[] + limit?: number + offset?: number } const diff = ( @@ -24,9 +33,14 @@ const diff = ( Utils.jsonContent(req, res, logger, (obj) => { Utils.validateParameters(res, schema, obj, logger, (data) => { tomServer.idServer.db - .getHigherThan('userHistory', ['address', 'active'], { - timestamp: (data as { since: number }).since - }) + .getHigherThan( + 'userHistory', + ['address', 'active'], + { + timestamp: (data as DiffQueryBody).since + }, + 'address' + ) .then((rows) => { const uids = rows.map((row) => { return (row.address as string).replace(/^@(.*?):.*$/, '$1') @@ -54,9 +68,11 @@ const diff = ( deleted.push({ uid, address: row.address as string }) } }) + const start = (data as DiffQueryBody).offset ?? 0 + const end = start + ((data as DiffQueryBody).limit ?? 30) Utils.send(res, 200, { - new: newUsers, - deleted, + new: newUsers.slice(start, end), + deleted: deleted.slice(start, end), timestamp }) }) From b0999e60a392535a3d8b80db31a4741c968af666 Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:08:33 +0100 Subject: [PATCH 2/7] fix: remove --skip-nx-cache in package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 28bf169a..899ff1db 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "landing" ], "scripts": { - "build": "npm run softClean && lerna run build --skip-nx-cache", + "build": "npm run softClean && lerna run build", "clean": "rimraf packages/*/dist packages/*/coverage ./node_modules/.cache/nx packages/*/example/*.js*", "doc": "node documentation/swagger.cjs", "format:check": "prettier --check .", @@ -33,7 +33,7 @@ "lint-fix": "eslint --fix packages/*/src --ext .ts", "prepare": "husky install", "softClean": "rimraf packages/*/dist", - "test": "lerna run test --skip-nx-cache" + "test": "lerna run test" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", From 58f5937c714ddbbe6807f777ef4183b653a4cf15 Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:09:38 +0100 Subject: [PATCH 3/7] chore: fix lookup documentation in tom-server package --- packages/tom-server/src/identity-server/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tom-server/src/identity-server/index.ts b/packages/tom-server/src/identity-server/index.ts index 59c23427..d49758d0 100644 --- a/packages/tom-server/src/identity-server/index.ts +++ b/packages/tom-server/src/identity-server/index.ts @@ -37,7 +37,7 @@ export default class AugmentedIdentityServer extends MatrixIdentityServer { * - Identity server * description: Looks up the Organization User IDs which match value sent * requestBody: - * description: Object containing the recovery words of the connected user + * description: Object containing detail for the search and the returned data * required: true * content: * application/json: @@ -60,7 +60,7 @@ export default class AugmentedIdentityServer extends MatrixIdentityServer { * limit: * type: integer * description: Optional max number of result to return (default 30) - * offest: + * offset: * type: integer * description: Optional offset for pagination * required: From 2f82c71bc9a22b9ce8e1d8b9c5a194507bd41fb6 Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:10:27 +0100 Subject: [PATCH 4/7] feat: add hashes_rate_limit in tom-server package configuration --- packages/tom-server/src/config.json | 1 + server.mjs | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/tom-server/src/config.json b/packages/tom-server/src/config.json index bc4cf645..35748a56 100644 --- a/packages/tom-server/src/config.json +++ b/packages/tom-server/src/config.json @@ -11,6 +11,7 @@ "database_user": "", "database_vacuum_delay": 3600, "federation_servers": null, + "hashes_rate_limit": 100, "is_federation_server": false, "jitsiBaseUrl": "", "jitsiJwtAlgorithm": "HS256", diff --git a/server.mjs b/server.mjs index 471a4dd6..6c04dd14 100644 --- a/server.mjs +++ b/server.mjs @@ -29,6 +29,7 @@ const conf = { federation_servers: process.env.FEDERATION_SERVERS ? process.env.FEDERATION_SERVERS.split(/[,\s]+/) : [], + hashes_rate_limit: process.env.HASHES_RATE_LIMIT, is_federation_server: false, jitsiBaseUrl: process.env.JITSI_BASE_URL, jitsiJwtAlgorithm: process.env.JITSI_JWT_ALGORITHM, From 0227cad57a8e5eabfa53bce23dd3b60a39c39a73 Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:11:16 +0100 Subject: [PATCH 5/7] feat: add hashes_rate_limit in matrix-identity-server package --- .../matrix-identity-server/src/config.json | 1 + .../matrix-identity-server/src/index.test.ts | 758 +++++++++++------- packages/matrix-identity-server/src/index.ts | 12 + .../src/lookup/index.ts | 11 +- packages/matrix-identity-server/src/types.ts | 1 + 5 files changed, 487 insertions(+), 296 deletions(-) diff --git a/packages/matrix-identity-server/src/config.json b/packages/matrix-identity-server/src/config.json index b8bb59c1..d66700a4 100644 --- a/packages/matrix-identity-server/src/config.json +++ b/packages/matrix-identity-server/src/config.json @@ -11,6 +11,7 @@ "database_user": "", "database_vacuum_delay": 3600, "federation_servers": null, + "hashes_rate_limit": 100, "is_federation_server": false, "key_delay": 3600, "keys_depth": 5, diff --git a/packages/matrix-identity-server/src/index.test.ts b/packages/matrix-identity-server/src/index.test.ts index 9dac0e74..908004b1 100644 --- a/packages/matrix-identity-server/src/index.test.ts +++ b/packages/matrix-identity-server/src/index.test.ts @@ -22,9 +22,10 @@ process.env.TWAKE_IDENTITY_SERVER_CONF = './src/__testData__/registerConf.json' let idServer: IdServer let app: express.Application let validToken: string +let conf: Config beforeAll((done) => { - const conf: Config = { + conf = { ...defaultConfig, database_engine: 'sqlite', base_url: 'http://example.com/', @@ -40,28 +41,17 @@ beforeAll((done) => { } buildUserDB(conf) .then(() => { - idServer = new IdServer() - app = express() - - idServer.ready - .then(() => { - Object.keys(idServer.api.get).forEach((k) => { - app.get(k, idServer.api.get[k]) - }) - Object.keys(idServer.api.post).forEach((k) => { - app.post(k, idServer.api.post[k]) - }) - done() - }) - .catch((e) => { - done(e) - }) + done() }) .catch((e) => { done(e) }) }) +afterAll(() => { + fs.unlinkSync('src/__testData__/test.db') +}) + beforeEach(() => { jest.clearAllMocks() jest.mock('node-fetch', () => jest.fn()) @@ -72,312 +62,519 @@ beforeEach(() => { })) }) -afterAll(() => { - fs.unlinkSync('src/__testData__/test.db') - idServer.cleanJobs() -}) +describe('Error on server start', () => { + process.env.HASHES_RATE_LIMIT = 'falsy_number' -test('Reject unimplemented endpoint with 404', async () => { - const response = await request(app).get('/_matrix/unknown') - expect(response.statusCode).toBe(404) -}) - -test('Reject bad method with 405', async () => { - const response = await request(app).get( - '/_matrix/identity/v2/account/register' - ) - expect(response.statusCode).toBe(405) + it('should display message error about hashes rate limit value', () => { + expect(() => { + idServer = new IdServer() + }).toThrow( + new Error( + 'hashes_rate_limit must be a number or a string representing a number' + ) + ) + delete process.env.HASHES_RATE_LIMIT + }) }) -test('/_matrix/identity/v2 (status)', async () => { - const response = await request(app).get('/_matrix/identity/v2') - expect(response.statusCode).toBe(200) -}) +describe('Use configuration file', () => { + beforeAll((done) => { + idServer = new IdServer() + app = express() -test('/_matrix/identity/versions', async () => { - const response = await request(app).get('/_matrix/identity/versions') - expect(response.statusCode).toBe(200) -}) + idServer.ready + .then(() => { + Object.keys(idServer.api.get).forEach((k) => { + app.get(k, idServer.api.get[k]) + }) + Object.keys(idServer.api.post).forEach((k) => { + app.post(k, idServer.api.post[k]) + }) + done() + }) + .catch((e) => { + done(e) + }) + }) -test('/_matrix/identity/v2/terms', async () => { - const response = await request(app).get('/_matrix/identity/v2/terms') - expect(response.statusCode).toBe(200) -}) + afterAll(() => { + idServer.cleanJobs() + }) -describe('/_matrix/identity/v2/account/register', () => { - it('should require all parameters', async () => { - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .send({ access_token: 'bar' }) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(400) - expect(response.body.errcode).toEqual('M_MISSING_PARAMS') + test('Reject unimplemented endpoint with 404', async () => { + const response = await request(app).get('/_matrix/unknown') + expect(response.statusCode).toBe(404) }) - it('should reject bad json', async () => { - const spyOnLoggerError = jest.spyOn(idServer.logger, 'error') - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .send('{"access_token": "bar"') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json') - expect(response.statusCode).toBe(400) - expect(spyOnLoggerError).toHaveBeenCalledWith( - 'JSON error', - expect.anything() + + test('Reject bad method with 405', async () => { + const response = await request(app).get( + '/_matrix/identity/v2/account/register' ) + expect(response.statusCode).toBe(405) }) - it('should accept valid request', async () => { - const mockResponse = Promise.resolve({ - ok: true, - status: 200, - json: () => { - return { - sub: '@dwho:example.com', - 'm.server': 'matrix.example.com:8448' - } - } - }) - // @ts-expect-error mock is unknown - fetch.mockImplementation(async () => await mockResponse) - await mockResponse - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .send({ - access_token: 'bar', - expires_in: 86400, - matrix_server_name: 'matrix.example.com', - token_type: 'Bearer' - }) - .set('Accept', 'application/json') + + test('/_matrix/identity/v2 (status)', async () => { + const response = await request(app).get('/_matrix/identity/v2') expect(response.statusCode).toBe(200) - expect(response.body.token).toMatch(/^[a-zA-Z0-9]{64}$/) - validToken = response.body.token }) - it('should log additional parameters', async () => { - const spyOnLoggerWarn = jest.spyOn(idServer.logger, 'warn') - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .set('Content-Type', 'application/x-www-form-urlencoded') - .send( - querystring.stringify({ - access_token: 'bar', - expires_in: 86400, - matrix_server_name: 'matrix.example.com', - token_type: 'Bearer', - additional_param: 'value' - }) - ) - .set('Accept', 'application/json') + + test('/_matrix/identity/versions', async () => { + const response = await request(app).get('/_matrix/identity/versions') expect(response.statusCode).toBe(200) - expect(spyOnLoggerWarn).toHaveBeenCalledWith('Additional parameters', [ - 'additional_param' - ]) }) - it('should reject missing "sub" from server', async () => { - const mockResponse = Promise.resolve({ - ok: true, - status: 200, - json: () => { - return { - email: 'dwho@example.com', - 'm.server': 'matrix.example.com:8448' - } - } - }) - // @ts-expect-error mock is unknown - fetch.mockImplementation(async () => await mockResponse) - await mockResponse - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .send({ - access_token: 'bar', - expires_in: 86400, - matrix_server_name: 'matrix.example.com', - token_type: 'Bearer' - }) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) - }) - it('should reject bad "sub" from server', async () => { - const mockResponse = Promise.resolve({ - ok: true, - status: 200, - json: () => { - return { - sub: 'dwho@example.com', - 'm.server': 'matrix.example.com:8448' - } - } - }) - // @ts-expect-error mock is unknown - fetch.mockImplementation(async () => await mockResponse) - await mockResponse - const response = await request(app) - .post('/_matrix/identity/v2/account/register') - .send({ - access_token: 'bar', - expires_in: 86400, - matrix_server_name: 'matrix.example.com', - token_type: 'Bearer' - }) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) - }) -}) -describe('/_matrix/identity/v2/account', () => { - it('should reject missing token (', async () => { - const response = await request(app) - .get('/_matrix/identity/v2/account') - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) - }) - it('should reject token that mismatch regex', async () => { - const response = await request(app) - .get('/_matrix/identity/v2/account') - .set('Authorization', 'Bearer zzzzzzz') - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) - }) - it('should reject expired or invalid token', async () => { - const response = await request(app) - .get('/_matrix/identity/v2/account') - .set('Authorization', `Bearer ${randomString(64)}`) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) + test('/_matrix/identity/v2/terms', async () => { + const response = await request(app).get('/_matrix/identity/v2/terms') + expect(response.statusCode).toBe(200) }) -}) -describe('/_matrix/identity/v2/validate/email', () => { - let sid: string, token: string - describe('/_matrix/identity/v2/validate/email/requestToken', () => { - it('should refuse to register an invalid email', async () => { + describe('/_matrix/identity/v2/account/register', () => { + it('should require all parameters', async () => { const response = await request(app) - .post('/_matrix/identity/v2/validate/email/requestToken') - .set('Authorization', `Bearer ${validToken}`) + .post('/_matrix/identity/v2/account/register') + .send({ access_token: 'bar' }) .set('Accept', 'application/json') - .send({ - client_secret: 'mysecret', - email: '@yadd:debian.org', - next_link: 'http://localhost:8090', - send_attempt: 1 - }) expect(response.statusCode).toBe(400) - expect(sendMailMock).not.toHaveBeenCalled() + expect(response.body.errcode).toEqual('M_MISSING_PARAMS') }) - it('should refuse an invalid secret', async () => { + it('should reject bad json', async () => { + const spyOnLoggerError = jest.spyOn(idServer.logger, 'error') const response = await request(app) - .post('/_matrix/identity/v2/validate/email/requestToken') - .set('Authorization', `Bearer ${validToken}`) + .post('/_matrix/identity/v2/account/register') + .send('{"access_token": "bar"') + .set('Content-Type', 'application/json') .set('Accept', 'application/json') - .send({ - client_secret: 'my', - email: 'yadd@debian.org', - next_link: 'http://localhost:8090', - send_attempt: 1 - }) expect(response.statusCode).toBe(400) - expect(sendMailMock).not.toHaveBeenCalled() + expect(spyOnLoggerError).toHaveBeenCalledWith( + 'JSON error', + expect.anything() + ) }) - it('should accept valid email registration query', async () => { + it('should accept valid request', async () => { + const mockResponse = Promise.resolve({ + ok: true, + status: 200, + json: () => { + return { + sub: '@dwho:example.com', + 'm.server': 'matrix.example.com:8448' + } + } + }) + // @ts-expect-error mock is unknown + fetch.mockImplementation(async () => await mockResponse) + await mockResponse const response = await request(app) - .post('/_matrix/identity/v2/validate/email/requestToken') - .set('Authorization', `Bearer ${validToken}`) - .set('Accept', 'application/json') + .post('/_matrix/identity/v2/account/register') .send({ - client_secret: 'mysecret', - email: 'xg@xnr.fr', - next_link: 'http://localhost:8090', - send_attempt: 1 + access_token: 'bar', + expires_in: 86400, + matrix_server_name: 'matrix.example.com', + token_type: 'Bearer' }) + .set('Accept', 'application/json') expect(response.statusCode).toBe(200) - expect(sendMailMock.mock.calls[0][0].to).toBe('xg@xnr.fr') - expect(sendMailMock.mock.calls[0][0].raw).toMatch( - /token=([a-zA-Z0-9]{64})&client_secret=mysecret&sid=([a-zA-Z0-9]{64})/ - ) - token = RegExp.$1 - sid = RegExp.$2 + expect(response.body.token).toMatch(/^[a-zA-Z0-9]{64}$/) + validToken = response.body.token }) - }) - describe('/_matrix/identity/v2/validate/email/submitToken', () => { - /* Works but disabled to avoid invalidate previous token - it('should refuse mismatch registration parameters', async () => { + it('should log additional parameters', async () => { + const spyOnLoggerWarn = jest.spyOn(idServer.logger, 'warn') const response = await request(app) - .get('/_matrix/identity/v2/validate/email/submitToken') - .query({ - token, - client_secret: 'mysecret2', - sid - }) + .post('/_matrix/identity/v2/account/register') + .set('Content-Type', 'application/x-www-form-urlencoded') + .send( + querystring.stringify({ + access_token: 'bar', + expires_in: 86400, + matrix_server_name: 'matrix.example.com', + token_type: 'Bearer', + additional_param: 'value' + }) + ) .set('Accept', 'application/json') - expect(response.statusCode).toBe(400) + expect(response.statusCode).toBe(200) + expect(spyOnLoggerWarn).toHaveBeenCalledWith('Additional parameters', [ + 'additional_param' + ]) }) - */ - it('should reject registration with a missing parameter', async () => { + it('should reject missing "sub" from server', async () => { + const mockResponse = Promise.resolve({ + ok: true, + status: 200, + json: () => { + return { + email: 'dwho@example.com', + 'm.server': 'matrix.example.com:8448' + } + } + }) + // @ts-expect-error mock is unknown + fetch.mockImplementation(async () => await mockResponse) + await mockResponse const response = await request(app) - .post('/_matrix/identity/v2/validate/email/submitToken') + .post('/_matrix/identity/v2/account/register') .send({ - token, - sid + access_token: 'bar', + expires_in: 86400, + matrix_server_name: 'matrix.example.com', + token_type: 'Bearer' }) .set('Accept', 'application/json') - expect(response.statusCode).toBe(400) + expect(response.statusCode).toBe(401) }) - it('should accept to register mail after click', async () => { + it('should reject bad "sub" from server', async () => { + const mockResponse = Promise.resolve({ + ok: true, + status: 200, + json: () => { + return { + sub: 'dwho@example.com', + 'm.server': 'matrix.example.com:8448' + } + } + }) + // @ts-expect-error mock is unknown + fetch.mockImplementation(async () => await mockResponse) + await mockResponse const response = await request(app) - .get('/_matrix/identity/v2/validate/email/submitToken') - .query({ - token, - client_secret: 'mysecret', - sid + .post('/_matrix/identity/v2/account/register') + .send({ + access_token: 'bar', + expires_in: 86400, + matrix_server_name: 'matrix.example.com', + token_type: 'Bearer' }) .set('Accept', 'application/json') - expect(response.body).toEqual({ success: true }) - expect(response.statusCode).toBe(200) + expect(response.statusCode).toBe(401) }) - it('should refuse a second registration', async () => { + }) + + describe('/_matrix/identity/v2/account', () => { + it('should reject missing token (', async () => { const response = await request(app) - .get('/_matrix/identity/v2/validate/email/submitToken') - .query({ - token, - client_secret: 'mysecret', - sid - }) + .get('/_matrix/identity/v2/account') .set('Accept', 'application/json') - expect(response.statusCode).toBe(400) + expect(response.statusCode).toBe(401) + }) + it('should reject token that mismatch regex', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/account') + .set('Authorization', 'Bearer zzzzzzz') + .set('Accept', 'application/json') + expect(response.statusCode).toBe(401) + }) + it('should reject expired or invalid token', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/account') + .set('Authorization', `Bearer ${randomString(64)}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(401) }) }) -}) -describe('/_matrix/identity/v2/lookup', () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let pepper = '' - describe('/_matrix/identity/v2/hash_details', () => { - it('should require authentication', async () => { - await idServer.cronTasks?.ready + describe('/_matrix/identity/v2/validate/email', () => { + let sid: string, token: string + describe('/_matrix/identity/v2/validate/email/requestToken', () => { + it('should refuse to register an invalid email', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/validate/email/requestToken') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + .send({ + client_secret: 'mysecret', + email: '@yadd:debian.org', + next_link: 'http://localhost:8090', + send_attempt: 1 + }) + expect(response.statusCode).toBe(400) + expect(sendMailMock).not.toHaveBeenCalled() + }) + it('should refuse an invalid secret', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/validate/email/requestToken') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + .send({ + client_secret: 'my', + email: 'yadd@debian.org', + next_link: 'http://localhost:8090', + send_attempt: 1 + }) + expect(response.statusCode).toBe(400) + expect(sendMailMock).not.toHaveBeenCalled() + }) + it('should accept valid email registration query', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/validate/email/requestToken') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + .send({ + client_secret: 'mysecret', + email: 'xg@xnr.fr', + next_link: 'http://localhost:8090', + send_attempt: 1 + }) + expect(response.statusCode).toBe(200) + expect(sendMailMock.mock.calls[0][0].to).toBe('xg@xnr.fr') + expect(sendMailMock.mock.calls[0][0].raw).toMatch( + /token=([a-zA-Z0-9]{64})&client_secret=mysecret&sid=([a-zA-Z0-9]{64})/ + ) + token = RegExp.$1 + sid = RegExp.$2 + }) + }) + describe('/_matrix/identity/v2/validate/email/submitToken', () => { + /* Works but disabled to avoid invalidate previous token + it('should refuse mismatch registration parameters', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/validate/email/submitToken') + .query({ + token, + client_secret: 'mysecret2', + sid + }) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + */ + it('should reject registration with a missing parameter', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/validate/email/submitToken') + .send({ + token, + sid + }) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + it('should accept to register mail after click', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/validate/email/submitToken') + .query({ + token, + client_secret: 'mysecret', + sid + }) + .set('Accept', 'application/json') + expect(response.body).toEqual({ success: true }) + expect(response.statusCode).toBe(200) + }) + it('should refuse a second registration', async () => { + const response = await request(app) + .get('/_matrix/identity/v2/validate/email/submitToken') + .query({ + token, + client_secret: 'mysecret', + sid + }) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + }) + }) + + describe('/_matrix/identity/v2/lookup', () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let pepper = '' + describe('/_matrix/identity/v2/hash_details', () => { + it('should require authentication', async () => { + await idServer.cronTasks?.ready + const response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Accept', 'application/json') + expect(response.statusCode).toBe(401) + }) + it('should display algorithms and pepper', async () => { + await idServer.cronTasks?.ready + const response = await request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.body).toHaveProperty('lookup_pepper') + expect(response.statusCode).toBe(200) + pepper = response.body.lookup_pepper + expect(response.body.algorithms).toEqual(supportedHashes) + }) + }) + + describe('/_matrix/identity/v2/lookup', () => { + it('should send an error if "addresses" is not an array', async () => { + await idServer.cronTasks?.ready + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .send({ + addresses: 3, + algorithm: 'sha256', + pepper + }) + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + + it('should send an error if one address is not a string', async () => { + const hash = new Hash() + await hash.ready + await idServer.cronTasks?.ready + const phoneHash = hash.sha256(`33612345678 msisdn ${pepper}`) + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .send({ + addresses: [phoneHash, 3], + algorithm: 'sha256', + pepper + }) + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + + it('should send an error if exceeds hashes limit', async () => { + const hash = new Hash() + await hash.ready + await idServer.cronTasks?.ready + const phoneHash = hash.sha256(`33612345678 msisdn ${pepper}`) + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .send({ + addresses: Array.from({ length: 101 }, (_, i) => phoneHash), + algorithm: 'sha256', + pepper + }) + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) + + it('should return Matrix id', async () => { + const hash = new Hash() + await hash.ready + await idServer.cronTasks?.ready + const phoneHash = hash.sha256(`33612345678 msisdn ${pepper}`) + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .send({ + addresses: [phoneHash], + algorithm: 'sha256', + pepper + }) + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(200) + expect(response.body.mappings[phoneHash]).toBe('@dwho:matrix.org') + }) + }) + }) + + describe('/_matrix/identity/v2/account', () => { + it('should accept valid token in headers', async () => { const response = await request(app) - .get('/_matrix/identity/v2/hash_details') + .get('/_matrix/identity/v2/account') + .set('Authorization', `Bearer ${validToken}`) .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) + expect(response.statusCode).toBe(200) }) - it('should display algorithms and pepper', async () => { - await idServer.cronTasks?.ready + it('should accept valid token in query parameters', async () => { const response = await request(app) - .get('/_matrix/identity/v2/hash_details') + .get('/_matrix/identity/v2/account') + .query({ access_token: validToken }) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(200) + }) + it('should logout (/_matrix/identity/v2/account/logout)', async () => { + let response = await request(app) + .post('/_matrix/identity/v2/account/logout') .set('Authorization', `Bearer ${validToken}`) .set('Accept', 'application/json') - expect(response.body).toHaveProperty('lookup_pepper') expect(response.statusCode).toBe(200) - pepper = response.body.lookup_pepper - expect(response.body.algorithms).toEqual(supportedHashes) + response = await request(app) + .get('/_matrix/identity/v2/account') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(401) }) }) +}) + +describe('Use environment variables', () => { + describe('For hashes rate limit', () => { + let pepper: string + const hash = new Hash() + + beforeAll((done) => { + process.env.HASHES_RATE_LIMIT = '4' + idServer = new IdServer() + app = express() + idServer.ready + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then(() => { + Object.keys(idServer.api.get).forEach((k) => { + app.get(k, idServer.api.get[k]) + }) + Object.keys(idServer.api.post).forEach((k) => { + app.post(k, idServer.api.post[k]) + }) + const mockResponse = Promise.resolve({ + ok: true, + status: 200, + json: () => { + return { + sub: '@dwho:example.com', + 'm.server': 'matrix.example.com:8448' + } + } + }) + // @ts-expect-error mock is unknown + fetch.mockImplementation(async () => await mockResponse) + return request(app) + .post('/_matrix/identity/v2/account/register') + .send({ + access_token: 'bar', + expires_in: 86400, + matrix_server_name: 'matrix.example.com', + token_type: 'Bearer' + }) + }) + .then((response) => { + validToken = response.body.token + return request(app) + .get('/_matrix/identity/v2/hash_details') + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + }) + // eslint-disable-next-line @typescript-eslint/promise-function-async + .then((response) => { + pepper = response.body.lookup_pepper as string + return hash.ready + }) + .then(() => { + done() + }) + .catch((e) => { + done(e) + }) + }) + + afterAll(() => { + idServer.cleanJobs() + delete process.env.HASHES_RATE_LIMIT + }) + + it('should send an error if exceeds hashes limit', async () => { + const phoneHash = hash.sha256(`33612345678 msisdn ${pepper}`) + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .send({ + addresses: Array.from({ length: 5 }, (_, i) => phoneHash), + algorithm: 'sha256', + pepper + }) + .set('Authorization', `Bearer ${validToken}`) + .set('Accept', 'application/json') + expect(response.statusCode).toBe(400) + }) - describe('/_matrix/identity/v2/lookup', () => { it('should return Matrix id', async () => { - const hash = new Hash() - await hash.ready - await idServer.cronTasks?.ready const phoneHash = hash.sha256(`33612345678 msisdn ${pepper}`) const response = await request(app) .post('/_matrix/identity/v2/lookup') @@ -393,32 +590,3 @@ describe('/_matrix/identity/v2/lookup', () => { }) }) }) - -describe('/_matrix/identity/v2/account', () => { - it('should accept valid token in headers', async () => { - const response = await request(app) - .get('/_matrix/identity/v2/account') - .set('Authorization', `Bearer ${validToken}`) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(200) - }) - it('should accept valid token in query parameters', async () => { - const response = await request(app) - .get('/_matrix/identity/v2/account') - .query({ access_token: validToken }) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(200) - }) - it('should logout (/_matrix/identity/v2/account/logout)', async () => { - let response = await request(app) - .post('/_matrix/identity/v2/account/logout') - .set('Authorization', `Bearer ${validToken}`) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(200) - response = await request(app) - .get('/_matrix/identity/v2/account') - .set('Authorization', `Bearer ${validToken}`) - .set('Accept', 'application/json') - expect(response.statusCode).toBe(401) - }) -}) diff --git a/packages/matrix-identity-server/src/index.ts b/packages/matrix-identity-server/src/index.ts index ac2c2b14..6476efe9 100644 --- a/packages/matrix-identity-server/src/index.ts +++ b/packages/matrix-identity-server/src/index.ts @@ -107,6 +107,17 @@ export default class MatrixIdentityServer { : [] this._logger = logger ?? getLogger(this.conf as unknown as LoggerConfig) try { + if ( + this.conf.hashes_rate_limit != null && + typeof this.conf.hashes_rate_limit !== 'number' + ) { + this.conf.hashes_rate_limit = parseInt(this.conf.hashes_rate_limit) + if (Number.isNaN(this.conf.hashes_rate_limit)) { + throw new Error( + 'hashes_rate_limit must be a number or a string representing a number' + ) + } + } // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions this.cache = this.conf.cache_engine ? new Cache(this.conf) : undefined const db = (this.db = new IdentityServerDb(this.conf, this.logger)) @@ -170,6 +181,7 @@ export default class MatrixIdentityServer { .catch(reject) }) } catch (e) { + this.logger.error(e) this.logger.close() throw e } diff --git a/packages/matrix-identity-server/src/lookup/index.ts b/packages/matrix-identity-server/src/lookup/index.ts index 0651b388..0a43229f 100644 --- a/packages/matrix-identity-server/src/lookup/index.ts +++ b/packages/matrix-identity-server/src/lookup/index.ts @@ -18,7 +18,16 @@ const lookup = (idServer: MatrixIdentityServer): expressAppHandler => { idServer.authenticate(req, res, (data, id) => { jsonContent(req, res, idServer.logger, (obj) => { validateParameters(res, schema, obj, idServer.logger, (obj) => { - if (typeof (obj as { addresses: string[] }).addresses !== 'object') { + if ( + !( + Array.isArray((obj as { addresses: string[] }).addresses) && + (obj as { addresses: string[] }).addresses.every( + (address) => typeof address === 'string' + ) && + (obj as { addresses: string[] }).addresses.length <= + (idServer.conf.hashes_rate_limit as number) + ) + ) { /* istanbul ignore next */ send(res, 400, errMsg('invalidParam')) } else { diff --git a/packages/matrix-identity-server/src/types.ts b/packages/matrix-identity-server/src/types.ts index f86f250b..08b0e521 100644 --- a/packages/matrix-identity-server/src/types.ts +++ b/packages/matrix-identity-server/src/types.ts @@ -16,6 +16,7 @@ export interface Config { database_user?: string database_vacuum_delay: number federation_servers?: string[] | null + hashes_rate_limit?: number is_federation_server: boolean key_delay: number keys_depth: number From a86ab90475701cdde5666d6416b09c29385b433a Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:11:36 +0100 Subject: [PATCH 6/7] feat: add hashes_rate_limit in federation-server package This closes #1 --- packages/federation-server/server.mjs | 1 + packages/federation-server/src/config.json | 4 + packages/federation-server/src/index.test.ts | 78 ++++++++++++++++--- .../src/middlewares/validation.ts | 34 +++++--- .../federation-server/src/routes/routes.ts | 2 +- 5 files changed, 98 insertions(+), 21 deletions(-) diff --git a/packages/federation-server/server.mjs b/packages/federation-server/server.mjs index 46420bfc..60949215 100644 --- a/packages/federation-server/server.mjs +++ b/packages/federation-server/server.mjs @@ -15,6 +15,7 @@ const conf = { database_name: process.env.DATABASE_NAME, database_user: process.env.DATABASE_USER, database_password: process.env.DATABASE_PASSWORD, + hashes_rate_limit: process.env.HASHES_RATE_LIMIT, is_federation_server: true, ldap_base: process.env.LDAP_BASE, ldap_filter: process.env.LDAP_FILTER, diff --git a/packages/federation-server/src/config.json b/packages/federation-server/src/config.json index 39bc36c8..38caa74d 100644 --- a/packages/federation-server/src/config.json +++ b/packages/federation-server/src/config.json @@ -7,8 +7,10 @@ "database_host": "./tokens.db", "database_name": "", "database_password": "", + "database_ssl": false, "database_user": "", "database_vacuum_delay": 3600, + "hashes_rate_limit": 100, "is_federation_server": true, "key_delay": 3600, "keys_depth": 5, @@ -23,6 +25,7 @@ "matrix_database_host": null, "matrix_database_name": null, "matrix_database_password": null, + "matrix_database_ssl": false, "matrix_database_user": null, "pepperCron": "0 0 * * *", "policies": null, @@ -40,6 +43,7 @@ "userdb_host": "./tokens.db", "userdb_name": "", "userdb_password": "", + "userdb_ssl": false, "userdb_user": "", "template_dir": "./templates", "trust_x_forwarded_for": false, diff --git a/packages/federation-server/src/index.test.ts b/packages/federation-server/src/index.test.ts index 5da8cb3c..421217e1 100644 --- a/packages/federation-server/src/index.test.ts +++ b/packages/federation-server/src/index.test.ts @@ -1875,7 +1875,7 @@ describe('Federation server', () => { ) }) - it('should send an error if "addresses" is not a string array', async () => { + it('should send an error if "addresses" is not an array', async () => { const response = await request(app) .post('/_matrix/identity/v2/lookup') .set('Accept', 'application/json') @@ -1901,12 +1901,7 @@ describe('Federation server', () => { .set('Accept', 'application/json') .set('Authorization', `Bearer ${authToken}`) .send({ - addresses: [ - '@dwho:example.com', - '@rtyler:example.com', - 2, - '@msmith:example.com' - ], + addresses: ['hash1', 'hash2', 2, 'hash3'], algorithm: 'sha256', pepper: 'test_pepper' }) @@ -1921,6 +1916,27 @@ describe('Federation server', () => { ) }) + it('should send an error if exceeds hashes limit', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookup') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + addresses: Array.from({ length: 101 }, (_, i) => `hash${i}`), + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Adresses limit of 100 exceeded (property: addresses)' + }) + ) + }) + it('should send an error if getting hashes from db fails', async () => { jest .spyOn(federationServer.db, 'get') @@ -1934,7 +1950,7 @@ describe('Federation server', () => { .set('Accept', 'application/json') .set('Authorization', `Bearer ${authToken}`) .send({ - addresses: ['@dwho:example.com', '@rtyler:example.com'], + addresses: ['hash1', 'hash2'], algorithm: 'sha256', pepper: 'test_pepper' }) @@ -1961,7 +1977,7 @@ describe('Federation server', () => { .set('Accept', 'application/json') .set('Authorization', `Bearer ${authToken}`) .send({ - addresses: ['@dwho:example.com', '@rtyler:example.com'], + addresses: ['hash1', 'hash2'], algorithm: 'sha256', pepper: 'test_pepper' }) @@ -1990,7 +2006,7 @@ describe('Federation server', () => { .set('Accept', 'application/json') .set('Authorization', `Bearer ${authToken}`) .send({ - addresses: ['@dwho:example.com', '@rtyler:example.com'], + addresses: ['hash1', 'hash2'], algorithm: 'sha256', pepper: 'test_pepper' }) @@ -2161,6 +2177,48 @@ describe('Federation server', () => { ) }) + it('should send an error if "mappings" values is not an array', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + mappings: { 'test.example.com': 2 }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Mappings object values are not string arrays (property: mappings)' + }) + ) + }) + + it('should send an error if one address is not a string', async () => { + const response = await request(app) + .post('/_matrix/identity/v2/lookups') + .set('Accept', 'application/json') + .set('Authorization', `Bearer ${authToken}`) + .send({ + mappings: { 'test.example.com': ['hash1', 'hash2', 2, 'hash3'] }, + algorithm: 'sha256', + pepper: 'test_pepper' + }) + + expect(response.statusCode).toEqual(400) + expect(JSON.stringify(response.body)).toEqual( + JSON.stringify({ + errcode: 'M_INVALID_PARAM', + error: + 'Error field: Mappings object values are not string arrays (property: mappings)' + }) + ) + }) + it('should send an error if getting pepper in keys table fails', async () => { jest .spyOn(federationServer.db, 'get') diff --git a/packages/federation-server/src/middlewares/validation.ts b/packages/federation-server/src/middlewares/validation.ts index d6d0007d..7b0aeb26 100644 --- a/packages/federation-server/src/middlewares/validation.ts +++ b/packages/federation-server/src/middlewares/validation.ts @@ -1,19 +1,22 @@ -import { body } from 'express-validator' +import { body, type ValidationChain } from 'express-validator' export const commonValidators = [ body('algorithm').exists().isString(), body('pepper').exists().isString() ] -export const lookupValidator = body('addresses') - .exists() - .isArray() - .custom((value, { req }) => { - if ((value as any[]).some((address) => typeof address !== 'string')) { - throw new Error('One of the address is not a string') - } - return true - }) +export const lookupValidator = (hashesLimit: number): ValidationChain => + body('addresses') + .exists() + .isArray() + .custom((value, { req }) => { + if ((value as any[]).some((address) => typeof address !== 'string')) { + throw new Error('One of the address is not a string') + } else if ((value as string[]).length > hashesLimit) { + throw new Error(`Adresses limit of ${hashesLimit} exceeded`) + } + return true + }) export const lookupsValidator = [ body('pepper').exists().isString(), @@ -24,6 +27,17 @@ export const lookupsValidator = [ if (Object.keys(value).length > 1) { throw new Error('Only one server address is allowed') } + if ( + Object.keys(value).length === 1 && + !( + Array.isArray(Object.values(value)[0]) && + (Object.values(value)[0] as any[]).every( + (hash) => typeof hash === 'string' + ) + ) + ) { + throw new Error('Mappings object values are not string arrays') + } return true }) ] diff --git a/packages/federation-server/src/routes/routes.ts b/packages/federation-server/src/routes/routes.ts index ea2163ff..ad0d7a5d 100644 --- a/packages/federation-server/src/routes/routes.ts +++ b/packages/federation-server/src/routes/routes.ts @@ -139,7 +139,7 @@ export default ( logger ), ...commonValidators, - lookupValidator, + lookupValidator(conf.hashes_rate_limit as number), lookup(conf, db), errorMiddleware ) From d1920406912058cea6478780aee7b69c21df771d Mon Sep 17 00:00:00 2001 From: Jordy Cabannes Date: Fri, 5 Jan 2024 11:11:56 +0100 Subject: [PATCH 7/7] chore: update package-lock.json --- package-lock.json | 1193 +++++++++++++++++++++------------------------ 1 file changed, 567 insertions(+), 626 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b77e561..b6c7a429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -283,9 +283,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -293,10 +293,10 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", + "@babel/helpers": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -425,9 +425,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -708,13 +708,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" }, "engines": { @@ -851,9 +851,9 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1171,9 +1171,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -2012,9 +2012,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", + "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", @@ -2023,7 +2023,7 @@ "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -2044,7 +2044,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", @@ -2092,9 +2092,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2174,9 +2174,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2200,9 +2200,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -3733,187 +3733,6 @@ "node": ">=10" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@mapbox/node-pre-gyp/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==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -5829,9 +5648,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5997,9 +5816,9 @@ } }, "node_modules/@types/hast": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", - "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", + "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", "dev": true, "dependencies": { "@types/unist": "^2" @@ -6114,6 +5933,12 @@ "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -6148,9 +5973,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6201,9 +6026,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -6213,9 +6038,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "version": "18.2.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz", + "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6314,9 +6139,9 @@ } }, "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", - "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6329,12 +6154,13 @@ "dev": true }, "node_modules/@types/superagent": { - "version": "4.1.24", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.24.tgz", - "integrity": "sha512-mEafCgyKiMFin24SDzWN7yAADt4gt6YawFiNMp0QS5ZPboORfyxFt0s3VzJKhTaKg9py/4FUmrHLTNfJKt9Rbw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.1.tgz", + "integrity": "sha512-YQyEXA4PgCl7EVOoSAS3o0fyPFU6erv5mMixztQYe1bqbWmmn8c+IrqoxjQeZe4MgwXikgcaZPiI/DsbmOVlzA==", "dev": true, "dependencies": { - "@types/cookiejar": "*", + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", "@types/node": "*" } }, @@ -6740,9 +6566,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -7270,9 +7096,9 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -7348,12 +7174,12 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -7563,7 +7389,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -7636,7 +7462,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" @@ -7646,7 +7471,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, + "devOptional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7784,7 +7609,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -8113,9 +7938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001571", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", - "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", + "version": "1.0.30001574", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", + "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", "dev": true, "funding": [ { @@ -8844,9 +8669,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", - "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, "dependencies": { "browserslist": "^4.22.2" @@ -9131,7 +8956,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, + "devOptional": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -9146,7 +8971,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" }, @@ -9212,6 +9037,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -9634,9 +9468,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.615", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", - "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", + "version": "1.4.622", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.622.tgz", + "integrity": "sha512-GZ47DEy0Gm2Z8RVG092CkFvX7SdotG57c4YZOe8W8qD4rOmk3plgeNmiLVRHP/Liqj1wRiY3uUUod9vb9hnxZA==", "dev": true }, "node_modules/emittery": { @@ -9704,7 +9538,7 @@ "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, + "devOptional": true, "dependencies": { "once": "^1.4.0" } @@ -11209,6 +11043,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -11504,7 +11347,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, "optional": true }, "node_modules/filelist": { @@ -11678,9 +11520,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -11815,7 +11657,7 @@ "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==", - "dev": true + "devOptional": true }, "node_modules/fs-extra": { "version": "10.1.0", @@ -12248,6 +12090,12 @@ "ini": "^1.3.2" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "optional": true + }, "node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -12767,7 +12615,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -12910,7 +12758,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "devOptional": true }, "node_modules/init-package-json": { "version": "5.0.0", @@ -13649,9 +13497,9 @@ "dev": true }, "node_modules/isbot": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.7.1.tgz", - "integrity": "sha512-JfqOaY3O1lcWt2nc+D6Mq231CNpwZrBboLa59Go0J8hjGH+gY/Sy0CA/YLUSIScINmAVwTdJZIsOTk4PfBtRuw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz", + "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==", "engines": { "node": ">=12" } @@ -16896,7 +16744,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17043,7 +16891,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "devOptional": true }, "node_modules/mlly": { "version": "1.4.2", @@ -17073,9 +16921,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -17233,6 +17081,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -17274,6 +17128,18 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -17496,9 +17362,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", - "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", "engines": { "node": ">=6.0.0" } @@ -18554,7 +18420,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -19865,9 +19731,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -20073,9 +19939,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -20136,6 +20002,42 @@ "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==", "dev": true }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", @@ -20580,6 +20482,30 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -22193,6 +22119,51 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -22536,14 +22507,15 @@ "dev": true }, "node_modules/sqlite3": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", - "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", "hasInstallScript": true, "optional": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", "tar": "^6.1.11" }, "optionalDependencies": { @@ -22680,9 +22652,9 @@ } }, "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", "optional": true }, "node_modules/sqlite3/node_modules/node-gyp": { @@ -23158,14 +23130,14 @@ } }, "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -23176,17 +23148,7 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=16 || 14 >=14.17" } }, "node_modules/sucrase/node_modules/commander": { @@ -23199,20 +23161,22 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -23224,16 +23188,13 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/sucrase/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" } }, "node_modules/superagent": { @@ -23630,7 +23591,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, + "devOptional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -23642,13 +23603,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "devOptional": true }, "node_modules/tar-fs/node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, + "devOptional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -23658,7 +23619,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, + "devOptional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -24113,7 +24074,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "devOptional": true + "dev": true }, "node_modules/trim-newlines": { "version": "3.0.1", @@ -24466,6 +24427,18 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -25720,9 +25693,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", "engines": { "node": ">= 8" } @@ -25731,13 +25704,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "devOptional": true + "dev": true }, "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==", - "devOptional": true, + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -26646,9 +26619,9 @@ "dev": true }, "@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", @@ -26656,10 +26629,10 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", + "@babel/helpers": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -26755,9 +26728,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -26961,13 +26934,13 @@ } }, "@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", "dev": true, "requires": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, @@ -27067,9 +27040,9 @@ } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", @@ -27283,9 +27256,9 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", @@ -27812,9 +27785,9 @@ } }, "@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", + "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", "dev": true, "requires": { "@babel/compat-data": "^7.23.5", @@ -27823,7 +27796,7 @@ "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -27844,7 +27817,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", @@ -27892,9 +27865,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -27952,9 +27925,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" @@ -27972,9 +27945,9 @@ } }, "@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "requires": { "@babel/code-frame": "^7.23.5", @@ -29049,141 +29022,6 @@ } } }, - "@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "optional": true - } - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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==", - "optional": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -30699,9 +30537,9 @@ } }, "@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "requires": { "@babel/types": "^7.20.7" @@ -30867,9 +30705,9 @@ } }, "@types/hast": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", - "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", + "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", "dev": true, "requires": { "@types/unist": "^2" @@ -30984,6 +30822,12 @@ "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, + "@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true + }, "@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -31018,9 +30862,9 @@ "dev": true }, "@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -31071,9 +30915,9 @@ "dev": true }, "@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "@types/range-parser": { @@ -31083,9 +30927,9 @@ "dev": true }, "@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "version": "18.2.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz", + "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==", "dev": true, "requires": { "@types/prop-types": "*", @@ -31175,9 +31019,9 @@ }, "dependencies": { "@types/node": { - "version": "18.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", - "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -31201,12 +31045,13 @@ "dev": true }, "@types/superagent": { - "version": "4.1.24", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.24.tgz", - "integrity": "sha512-mEafCgyKiMFin24SDzWN7yAADt4gt6YawFiNMp0QS5ZPboORfyxFt0s3VzJKhTaKg9py/4FUmrHLTNfJKt9Rbw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.1.tgz", + "integrity": "sha512-YQyEXA4PgCl7EVOoSAS3o0fyPFU6erv5mMixztQYe1bqbWmmn8c+IrqoxjQeZe4MgwXikgcaZPiI/DsbmOVlzA==", "dev": true, "requires": { - "@types/cookiejar": "*", + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", "@types/node": "*" } }, @@ -31506,9 +31351,9 @@ } }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -31921,9 +31766,9 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true }, "asynciterator.prototype": { @@ -31967,12 +31812,12 @@ "dev": true }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -32140,7 +31985,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "devOptional": true }, "basic-auth": { "version": "2.0.1", @@ -32187,7 +32032,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, "optional": true, "requires": { "file-uri-to-path": "1.0.0" @@ -32197,7 +32041,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, + "devOptional": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -32304,7 +32148,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, + "devOptional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -32545,9 +32389,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001571", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", - "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", + "version": "1.0.30001574", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz", + "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==", "dev": true }, "chai": { @@ -33082,9 +32926,9 @@ "dev": true }, "core-js-compat": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", - "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, "requires": { "browserslist": "^4.22.2" @@ -33275,7 +33119,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, + "devOptional": true, "requires": { "mimic-response": "^3.1.0" }, @@ -33284,7 +33128,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true + "devOptional": true } } }, @@ -33330,6 +33174,12 @@ "which-typed-array": "^1.1.13" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -33671,9 +33521,9 @@ } }, "electron-to-chromium": { - "version": "1.4.615", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz", - "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==", + "version": "1.4.622", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.622.tgz", + "integrity": "sha512-GZ47DEy0Gm2Z8RVG092CkFvX7SdotG57c4YZOe8W8qD4rOmk3plgeNmiLVRHP/Liqj1wRiY3uUUod9vb9hnxZA==", "dev": true }, "emittery": { @@ -33728,7 +33578,7 @@ "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, + "devOptional": true, "requires": { "once": "^1.4.0" } @@ -34847,6 +34697,12 @@ "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "optional": true + }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -35082,7 +34938,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, "optional": true }, "filelist": { @@ -35226,9 +35081,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true }, "for-each": { @@ -35314,7 +35169,7 @@ "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==", - "dev": true + "devOptional": true }, "fs-extra": { "version": "10.1.0", @@ -35638,6 +35493,12 @@ "ini": "^1.3.2" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "optional": true + }, "glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -36025,7 +35886,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "devOptional": true }, "ignore": { "version": "5.3.0", @@ -36122,7 +35983,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "devOptional": true }, "init-package-json": { "version": "5.0.0", @@ -36634,9 +36495,9 @@ "dev": true }, "isbot": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.7.1.tgz", - "integrity": "sha512-JfqOaY3O1lcWt2nc+D6Mq231CNpwZrBboLa59Go0J8hjGH+gY/Sy0CA/YLUSIScINmAVwTdJZIsOTk4PfBtRuw==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz", + "integrity": "sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==" }, "isexe": { "version": "2.0.0", @@ -39066,7 +38927,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "devOptional": true }, "minimist-options": { "version": "4.1.0", @@ -39182,7 +39043,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "devOptional": true }, "mlly": { "version": "1.4.2", @@ -39209,9 +39070,9 @@ "dev": true }, "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "morgan": { "version": "1.10.0", @@ -39334,6 +39195,12 @@ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -39369,6 +39236,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "optional": true, + "requires": { + "semver": "^7.3.5" + } + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -39526,9 +39402,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", - "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==" + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==" }, "nodemon": { "version": "3.0.2", @@ -40349,7 +40225,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true + "dev": true }, "object-hash": { "version": "3.0.0", @@ -41332,9 +41208,9 @@ "dev": true }, "postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "requires": { "nanoid": "^3.3.7", @@ -41441,9 +41317,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -41489,6 +41365,38 @@ "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==", "dev": true }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "optional": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", @@ -41818,6 +41726,26 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "optional": true + } + } + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -43058,6 +42986,23 @@ } } }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "optional": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "optional": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -43348,14 +43293,15 @@ "dev": true }, "sqlite3": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", - "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", "optional": true, "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", "node-gyp": "8.x", + "prebuild-install": "^7.1.1", "tar": "^6.1.11" }, "dependencies": { @@ -43455,9 +43401,9 @@ } }, "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", "optional": true }, "node-gyp": { @@ -43820,30 +43766,20 @@ } }, "sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -43851,17 +43787,16 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "lines-and-columns": { @@ -43870,14 +43805,11 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true } } }, @@ -44161,7 +44093,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, + "devOptional": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -44173,13 +44105,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "devOptional": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, + "devOptional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -44191,7 +44123,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, + "devOptional": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -44546,7 +44478,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "devOptional": true + "dev": true }, "trim-newlines": { "version": "3.0.1", @@ -44807,6 +44739,15 @@ } } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -45583,21 +45524,21 @@ } }, "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==" }, "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==", - "devOptional": true + "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "devOptional": true, + "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0"