diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..7d29aa987 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "udmi", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/udmif/api/src/__tests__/common/SearchOptionsValidator.spec.ts b/udmif/api/src/__tests__/common/SearchOptionsValidator.spec.ts index fdf4956fd..dc0dc4187 100644 --- a/udmif/api/src/__tests__/common/SearchOptionsValidator.spec.ts +++ b/udmif/api/src/__tests__/common/SearchOptionsValidator.spec.ts @@ -1,17 +1,16 @@ import { validateSearchOptions, validateDistinctSearchOptions } from '../../common/SearchOptionsValidator'; describe('SearchOptionsValidator.validateSearchOptions', () => { - test('defaults offset if not provided', () => { - expect(validateSearchOptions({ batchSize: 100 })).toEqual({ batchSize: 100, offset: 0 }); - }); - test.each([ [0, 0], - [999, 999], - [1000, 1000], - [1001, 1000], - ])('limit is reduced to 1000 if a value greater than 1000', async (batchSize, expected) => { - expect(validateSearchOptions({ batchSize })).toEqual({ batchSize: expected, offset: 0 }); + [null, 0], + [undefined, 0], + ])('offset defaults to 0 when not supplied', async (offset, expected) => { + expect(validateSearchOptions({ offset }).offset).toEqual(expected); + }); + + test('offset still defaults to 0 when no searchOptions are supplied', () => { + expect(validateSearchOptions().offset).toEqual(0); }); }); diff --git a/udmif/api/src/__tests__/dao/DAO.spec.ts b/udmif/api/src/__tests__/dao/DAO.spec.ts index 1c38208f4..1bd18e1bb 100644 --- a/udmif/api/src/__tests__/dao/DAO.spec.ts +++ b/udmif/api/src/__tests__/dao/DAO.spec.ts @@ -38,7 +38,7 @@ describe('DAO', () => { }); test('getAll', async () => { - const insertedDeviceDocument: Device = { name: 'device-1', site: 'LOC' }; + const insertedDeviceDocument: Device = { id: 'd-id-1', name: 'device-1', site: 'LOC' }; deviceCollection.insertOne(insertedDeviceDocument); diff --git a/udmif/api/src/__tests__/device/MockDeviceDataSource.ts b/udmif/api/src/__tests__/device/MockDeviceDataSource.ts index 3112817f5..d1c58afd3 100644 --- a/udmif/api/src/__tests__/device/MockDeviceDataSource.ts +++ b/udmif/api/src/__tests__/device/MockDeviceDataSource.ts @@ -1,5 +1,5 @@ import { GraphQLDataSource } from 'apollo-datasource-graphql/dist/GraphQLDataSource'; -import { SearchOptions } from '../../common/model'; +import { sum } from 'lodash'; import { Device, DevicesResponse, Point } from '../../device/model'; import { createDevices } from './data'; @@ -12,16 +12,16 @@ export default class MockDeviceDataSource extends GraphQLDataSource { super.initialize(config); } - async getDevices(searchOptions: SearchOptions): Promise { + async getDevices(): Promise { const devices: Device[] = createDevices(30); return { devices, totalCount: 30, totalFilteredCount: 10 }; } - async getDevice(id: string): Promise { + async getDevice(): Promise { return createDevices(1)[0]; } - async getPoints(deviceId: string): Promise { + async getPoints(): Promise { return createDevices(1)[0].points; } @@ -48,4 +48,21 @@ export default class MockDeviceDataSource extends GraphQLDataSource { .map((d) => d.section) .sort(); } + + async getDevicesBySite(siteName: string): Promise { + const response = await this.getDevices(); + + return { + ...response, + devices: response.devices.filter((d) => d.site === siteName), + }; + } + + async getDeviceErrorsCountBySite(siteName: string): Promise { + const { devices } = await this.getDevicesBySite(siteName); + + return devices.reduce((n: number, device: Device) => { + return sum([n, device.validation?.errors.length]); + }, 0); + } } diff --git a/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap b/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap index bfce74f75..84ac4666a 100644 --- a/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap +++ b/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap @@ -50,7 +50,7 @@ Object { ], "section": "SIN-MBC1", "serialNumber": "serialNo-1", - "site": "SG-SIN-MBC1", + "site": "LOC-1", "tags": Array [], }, }, @@ -77,7 +77,7 @@ Object { "name": "CDS-1", "operational": true, "section": "SIN-MBC1", - "site": "SG-SIN-MBC1", + "site": "LOC-1", "tags": Array [], }, Object { @@ -88,7 +88,7 @@ Object { "name": "AHU-2", "operational": true, "section": "SIN-MBC2", - "site": "SG-SIN-MBC2", + "site": "SITE-2", "tags": Array [], }, Object { @@ -99,7 +99,7 @@ Object { "name": "CDS-3", "operational": false, "section": "SIN-MBC3", - "site": "SG-SIN-MBC3", + "site": "LOC-3", "tags": Array [], }, Object { @@ -110,7 +110,7 @@ Object { "name": "AHU-4", "operational": true, "section": "SIN-MBC4", - "site": "SG-SIN-MBC4", + "site": "SITE-4", "tags": Array [], }, Object { @@ -121,7 +121,7 @@ Object { "name": "CDS-5", "operational": true, "section": "SIN-MBC5", - "site": "SG-SIN-MBC5", + "site": "LOC-5", "tags": Array [], }, Object { @@ -132,7 +132,7 @@ Object { "name": "AHU-6", "operational": false, "section": "SIN-MBC6", - "site": "SG-SIN-MBC6", + "site": "SITE-6", "tags": Array [], }, Object { @@ -143,7 +143,7 @@ Object { "name": "CDS-7", "operational": true, "section": "SIN-MBC7", - "site": "SG-SIN-MBC7", + "site": "LOC-7", "tags": Array [], }, Object { @@ -154,7 +154,7 @@ Object { "name": "AHU-8", "operational": true, "section": "SIN-MBC8", - "site": "SG-SIN-MBC8", + "site": "SITE-8", "tags": Array [], }, Object { @@ -165,7 +165,7 @@ Object { "name": "CDS-9", "operational": false, "section": "SIN-MBC9", - "site": "SG-SIN-MBC9", + "site": "LOC-9", "tags": Array [], }, Object { @@ -176,7 +176,7 @@ Object { "name": "AHU-10", "operational": true, "section": "SIN-MBC10", - "site": "SG-SIN-MBC10", + "site": "SITE-10", "tags": Array [], }, Object { @@ -187,7 +187,7 @@ Object { "name": "CDS-11", "operational": true, "section": "SIN-MBC11", - "site": "SG-SIN-MBC11", + "site": "LOC-11", "tags": Array [], }, Object { @@ -198,7 +198,7 @@ Object { "name": "AHU-12", "operational": false, "section": "SIN-MBC12", - "site": "SG-SIN-MBC12", + "site": "SITE-12", "tags": Array [], }, Object { @@ -209,7 +209,7 @@ Object { "name": "CDS-13", "operational": true, "section": "SIN-MBC13", - "site": "SG-SIN-MBC13", + "site": "LOC-13", "tags": Array [], }, Object { @@ -220,7 +220,7 @@ Object { "name": "AHU-14", "operational": true, "section": "SIN-MBC14", - "site": "SG-SIN-MBC14", + "site": "SITE-14", "tags": Array [], }, Object { @@ -231,7 +231,7 @@ Object { "name": "CDS-15", "operational": false, "section": "SIN-MBC15", - "site": "SG-SIN-MBC15", + "site": "LOC-15", "tags": Array [], }, Object { @@ -242,7 +242,7 @@ Object { "name": "AHU-16", "operational": true, "section": "SIN-MBC16", - "site": "SG-SIN-MBC16", + "site": "SITE-16", "tags": Array [], }, Object { @@ -253,7 +253,7 @@ Object { "name": "CDS-17", "operational": true, "section": "SIN-MBC17", - "site": "SG-SIN-MBC17", + "site": "LOC-17", "tags": Array [], }, Object { @@ -264,7 +264,7 @@ Object { "name": "AHU-18", "operational": false, "section": "SIN-MBC18", - "site": "SG-SIN-MBC18", + "site": "SITE-18", "tags": Array [], }, Object { @@ -275,7 +275,7 @@ Object { "name": "CDS-19", "operational": true, "section": "SIN-MBC19", - "site": "SG-SIN-MBC19", + "site": "LOC-19", "tags": Array [], }, Object { @@ -286,7 +286,7 @@ Object { "name": "AHU-20", "operational": true, "section": "SIN-MBC20", - "site": "SG-SIN-MBC20", + "site": "SITE-20", "tags": Array [], }, Object { @@ -297,7 +297,7 @@ Object { "name": "CDS-21", "operational": false, "section": "SIN-MBC21", - "site": "SG-SIN-MBC21", + "site": "LOC-21", "tags": Array [], }, Object { @@ -308,7 +308,7 @@ Object { "name": "AHU-22", "operational": true, "section": "SIN-MBC22", - "site": "SG-SIN-MBC22", + "site": "SITE-22", "tags": Array [], }, Object { @@ -319,7 +319,7 @@ Object { "name": "CDS-23", "operational": true, "section": "SIN-MBC23", - "site": "SG-SIN-MBC23", + "site": "LOC-23", "tags": Array [], }, Object { @@ -330,7 +330,7 @@ Object { "name": "AHU-24", "operational": false, "section": "SIN-MBC24", - "site": "SG-SIN-MBC24", + "site": "SITE-24", "tags": Array [], }, Object { @@ -341,7 +341,7 @@ Object { "name": "CDS-25", "operational": true, "section": "SIN-MBC25", - "site": "SG-SIN-MBC25", + "site": "LOC-25", "tags": Array [], }, Object { @@ -352,7 +352,7 @@ Object { "name": "AHU-26", "operational": true, "section": "SIN-MBC26", - "site": "SG-SIN-MBC26", + "site": "SITE-26", "tags": Array [], }, Object { @@ -363,7 +363,7 @@ Object { "name": "CDS-27", "operational": false, "section": "SIN-MBC27", - "site": "SG-SIN-MBC27", + "site": "LOC-27", "tags": Array [], }, Object { @@ -374,7 +374,7 @@ Object { "name": "AHU-28", "operational": true, "section": "SIN-MBC28", - "site": "SG-SIN-MBC28", + "site": "SITE-28", "tags": Array [], }, Object { @@ -385,7 +385,7 @@ Object { "name": "CDS-29", "operational": true, "section": "SIN-MBC29", - "site": "SG-SIN-MBC29", + "site": "LOC-29", "tags": Array [], }, Object { @@ -396,7 +396,7 @@ Object { "name": "AHU-30", "operational": false, "section": "SIN-MBC30", - "site": "SG-SIN-MBC30", + "site": "SITE-30", "tags": Array [], }, ], diff --git a/udmif/api/src/__tests__/device/data.ts b/udmif/api/src/__tests__/device/data.ts index dca4931d9..95102acce 100644 --- a/udmif/api/src/__tests__/device/data.ts +++ b/udmif/api/src/__tests__/device/data.ts @@ -1,5 +1,6 @@ import { Device, Point } from '../../device/model'; import { SearchOptions, SORT_DIRECTION } from '../../common/model'; +import deviceMessage from './deviceValidationMessage.json'; export function createDevices(count: number): Device[] { const devices: Device[] = []; @@ -9,13 +10,14 @@ export function createDevices(count: number): Device[] { const name = n % 2 == 0 ? `AHU-${n}` : `CDS-${n}`; const make: string = `make-${n}`; const model: string = n % 3 == 0 ? `AAAA-${n}` : `BBBB-${n}`; - const site: string = `SG-SIN-MBC${n}`; + const site: string = n % 2 == 0 ? `SITE-${n}` : `LOC-${n}`; const section: string = `SIN-MBC${n}`; const lastPayload: string = '2022-08-30'; const operational: boolean = n % 3 == 0 ? false : true; const serialNumber: string = `serialNo-${n}`; const firmware: string = `v-${n}`; const tags: string[] = []; + const validation: any = deviceMessage; const points: Point[] = createPoints(5); @@ -32,6 +34,7 @@ export function createDevices(count: number): Device[] { firmware, tags, points, + validation, }); n++; } diff --git a/udmif/api/src/__tests__/device/deviceValidationMessage.json b/udmif/api/src/__tests__/device/deviceValidationMessage.json new file mode 100644 index 000000000..255779703 --- /dev/null +++ b/udmif/api/src/__tests__/device/deviceValidationMessage.json @@ -0,0 +1,17 @@ +{ + "version": "1.3.14", + "timestamp": "2018-08-26T21:39:29.364Z", + "sub_type": "event", + "sub_folder": "discovery", + "status": { + "message": "Failed schema validation", + "detail": "The field x.y was unexpected on line 232 of the message.\nThis is by following the logic train x.y.z in the overall flow of the sytem.\nRabbits are really interesting creatures and make great pets.\nOh yah, and there was a missing field too.", + "category": "validation.device.result", + "timestamp": "2018-08-26T21:39:30.364Z", + "level": 600 + }, + "pointset": { + "missing": ["filter_differential_pressure_setpoint"] + }, + "errors": [] +} diff --git a/udmif/api/src/__tests__/device/resolve.spec.ts b/udmif/api/src/__tests__/device/resolve.spec.ts index 375e6cd5f..c666c6826 100644 --- a/udmif/api/src/__tests__/device/resolve.spec.ts +++ b/udmif/api/src/__tests__/device/resolve.spec.ts @@ -30,19 +30,6 @@ const QUERY_DEVICES = gql` } `; -const QUERY_SITES = gql` - query { - sites(searchOptions: { batchSize: 10, offset: 10, sortOptions: { direction: DESC, field: "name" }, filter: "" }) { - totalCount - totalFilteredCount - sites { - id - name - } - } - } -`; - const QUERY_DEVICE = gql` query { device(id: "some-id") { @@ -98,12 +85,6 @@ const QUERY_DEVICE_MODELS = gql` } `; -const QUERY_SITE_NAMES = gql` - query { - siteNames - } -`; - const QUERY_SECTIONS = gql` query { sections @@ -127,17 +108,17 @@ beforeAll(async () => { describe('Devices', () => { test('devices', async () => { - const result = await runQuery(QUERY_DEVICES, {}); + const result = await runQuery(QUERY_DEVICES); expect(result).toMatchSnapshot(); }); test('device', async () => { - const result = await runQuery(QUERY_DEVICE, {}); + const result = await runQuery(QUERY_DEVICE); expect(result).toMatchSnapshot(); }); test('points', async () => { - const result = await runQuery(QUERY_POINTS, {}); + const result = await runQuery(QUERY_POINTS); expect(result).toMatchSnapshot(); }); diff --git a/udmif/api/src/__tests__/server/context.spec.ts b/udmif/api/src/__tests__/server/context.spec.ts index b286a6b7a..bd03a8ec8 100644 --- a/udmif/api/src/__tests__/server/context.spec.ts +++ b/udmif/api/src/__tests__/server/context.spec.ts @@ -17,11 +17,11 @@ describe('ContextProcessor.processRequest', () => { test('calling with req that has idtoken in header returns a not null context', async () => { const req = { headers: { idtoken: 'some-id-token' } }; - await expect(contextProcessor.processRequest({ req, res: {} })).resolves.not.toBeNull(); + await expect(contextProcessor.processRequest({ req, res: {} })).resolves.not.toBeNull(); }); test('calling with req that has no headers throws exception', async () => { const req = {}; - await expect(contextProcessor.processRequest({ req, res: {} })).rejects.toThrowError('Invalid Headers'); + await expect(contextProcessor.processRequest({ req, res: {} })).rejects.toThrowError('Invalid Headers'); }); }); diff --git a/udmif/api/src/__tests__/site/MockSiteDataSource.ts b/udmif/api/src/__tests__/site/MockSiteDataSource.ts index e42df59af..b8213b30e 100644 --- a/udmif/api/src/__tests__/site/MockSiteDataSource.ts +++ b/udmif/api/src/__tests__/site/MockSiteDataSource.ts @@ -1,5 +1,4 @@ import { GraphQLDataSource } from 'apollo-datasource-graphql/dist/GraphQLDataSource'; -import { SearchOptions } from '../../common/model'; import { Site, SitesResponse } from '../../site/model'; import { createSites } from './data'; @@ -12,7 +11,7 @@ export default class MockSiteDataSource extends GraphQLDataSource { super.initialize(config); } - async getSites(searchOptions: SearchOptions): Promise { + async getSites(): Promise { const sites: Site[] = createSites(30); return { sites, totalCount: 30, totalFilteredCount: 10 }; } @@ -22,4 +21,8 @@ export default class MockSiteDataSource extends GraphQLDataSource { .map((d) => d.name) .sort(); } + + async getSite(): Promise { + return createSites(1)[0]; + } } diff --git a/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap b/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap index fc7fdba72..538faa4c3 100644 --- a/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap +++ b/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap @@ -1,5 +1,31 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Sites getSite 1`] = ` +Object { + "data": Object { + "site": Object { + "correctDevicesCount": 1, + "errorDevicesCount": 1, + "extraDevicesCount": 0, + "id": "00000000-0000-0000-0000-0000000001", + "lastValidated": "2022-07-16T18:27:19Z", + "missingDevicesCount": 2, + "name": "LOC-1", + "percentValidated": 0.4, + "totalDeviceErrorsCount": 0, + "totalDevicesCount": 10, + }, + }, + "errors": undefined, + "extensions": undefined, + "http": Object { + "headers": Headers { + Symbol(map): Object {}, + }, + }, +} +`; + exports[`Sites getSiteNames 1`] = ` Object { "data": Object { diff --git a/udmif/api/src/__tests__/site/data.ts b/udmif/api/src/__tests__/site/data.ts index 2b75a1415..73f5f81ad 100644 --- a/udmif/api/src/__tests__/site/data.ts +++ b/udmif/api/src/__tests__/site/data.ts @@ -1,4 +1,5 @@ import { Site } from '../../site/model'; +import siteMessage from './siteValidationMessage.json'; export function createSites(count: number): Site[] { const sites: Site[] = []; @@ -7,10 +8,12 @@ export function createSites(count: number): Site[] { while (n <= count) { const id = '00000000-0000-0000-0000-000000000' + n; const name = n % 2 == 0 ? `SITE-${n}` : `LOC-${n}`; + const validation = siteMessage; sites.push({ id, name, + validation, }); n++; } diff --git a/udmif/api/src/__tests__/site/resolve.spec.ts b/udmif/api/src/__tests__/site/resolve.spec.ts index 8be3c4a2b..9981c1229 100644 --- a/udmif/api/src/__tests__/site/resolve.spec.ts +++ b/udmif/api/src/__tests__/site/resolve.spec.ts @@ -5,6 +5,7 @@ import MockSiteDataSource from './MockSiteDataSource'; import { typeDefs } from '../../server/schema'; import { resolvers } from '../../server/resolvers'; import { getDefaultContextProcessor } from '../../server/context'; +import MockDeviceDataSource from '../device/MockDeviceDataSource'; let testServer: ApolloServer; const clientIds: string[] = ['', '']; @@ -29,10 +30,28 @@ const QUERY_SITE_NAMES = gql` } `; +const QUERY_SITE = gql` + query { + site(id: "00000000-0000-0000-0000-0000000001") { + id + name + totalDevicesCount + correctDevicesCount + missingDevicesCount + errorDevicesCount + extraDevicesCount + lastValidated + percentValidated + totalDeviceErrorsCount + } + } +`; + beforeAll(async () => { const dataSources = () => { return { siteDS: new MockSiteDataSource(), + deviceDS: new MockDeviceDataSource(), }; }; @@ -46,7 +65,7 @@ beforeAll(async () => { describe('Sites', () => { test('sites', async () => { - const result = await runQuery(QUERY_SITES, {}); + const result = await runQuery(QUERY_SITES); expect(result).toMatchSnapshot(); }); @@ -54,6 +73,11 @@ describe('Sites', () => { const result = await runQuery(QUERY_SITE_NAMES); expect(result).toMatchSnapshot(); }); + + test('getSite', async () => { + const result = await runQuery(QUERY_SITE); + expect(result).toMatchSnapshot(); + }); }); async function runQuery(gql: DocumentNode, variables: object = {}): Promise { diff --git a/udmif/api/src/__tests__/site/siteValidationMessage.json b/udmif/api/src/__tests__/site/siteValidationMessage.json new file mode 100644 index 000000000..ee7284109 --- /dev/null +++ b/udmif/api/src/__tests__/site/siteValidationMessage.json @@ -0,0 +1,29 @@ +{ + "version": "1.3.14", + "last_updated": "2022-07-16T18:27:19Z", + "timestamp": "2018-08-26T21:39:29.364Z", + "summary": { + "correct_devices": ["AHU-22"], + "extra_devices": [], + "missing_devices": ["GAT-123", "SNS-4"], + "error_devices": ["AHU-1"] + }, + "status": { + "message": "Site is completed validation", + "category": "validation.summary.report", + "timestamp": "2018-08-26T21:39:30.364Z", + "level": 200 + }, + "devices": { + "AHU-1": { + "last_seen": "2022-07-16T18:27:19Z", + "oldest_mark": "2022-07-16T18:27:19Z", + "status": { + "message": "Tickity Boo", + "category": "validation.device.result", + "timestamp": "2018-08-26T21:39:30.364Z", + "level": 400 + } + } + } +} diff --git a/udmif/api/src/common/SearchOptionsValidator.ts b/udmif/api/src/common/SearchOptionsValidator.ts index 47f11fcee..324d15cc2 100644 --- a/udmif/api/src/common/SearchOptionsValidator.ts +++ b/udmif/api/src/common/SearchOptionsValidator.ts @@ -1,31 +1,29 @@ +import { isNil } from 'lodash'; import { logger } from './logger'; import { SearchOptions, DistinctSearchOptions, ValidatedDistinctSearchOptions, ValidatedSearchOptions } from './model'; -export function validateSearchOptions(searchOptions: SearchOptions): ValidatedSearchOptions { - let { offset, batchSize } = searchOptions; +export function validateSearchOptions(searchOptions?: SearchOptions): ValidatedSearchOptions { + const { offset } = searchOptions ?? {}; - if (offset === undefined) { + if (isNil(offset)) { logger.warn('An offset was not provided, defaulting to 0'); - offset = 0; - } - - if (batchSize > 1000) { - logger.warn(`The batch size ${batchSize} exceeds max of 1000, restricting to 1000 records`); - batchSize = 1000; } return { ...searchOptions, - offset, - batchSize, + offset: offset ?? 0, // default to 0 }; } export function validateDistinctSearchOptions(searchOptions?: DistinctSearchOptions): ValidatedDistinctSearchOptions { - const { search, limit } = searchOptions ?? {}; + const { limit } = searchOptions ?? {}; + + if (isNil(limit)) { + logger.warn('A limit was not provided, defaulting to 10'); + } return { + ...searchOptions, limit: limit ?? 10, // default to 10 - search, }; } diff --git a/udmif/api/src/common/model.ts b/udmif/api/src/common/model.ts index 63a15d84e..3c1e02520 100644 --- a/udmif/api/src/common/model.ts +++ b/udmif/api/src/common/model.ts @@ -1,12 +1,12 @@ export interface SearchOptions { - batchSize: number; + batchSize?: number; offset?: number; sortOptions?: SortOptions; filter?: string; } export interface ValidatedSearchOptions { - batchSize: number; + batchSize?: number; offset: number; sortOptions?: SortOptions; filter?: string; diff --git a/udmif/api/src/common/schema.graphql b/udmif/api/src/common/schema.graphql index edb652ad4..5865b324b 100644 --- a/udmif/api/src/common/schema.graphql +++ b/udmif/api/src/common/schema.graphql @@ -7,7 +7,7 @@ input DistinctSearchOptions { input SearchOptions { # the number of records to retrieve - batchSize: Int! + batchSize: Int # the records to start at offset: Int # the search options diff --git a/udmif/api/src/dao/DAO.ts b/udmif/api/src/dao/DAO.ts index 34ecf8c65..df15a3667 100644 --- a/udmif/api/src/dao/DAO.ts +++ b/udmif/api/src/dao/DAO.ts @@ -36,12 +36,17 @@ export class DefaultDAO implements DAO { * based on any search options provided. */ async getAll(searchOptions: ValidatedSearchOptions): Promise { - return this.collection - .find(this.getFilter(searchOptions)) - .sort(this.getSort(searchOptions)) - .skip(searchOptions.offset) - .limit(searchOptions.batchSize) - .toArray(); + const collection = this.collection.find(this.getFilter(searchOptions)).sort(this.getSort(searchOptions)); + + if (searchOptions.offset) { + collection.skip(searchOptions.offset); + } + + if (searchOptions.batchSize) { + collection.limit(searchOptions.batchSize); + } + + return collection.toArray(); } /** diff --git a/udmif/api/src/device/DeviceDataSource.ts b/udmif/api/src/device/DeviceDataSource.ts index 58a5533e8..404bf10d6 100644 --- a/udmif/api/src/device/DeviceDataSource.ts +++ b/udmif/api/src/device/DeviceDataSource.ts @@ -2,7 +2,13 @@ import { GraphQLDataSource } from 'apollo-datasource-graphql/dist/GraphQLDataSou import { Device, DevicesResponse, Point } from './model'; import { validateSearchOptions, validateDistinctSearchOptions } from '../common/SearchOptionsValidator'; import { DAO } from '../dao/DAO'; -import { ValidatedDistinctSearchOptions, DistinctSearchOptions, ValidatedSearchOptions } from '../common/model'; +import { + ValidatedDistinctSearchOptions, + DistinctSearchOptions, + ValidatedSearchOptions, + SearchOptions, +} from '../common/model'; +import { sum } from 'lodash'; export class DeviceDataSource extends GraphQLDataSource { constructor(private deviceDAO: DAO) { @@ -13,7 +19,7 @@ export class DeviceDataSource extends GraphQLDataSource { super.initialize(config); } - async getDevices(searchOptions: ValidatedSearchOptions): Promise { + async getDevices(searchOptions?: SearchOptions): Promise { const validatedSearchOptions: ValidatedSearchOptions = validateSearchOptions(searchOptions); const devices: Device[] = await this.deviceDAO.getAll(validatedSearchOptions); @@ -50,4 +56,25 @@ export class DeviceDataSource extends GraphQLDataSource { const validatedSearchOptions: ValidatedDistinctSearchOptions = validateDistinctSearchOptions(searchOptions); return this.deviceDAO.getDistinct('section', validatedSearchOptions); } + + async getDevicesBySite(siteName: string): Promise { + return this.getDevices({ + offset: 0, + filter: JSON.stringify([ + { + field: 'site', + operator: '=', + value: siteName, + }, + ]), + }); + } + + async getDeviceErrorsCountBySite(siteName: string): Promise { + const { devices } = await this.getDevicesBySite(siteName); + + return devices.reduce((n: number, device: Device) => { + return sum([n, device.validation?.errors.length]); + }, 0); + } } diff --git a/udmif/api/src/device/model.ts b/udmif/api/src/device/model.ts index 3121c0991..90ee22f63 100644 --- a/udmif/api/src/device/model.ts +++ b/udmif/api/src/device/model.ts @@ -13,7 +13,7 @@ export interface Point { } export interface Device { - id?: string; + id: string; name: string; make?: string; model?: string; @@ -25,4 +25,5 @@ export interface Device { serialNumber?: string; tags?: string[]; points?: Point[]; + validation?: any; } diff --git a/udmif/api/src/device/schema.graphql b/udmif/api/src/device/schema.graphql index 684ea8380..9e0d3f873 100644 --- a/udmif/api/src/device/schema.graphql +++ b/udmif/api/src/device/schema.graphql @@ -49,7 +49,7 @@ type Device { type Query { # Get the devices matching the search options - devices( searchOptions: SearchOptions! ): DevicesResponse + devices( searchOptions: SearchOptions ): DevicesResponse # Get a device by ID device( id: ID! ): Device # Get points by a Device ID diff --git a/udmif/api/src/server/datasources.ts b/udmif/api/src/server/datasources.ts index 9aac3077c..8a09feae0 100644 --- a/udmif/api/src/server/datasources.ts +++ b/udmif/api/src/server/datasources.ts @@ -5,7 +5,16 @@ import { Site } from '../site/model'; import { DeviceDataSource } from '../device/DeviceDataSource'; import { SiteDataSource } from '../site/SiteDataSource'; -export default function dataSources(deviceDAO: DAO, siteDAO: DAO): () => DataSources { +interface ApiDataSources { + deviceDS: DeviceDataSource; + siteDS: SiteDataSource; +} + +export interface ApolloContext { + dataSources: ApiDataSources; +} + +export default function dataSources(deviceDAO: DAO, siteDAO: DAO): () => DataSources { return () => ({ deviceDS: new DeviceDataSource(deviceDAO), siteDS: new SiteDataSource(siteDAO), diff --git a/udmif/api/src/site/SiteDataSource.ts b/udmif/api/src/site/SiteDataSource.ts index bf68d4de6..bdbd57364 100644 --- a/udmif/api/src/site/SiteDataSource.ts +++ b/udmif/api/src/site/SiteDataSource.ts @@ -1,8 +1,14 @@ import { GraphQLDataSource } from 'apollo-datasource-graphql/dist/GraphQLDataSource'; import { Site, SitesResponse } from './model'; import { DAO } from '../dao/DAO'; -import { ValidatedDistinctSearchOptions, DistinctSearchOptions, ValidatedSearchOptions } from '../common/model'; +import { + ValidatedDistinctSearchOptions, + DistinctSearchOptions, + ValidatedSearchOptions, + SearchOptions, +} from '../common/model'; import { validateSearchOptions, validateDistinctSearchOptions } from '../common/SearchOptionsValidator'; +import { Device } from '../device/model'; export class SiteDataSource extends GraphQLDataSource { constructor(private siteDAO: DAO) { @@ -18,7 +24,7 @@ export class SiteDataSource extends GraphQLDataSource { return this.siteDAO.getDistinct('name', validatedSearchOptions); } - async getSites(searchOptions: ValidatedSearchOptions): Promise { + async getSites(searchOptions?: SearchOptions): Promise { const validatedSearchOptions: ValidatedSearchOptions = validateSearchOptions(searchOptions); const sites: Site[] = await this.siteDAO.getAll(validatedSearchOptions); @@ -27,4 +33,8 @@ export class SiteDataSource extends GraphQLDataSource { return { sites, totalCount, totalFilteredCount }; } + + async getSite(id: string): Promise { + return this.siteDAO.getOne({ id }); + } } diff --git a/udmif/api/src/site/model.ts b/udmif/api/src/site/model.ts index 1b59b3255..d2495ae28 100644 --- a/udmif/api/src/site/model.ts +++ b/udmif/api/src/site/model.ts @@ -1,10 +1,25 @@ +import { DistinctSearchOptions, SearchOptions } from '../common/model'; + export interface SitesResponse { sites: Site[]; totalCount: number; totalFilteredCount: number; } +export interface SiteNamesArgs { + searchOptions: DistinctSearchOptions; +} + +export interface SitesArgs { + searchOptions: SearchOptions; +} + +export interface SiteArgs { + id: string; +} + export interface Site { - id?: string; + id: string; name: string; + validation?: any; } diff --git a/udmif/api/src/site/resolvers.ts b/udmif/api/src/site/resolvers.ts index a3beba625..c52aac29a 100644 --- a/udmif/api/src/site/resolvers.ts +++ b/udmif/api/src/site/resolvers.ts @@ -1,10 +1,53 @@ +import { sum } from 'lodash'; +import { ApolloContext } from '../server/datasources'; +import { Site, SiteArgs, SiteNamesArgs, SitesArgs } from './model'; + export const resolvers = { Query: { - siteNames: (_, { searchOptions }, { dataSources: { siteDS } }) => { + siteNames: (_query, { searchOptions }: SiteNamesArgs, { dataSources: { siteDS } }: ApolloContext) => { return siteDS.getSiteNames(searchOptions); }, - sites: (_, { searchOptions }, { dataSources: { siteDS } }) => { + sites: (_query, { searchOptions }: SitesArgs, { dataSources: { siteDS } }: ApolloContext) => { return siteDS.getSites(searchOptions); }, + site: (_query, { id }: SiteArgs, { dataSources: { siteDS } }: ApolloContext) => { + return siteDS.getSite(id); + }, + }, + Site: { + totalDevicesCount: async (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { + return (await deviceDS.getDevicesBySite(site.name)).totalFilteredCount; + }, + correctDevicesCount: (site: Site) => { + return site.validation?.summary.correct_devices.length ?? 0; + }, + missingDevicesCount: (site: Site) => { + return site.validation?.summary.missing_devices.length ?? 0; + }, + errorDevicesCount: (site: Site) => { + return site.validation?.summary.error_devices.length ?? 0; + }, + extraDevicesCount: (site: Site) => { + return site.validation?.summary.extra_devices.length ?? 0; + }, + lastValidated: (site: Site) => { + return site.validation?.last_updated; + }, + percentValidated: async (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { + const validationSummary = site.validation?.summary; + + return ( + sum([ + 0, + validationSummary?.correct_devices.length, + validationSummary?.missing_devices.length, + validationSummary?.error_devices.length, + validationSummary?.extra_devices.length, + ]) / ((await deviceDS.getDevicesBySite(site.name)).totalFilteredCount || 1) + ); + }, + totalDeviceErrorsCount: (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { + return deviceDS.getDeviceErrorsCountBySite(site.name); + }, }, }; diff --git a/udmif/api/src/site/schema.graphql b/udmif/api/src/site/schema.graphql index 05a5723aa..6d111682f 100644 --- a/udmif/api/src/site/schema.graphql +++ b/udmif/api/src/site/schema.graphql @@ -8,15 +8,33 @@ type SitesResponse { } type Site { - # the ID of the site + # ID of the site id: ID! - # the name of the site + # Name of the site name: String! + # Total number of devices associated to the site + totalDevicesCount: Int! + # Number of correct devices in the message + correctDevicesCount: Int! + # Number of missing devices in the message + missingDevicesCount: Int! + # Number of error devices in the message + errorDevicesCount: Int! + # Number of extra devices in the message + extraDevicesCount: Int! + # Last time the validation message was updated + lastValidated: String + # Percent of devices validated i.e. 0.97 + percentValidated: Float! + # Total number of errors across all devices + totalDeviceErrorsCount: Int! } type Query { # Get a list of sites - sites(searchOptions: SearchOptions!) : SitesResponse + sites(searchOptions: SearchOptions) : SitesResponse + # Get a site by ID + site(id: ID!): Site # Get a list of sites siteNames(searchOptions: DistinctSearchOptions) : [String!]! } diff --git a/udmif/api/tsconfig.json b/udmif/api/tsconfig.json index 335b47b4e..04ec2a103 100644 --- a/udmif/api/tsconfig.json +++ b/udmif/api/tsconfig.json @@ -5,6 +5,8 @@ "outDir": "dist", "sourceMap": true, "baseUrl": ".", + "resolveJsonModule": true, + "esModuleInterop": true, "paths": { "*": [ "node_modules/*", diff --git a/udmif/web/package-lock.json b/udmif/web/package-lock.json index e99de6f38..530030aad 100644 --- a/udmif/web/package-lock.json +++ b/udmif/web/package-lock.json @@ -474,21 +474,21 @@ } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -513,12 +513,12 @@ } }, "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -555,9 +555,9 @@ } }, "node_modules/@angular/compiler-cli/node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", + "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" @@ -725,9 +725,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -830,12 +830,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -857,14 +857,14 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -890,9 +890,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -965,13 +965,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1028,9 +1028,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1038,9 +1038,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1073,9 +1073,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1191,15 +1191,15 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1220,14 +1220,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1262,9 +1262,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1805,16 +1805,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -1854,9 +1855,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" @@ -2013,14 +2014,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -2048,13 +2049,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -2200,12 +2201,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { @@ -2431,19 +2432,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2452,12 +2453,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -2480,9 +2481,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.18.10", @@ -2817,6 +2818,12 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -2845,12 +2852,6 @@ "@types/node": "*" } }, - "node_modules/@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -2883,9 +2884,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2953,9 +2954,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.183", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.183.tgz", - "integrity": "sha512-UXavyuxzXKMqJPEpFPri6Ku5F9af6ZJXUneHhvQJxavrEjuHkFp2YnDWHcxJiG7hk8ZkWqjcyNeW1s/smZv5cw==", + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "node_modules/@types/lodash-es": { @@ -3997,9 +3998,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", + "version": "1.0.30001393", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz", + "integrity": "sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA==", "dev": true, "funding": [ { @@ -4276,12 +4277,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -4532,28 +4527,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" + "browserslist": "^4.21.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5184,9 +5169,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", + "version": "1.4.246", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz", + "integrity": "sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==", "dev": true }, "node_modules/emoji-regex": { @@ -5976,9 +5961,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6121,9 +6106,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/follow-redirects": { @@ -7850,9 +7835,9 @@ } }, "node_modules/lint-staged/node_modules/supports-color": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", - "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", + "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", "dev": true, "engines": { "node": ">=12" @@ -8920,9 +8905,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "dependencies": { "@npmcli/fs": "^2.1.0", @@ -8942,7 +8927,7 @@ "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" @@ -9018,9 +9003,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen/node_modules/minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "dependencies": { "minipass": "^3.1.6", @@ -9072,6 +9057,30 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -10953,9 +10962,9 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "dependencies": { "node-forge": "^1" @@ -11254,9 +11263,9 @@ } }, "node_modules/socket.io": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", - "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.2.tgz", + "integrity": "sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -11264,7 +11273,7 @@ "debug": "~4.3.2", "engine.io": "~6.2.0", "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.0.4" + "socket.io-parser": "~4.2.0" }, "engines": { "node": ">=10.0.0" @@ -11277,13 +11286,12 @@ "dev": true }, "node_modules/socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" }, "engines": { @@ -11705,9 +11713,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.14", @@ -12032,9 +12040,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "dev": true, "funding": [ { @@ -12931,21 +12939,21 @@ }, "dependencies": { "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.0.tgz", + "integrity": "sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -12962,12 +12970,12 @@ } }, "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } @@ -12995,9 +13003,9 @@ } }, "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", + "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", "dev": true, "requires": { "sourcemap-codec": "^1.4.8" @@ -13088,9 +13096,9 @@ } }, "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", + "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", "dev": true }, "@babel/core": { @@ -13169,12 +13177,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", + "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.19.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -13189,14 +13197,14 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.18.9", @@ -13215,9 +13223,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -13273,13 +13281,13 @@ } }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "dependencies": { "@babel/template": { @@ -13323,9 +13331,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", @@ -13333,9 +13341,9 @@ "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "dependencies": { "@babel/template": { @@ -13361,9 +13369,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -13448,15 +13456,15 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "dependencies": { "@babel/template": { @@ -13473,14 +13481,14 @@ } }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "dependencies": { "@babel/template": { @@ -13508,9 +13516,9 @@ } }, "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", + "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -13867,16 +13875,17 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" @@ -13903,9 +13912,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" @@ -14002,14 +14011,14 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -14025,13 +14034,13 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.0.tgz", + "integrity": "sha512-HDSuqOQzkU//kfGdiHBt71/hkDTApw4U/cMVgKgX7PqfB3LOaK+2GtCEsBu1dL9CkswDm0Gwehht1dCr421ULQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { @@ -14122,12 +14131,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, @@ -14301,30 +14310,30 @@ } }, "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", + "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.19.0", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } @@ -14343,9 +14352,9 @@ } }, "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.18.10", @@ -14601,6 +14610,12 @@ "jsonc-parser": "3.0.0" } }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -14626,12 +14641,6 @@ "@types/node": "*" } }, - "@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -14664,9 +14673,9 @@ "dev": true }, "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "requires": { "@types/estree": "*", @@ -14734,9 +14743,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.183", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.183.tgz", - "integrity": "sha512-UXavyuxzXKMqJPEpFPri6Ku5F9af6ZJXUneHhvQJxavrEjuHkFp2YnDWHcxJiG7hk8ZkWqjcyNeW1s/smZv5cw==", + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "@types/lodash-es": { @@ -15564,9 +15573,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", + "version": "1.0.30001393", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz", + "integrity": "sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA==", "dev": true }, "chalk": { @@ -15759,12 +15768,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -15956,21 +15959,12 @@ "dev": true }, "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", "dev": true, "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.21.3" } }, "core-util-is": { @@ -16445,9 +16439,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", + "version": "1.4.246", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.246.tgz", + "integrity": "sha512-/wFCHUE+Hocqr/LlVGsuKLIw4P2lBWwFIDcNMDpJGzyIysQV4aycpoOitAs32FT94EHKnNqDR/CVZJFbXEufJA==", "dev": true }, "emoji-regex": { @@ -16963,9 +16957,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -17080,9 +17074,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "follow-redirects": { @@ -18351,9 +18345,9 @@ }, "dependencies": { "supports-color": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", - "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", + "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", "dev": true } } @@ -19152,9 +19146,9 @@ } }, "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "requires": { "@npmcli/fs": "^2.1.0", @@ -19174,7 +19168,7 @@ "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^2.0.0" } }, "glob": { @@ -19232,9 +19226,9 @@ }, "dependencies": { "minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -19273,6 +19267,24 @@ "requires": { "minipass": "^3.1.1" } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } } } }, @@ -20582,9 +20594,9 @@ "dev": true }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, "requires": { "node-forge": "^1" @@ -20824,9 +20836,9 @@ "dev": true }, "socket.io": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", - "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.2.tgz", + "integrity": "sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -20834,7 +20846,7 @@ "debug": "~4.3.2", "engine.io": "~6.2.0", "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.0.4" + "socket.io-parser": "~4.2.0" } }, "socket.io-adapter": { @@ -20844,13 +20856,12 @@ "dev": true }, "socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, @@ -21167,9 +21178,9 @@ } }, "terser-webpack-plugin": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", - "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.14", @@ -21388,9 +21399,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", "dev": true, "requires": { "escalade": "^3.1.1", diff --git a/udmif/web/package.json b/udmif/web/package.json index b2f826d40..9a02d3e4f 100644 --- a/udmif/web/package.json +++ b/udmif/web/package.json @@ -14,7 +14,7 @@ }, "private": true, "lint-staged": { - "src/**/*.{html,ts,json,scss}": "prettier --single-quote --arrow-parens always --trailing-comma es5 --print-width 120 --write" + "*.{js,html,ts,json,scss}": "prettier --single-quote --arrow-parens always --trailing-comma es5 --print-width 120 --write" }, "dependencies": { "@abacritt/angularx-social-login": "~1.0.2", diff --git a/udmif/web/src/app/devices/devices.d.ts b/udmif/web/src/app/devices/devices.d.ts index ed4eeb660..945b7e415 100644 --- a/udmif/web/src/app/devices/devices.d.ts +++ b/udmif/web/src/app/devices/devices.d.ts @@ -1,7 +1,7 @@ import { Device } from '../device/device'; export interface SearchOptions { - batchSize: number; + batchSize?: number; offset?: number; sortOptions?: SortOptions; filter?: string; diff --git a/udmif/web/src/app/devices/devices.gql.ts b/udmif/web/src/app/devices/devices.gql.ts index fd70adeb0..e044fa0de 100644 --- a/udmif/web/src/app/devices/devices.gql.ts +++ b/udmif/web/src/app/devices/devices.gql.ts @@ -1,7 +1,7 @@ import { gql } from 'apollo-angular'; export const GET_DEVICES = gql` - query GetDevices($searchOptions: SearchOptions!) { + query GetDevices($searchOptions: SearchOptions) { devices(searchOptions: $searchOptions) { devices { id diff --git a/udmif/web/src/app/site/site.d.ts b/udmif/web/src/app/site/site.d.ts index 67ae233e4..61fb7c1a0 100644 --- a/udmif/web/src/app/site/site.d.ts +++ b/udmif/web/src/app/site/site.d.ts @@ -1,6 +1,14 @@ interface SiteModel { id: string; name: string; + totalDevicesCount: number; + correctDevicesCount: number; + missingDevicesCount: number; + errorDevicesCount: number; + extraDevicesCount: number; + lastValidated: string; + percentValidated: number; + totalDeviceErrorsCount: number; } export type Site = Partial; diff --git a/udmif/web/src/app/sites/sites.component.html b/udmif/web/src/app/sites/sites.component.html index 25a6e08a8..efc01993e 100644 --- a/udmif/web/src/app/sites/sites.component.html +++ b/udmif/web/src/app/sites/sites.component.html @@ -2,7 +2,15 @@ {{ columnName | capitalize }} - {{ element[columnName] }} +
+ {{ element.lastValidated | date: 'MM/dd/yy h:mm a' }} +
+
+ {{ element.percentValidated | percent: '1.0-2' }} +
+
+ {{ element[columnName] }} +
diff --git a/udmif/web/src/app/sites/sites.component.ts b/udmif/web/src/app/sites/sites.component.ts index 0932a9cac..06716d679 100644 --- a/udmif/web/src/app/sites/sites.component.ts +++ b/udmif/web/src/app/sites/sites.component.ts @@ -15,7 +15,17 @@ import { Subscription } from 'rxjs'; export class SitesComponent implements OnInit, OnDestroy { private sitesSubscription!: Subscription; private sitesQuery!: QueryRef; - displayedColumns: (keyof SiteModel)[] = ['name']; + displayedColumns: (keyof SiteModel)[] = [ + 'name', + 'totalDevicesCount', + 'correctDevicesCount', + 'missingDevicesCount', + 'errorDevicesCount', + 'extraDevicesCount', + 'lastValidated', + 'percentValidated', + 'totalDeviceErrorsCount', + ]; sites: Site[] = []; totalCount: number = 0; totalFilteredCount: number = 0; diff --git a/udmif/web/src/app/sites/sites.d.ts b/udmif/web/src/app/sites/sites.d.ts index 47b15a71b..3c366d436 100644 --- a/udmif/web/src/app/sites/sites.d.ts +++ b/udmif/web/src/app/sites/sites.d.ts @@ -1,7 +1,7 @@ import { Site } from '../site/site'; export interface SearchOptions { - batchSize: number; + batchSize?: number; offset?: number; sortOptions?: SortOptions; filter?: string; diff --git a/udmif/web/src/app/sites/sites.gql.ts b/udmif/web/src/app/sites/sites.gql.ts index cfb2bc9cd..a0154679a 100644 --- a/udmif/web/src/app/sites/sites.gql.ts +++ b/udmif/web/src/app/sites/sites.gql.ts @@ -1,11 +1,19 @@ import { gql } from 'apollo-angular'; export const GET_SITES = gql` - query GetSites($searchOptions: SearchOptions!) { + query GetSites($searchOptions: SearchOptions) { sites(searchOptions: $searchOptions) { sites { id name + totalDevicesCount + correctDevicesCount + missingDevicesCount + errorDevicesCount + extraDevicesCount + lastValidated + percentValidated + totalDeviceErrorsCount } totalCount totalFilteredCount