From 827b77899d04ebba92afd4372b14935c0acc7c29 Mon Sep 17 00:00:00 2001 From: mspratt-biot <100383862+mspratt-biot@users.noreply.github.com> Date: Tue, 22 Nov 2022 11:13:06 -0500 Subject: [PATCH 1/3] Temp branch (#245) * #1092-adjusted tests * changing index.zip to dist.zip * #1094-increased whitespace * changing source foloder * Cleanup artifacts from checkin * some more build cleanups * testing gcf * testing * created build.yml for event handler * #1091-increased the font sizes according to gar4 * #1093-adjusted filter bar and other items to increase contrast * #1095-moved location of devices button * #1095-changed h1 to h2 for UDMI 'logo' * removed functions.tf * Trigger Merge pipeline when spcific dir/sub dir changed * #1090-fixed incorrect use of mat-sort-header * testing gcf * testing gcf * Handle pointset messages (#167) * Restructured the Cloud Function to make it easier to understand * Enhancing implementation * Fleshing out system messages * Refactoring how we instantiate collection * Re-ordering inputs to write function * Adding basic test framework * Adding test to call handleUdmiEvent * Updating test to validate a spy * Converting project to typescript * Splitting into distinct purpose files and tests * Adding tests and minor refactors * Adding tests and minor refactors * Adding tests and minor refactors * reverting some changes to package.json * reverting some changes to package.json * Removing comments that are not relevant * Adding build script to transpile the code into js * Adding proper support for husky * Reverting Changes to Readme * Removing uneeded ignore * Quick refactor to get ready for pointset messages * Adding refacotored code * Removing old code * Adding sample messages and cleaning arguments * Adding Point model and building logic * Adding logic and tests for building of point document * Adding logic to handle pointset messages * Adding logic to handle pointset messages * fixing failed merge attempt * fixing failed merge attempt * Fixing sample messages for pointset and docs * Adding files and instructions to make dev easier * Cleaning readme * Refactoring based on comments during demo yesterday * Updating readme: * updating instructions and enhancing model * Cleaning up code to use codes provided. Friendly names will have to be dealt with in another story * GCP clud function fixes * Handle pointset messages (#168) * Restructured the Cloud Function to make it easier to understand * Enhancing implementation * Fleshing out system messages * Refactoring how we instantiate collection * Re-ordering inputs to write function * Adding basic test framework * Adding test to call handleUdmiEvent * Updating test to validate a spy * Converting project to typescript * Splitting into distinct purpose files and tests * Adding tests and minor refactors * Adding tests and minor refactors * Adding tests and minor refactors * reverting some changes to package.json * reverting some changes to package.json * Removing comments that are not relevant * Adding build script to transpile the code into js * Adding proper support for husky * Reverting Changes to Readme * Removing uneeded ignore * Quick refactor to get ready for pointset messages * Adding refacotored code * Removing old code * Adding sample messages and cleaning arguments * Adding Point model and building logic * Adding logic and tests for building of point document * Adding logic to handle pointset messages * Adding logic to handle pointset messages * fixing failed merge attempt * fixing failed merge attempt * Fixing sample messages for pointset and docs * Adding files and instructions to make dev easier * Cleaning readme * Refactoring based on comments during demo yesterday * Updating readme: * updating instructions and enhancing model * Cleaning up code to use codes provided. Friendly names will have to be dealt with in another story * Fixing case in import statement * GCP Function work * Configured cloud function deployment * Setup env variables * Changed env varible * set up env variable * cleanup googlefunction variables * updated event handler function * Removed license from package.json * updated env varibles * testing event-handler ci * testing ci * Fixing static data pagination by using correct variable (#174) * Fixing static data pagination by using correct variable * Fixing static data pagination by using correct variable * testing gcf ci * testing gcf ci * testing gcf ci * Handle repetitive pointset messages (#173) * Handling repetitive messages * Commiting missed file * Handling repetitive calls to update points * Fixing code according to comments * enabled automatic deployment in staging * changing mongo host * updating Mongo-host * testing gcf ci * removing uneeded zip (#177) * testing ci/cd for gcf * testing ci/cd for gcf * ci/cd/gcf * testing gcf/ci/cd * testing gcf * creating ci/cd/gcf * testing ci/cd-gcf * testing ci/cd * changing mongo access admin to udmi * updated variable in api * Adding log to see incoming message (#190) * Fixed readme * Update README.md * Add log to help debug (#191) * Adding log to see incoming message * Update Readme * updated variable * Fixing env var key for mongor password (#193) * updating mongo_host * Fix env var (#195) * Fixing env var key for mongor password * Using the env variable to match what CI/CD sets * Fixing the data so that the tags and points are populated with empty arrays to start (#196) * Fixing data (#197) * Fixing the data so that the tags and points are populated with empty arrays to start * MAking sure points don't get defaulted to empty * MAking sure points don't get defaulted to empty * changed usage of @import to @use * #1177-added details about envs * Handle env variable by not throwing exception if the var is not available (#200) * #1179-removed state from devices service * #1179-fixed tests, removed use of fragments for testing purposes * #1182-changed the filter icon * #1181-changed theme colors, adjusted nav * #1180-moved search filter down * #1180-made clear filters work * #1180-fixed clearing/opening/closing autocomplete * #1180-made ux behave nicer for autocomplete when clearing * #1180-adjusted comments * #1180-adjusted tests * #1180-added test for when clearing all filters * #1180-removed unused css import * Terraform adjustments for successful deployment * Removed Creds * Updated gitignore * Fixed build issue in gcp * Adjust scripts and readmes (#205) * adding new scripts and adjusting readme's * updating files * update README, build scripts for web and api * updating files * updating file * modify api readme * Updated docker build scripts and readme. * Updated readme and scripts for helm * Updated readmes and scripts for UDMIF deployment * Removed transient files adjust-scripts-and-readmes # Your branch is up to date with 'origin/adjust-scripts-and-readmes'. # # Changes to be committed: # deleted: terraform.tfvars # deleted: udmi-sites.tf # * removed transient main.tf * Updated .gitignore * Updating API readme * Removing references to okta * updating readme Co-authored-by: Mohit Sharma Co-authored-by: Patrick Carriere * Rename jest mongodb config file (#207) * Renaming jest config file * Renaming jest config file * Introducing a docker container to run tests (#208) * Introducing a docker container to run tests * Fixing messages and renaming container so it does not clash with container from buildDocker.sh * removing devices.json from branch, this can be generated when needed * Handle validation message (#209) * Adding logic to handle validation message, TODO: save validation message * not allowing validation events to be handled, will implmenent at a later date * Removing uneeded const * Fixing test, removing uneeded whitespace and moved logic to class * Fixing test, removing uneeded whitespace and moved logic to class * Handle validation message (#210) * Adding logic to handle validation message, TODO: save validation message * not allowing validation events to be handled, will implmenent at a later date * Removing uneeded const * Fixing test, removing uneeded whitespace and moved logic to class * Fixing test, removing uneeded whitespace and moved logic to class * Moving model into a model folder and intnroducing Validation as a model * implemented the main logic to populate validation in device document * Adding test cases and sample messages * Removing old files * Cleaning sonarlint issues * Removing duplicate catch block * Removing duplicate catch block * Fixing tests * Addressing code review comments * Fixing test * Updating readme * Adding docs to classes * Update device key (#211) * Adding logic to handle validation message, TODO: save validation message * not allowing validation events to be handled, will implmenent at a later date * Removing uneeded const * Fixing test, removing uneeded whitespace and moved logic to class * Fixing test, removing uneeded whitespace and moved logic to class * Moving model into a model folder and intnroducing Validation as a model * implemented the main logic to populate validation in device document * Adding test cases and sample messages * Removing old files * Cleaning sonarlint issues * Removing duplicate catch block * Removing duplicate catch block * Fixing tests * Addressing code review comments * Fixing test * Updating readme * Adding docs to classes * Forcing husky to run * initial commit to update device key * fixing husky * handling braoder set of incoming validation messages (#212) * Handling basic site message, refactored to remove duplicated logic (#213) * Handling basic site message, refactored to remove duplicated logic * Fixing docs and return types * linting json in sample_messages * linting json in sample_messages * linting json in sample_messages * adding return type * Handle site errors (#216) * Handling basic site message, refactored to remove duplicated logic * Fixing docs and return types * linting json in sample_messages * linting json in sample_messages * linting json in sample_messages * adding return type * Adding errorDevices to a site * removing unused docs and useless await * #1341-setup the sites screen * #1341-fixed tests * #1341-added :void * #1341-renamed the sites query and created a proper sites query * #1341-fixed/added tests * #1341-created a generic dao * #1341-moved folders around * #1341-added lodash lib, moved out common logic * #1341-adjusted imports * #1341-fixed tests * #1341-added tests * #1341-added more tests * #1341-renamed searchOptions type * #1341-fixed tests * Persisting all Site Validation Messages (#219) * Persisting all Site Validation Messages * Fixing docs * Removing uneeded test * Renaming test classes and util classes * Saving the last message on the site * Saving the last message on the site * Adding creation of time_series collection in automated way * Making sure that collection is created by using an await * Using cleaner code and removing uneeded setup calls * removing uneeded existence check * Adding device validation history (#221) * Persisting all Site Validation Messages * Fixing docs * Removing uneeded test * Renaming test classes and util classes * Saving the last message on the site * Saving the last message on the site * Adding creation of time_series collection in automated way * Making sure that collection is created by using an await * introducing a DAO interface in front of MongoDAO * updating package.json * Fixing test * Adding handling of Device History * reverting api change * Adding device validation history (#222) * Persisting all Site Validation Messages * Fixing docs * Removing uneeded test * Renaming test classes and util classes * Saving the last message on the site * Saving the last message on the site * Adding creation of time_series collection in automated way * Making sure that collection is created by using an await * introducing a DAO interface in front of MongoDAO * updating package.json * Fixing test * Adding handling of Device History * reverting api change * cleaning up to get ready for an alternate DAO * Resolving merge conflicts and renaming UdmiMessage to UdmiEvent in all the code * Removing string 'message' and replacing with 'data' * Removing string 'message' and replacing with 'data' * Renaming for consistency * #1367-added more columns to sites list view by adding fields to schema * #1367-fixing linting * #1367-testing git hook * #1367-testing git hook * #1367-testing git hook * #1367-testing git hook * #1367-testing git hook * #1367-testing git hook * #1367-testing git hook * #1367-added type for data source * #1367-refactored sitesDS * #1367-code cleanup * #1367-added tests * #1367-adjusting PR comments * #1403-added sorting paging and filtering * #1344-created site details page * #1344-default to first tab on site details screen * #1419-added navigation service to hold page title * #1419-added tests * #1418-added validation card * #1418-expose validation property on device and site * #1418-added tests * #1418-return value instead of undefined when not supplied to parse pipe * 1416-made devices component work stand alone and under sites * #1416-adjusted UI to supply filter on autocomplete options * #1416-adjusted API to handle filter on auto complete options * #1416-added tests * #1416-added tests for api * #1423-added resolved device fields * #1423-display more device columns * #1423-fixed web tests * #1423-added tests for api * #1447-added device errors view * #1447-added tests * #1457-removed concept of site id * #1457-fixed api * #1457-fixed tests * #1457-made Site have key field name * updating model to match expectations of api and ui (#231) * #1462-upgraded angular from 13 to 14 * #1462-upgraded angular material * #1462-upgraded social login * #1462-now redirect using guard * Handling validation event with a folder of type update (#234) * updated node version * updated node version * #1417-made rows expandable * #1417-added link of device name, made row clickable * #1417-removed row click * #1417-made errors details row simpler * #1417-added order by pipe * #1417-fixed tests * #1402-made site rows expandable * #1402-cleaned up code * Making sure null point units do not throw an exception in the API (#237) * #1402-added count of top errors * #1402-added tests * #1402-expose API to return device errors on a site * #1527-changed columns to be objects * #1609-logout user after idToken expires, properly display device details * #1609-adjusted site details to be consistent with table * #1605-table cell now breaks word * #1605-made devices operational field not always show no when null * fixing merge * removed gcp build yml file * #1801-now store pointset timestamps on device as last updated * #1801-added new line in gitignore at end of file * #1987-added percent fields on site, removed pubber changes * #1987-added fields to API * 1987-added tests to api * #1987-adjusted web tests * removed lock file Co-authored-by: naveenl-biot <100786018+naveenlakshmi@users.noreply.github.com> Co-authored-by: Marc Spratt Co-authored-by: naveen30 Co-authored-by: Patrick Carriere Co-authored-by: Narmadha Koti Co-authored-by: nkotibiot <100785762+nkotibiot@users.noreply.github.com> Co-authored-by: slevertbiot <51381583+slevertbiot@users.noreply.github.com> Co-authored-by: slevert Co-authored-by: Mohit Sharma --- udmif/api/package.json | 2 +- .../site/__snapshots__/resolve.spec.ts.snap | 7 +- udmif/api/src/__tests__/site/resolve.spec.ts | 5 +- udmif/api/src/site/model.ts | 22 +- udmif/api/src/site/resolvers.ts | 40 +- udmif/api/src/site/schema.graphql | 12 +- udmif/api/tsconfig.json | 4 +- udmif/api/util/siteUtil.ts | 17 + udmif/event-handler/.gitignore | 11 +- udmif/event-handler/package-lock.json | 1430 +---------------- .../device/DeviceDocumentUtils.spec.ts | 20 +- .../src/device/DeviceDocumentUtils.ts | 2 +- udmif/event-handler/src/model/UdmiEvent.ts | 1 + udmif/web/src/app/site/site.component.html | 10 +- udmif/web/src/app/site/site.component.spec.ts | 1 - udmif/web/src/app/site/site.constants.ts | 2 +- udmif/web/src/app/site/site.d.ts | 5 +- udmif/web/src/app/site/site.gql.ts | 5 +- udmif/web/src/app/site/site.service.spec.ts | 5 +- udmif/web/src/app/sites/sites.component.html | 18 +- .../web/src/app/sites/sites.component.spec.ts | 1 - udmif/web/src/app/sites/sites.constants.ts | 12 +- udmif/web/src/app/sites/sites.gql.ts | 5 +- udmif/web/src/app/sites/sites.service.spec.ts | 5 +- 24 files changed, 215 insertions(+), 1427 deletions(-) create mode 100644 udmif/api/util/siteUtil.ts diff --git a/udmif/api/package.json b/udmif/api/package.json index 00479b4e21..758009b781 100644 --- a/udmif/api/package.json +++ b/udmif/api/package.json @@ -39,6 +39,6 @@ "production": "NODE_ENV=production node -r ts-node/register src/app.ts" }, "lint-staged": { - "src/**/*.{ts,tsx,json}": "prettier --single-quote --arrow-parens always --trailing-comma es5 --print-width 120 --write" + "{src,util}/**/*.{ts,tsx,json}": "prettier --single-quote --arrow-parens always --trailing-comma es5 --print-width 120 --write" } } 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 0794c0e5a7..cba76d9323 100644 --- a/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap +++ b/udmif/api/src/__tests__/site/__snapshots__/resolve.spec.ts.snap @@ -5,15 +5,18 @@ Object { "data": Object { "site": Object { "correctDevicesCount": 1, + "correctDevicesPercent": 0.25, "deviceErrors": Array [], "errorDevicesCount": 1, + "errorDevicesPercent": 0.25, "extraDevicesCount": 0, "lastValidated": "2022-07-16T18:27:19Z", "missingDevicesCount": 2, + "missingDevicesPercent": 0.5, "name": "LOC-1", - "percentValidated": 0.4, + "seenDevicesCount": 10, "totalDeviceErrorsCount": 0, - "totalDevicesCount": 10, + "totalDevicesCount": 4, "validation": "{\\"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/__tests__/site/resolve.spec.ts b/udmif/api/src/__tests__/site/resolve.spec.ts index 7bda204bf1..bca6aa87fb 100644 --- a/udmif/api/src/__tests__/site/resolve.spec.ts +++ b/udmif/api/src/__tests__/site/resolve.spec.ts @@ -33,13 +33,16 @@ const QUERY_SITE = gql` query { site(name: "00000000-0000-0000-0000-0000000001") { name + seenDevicesCount totalDevicesCount correctDevicesCount + correctDevicesPercent missingDevicesCount + missingDevicesPercent errorDevicesCount + errorDevicesPercent extraDevicesCount lastValidated - percentValidated deviceErrors { timestamp message diff --git a/udmif/api/src/site/model.ts b/udmif/api/src/site/model.ts index 81d7163b1f..f3a4bc8b03 100644 --- a/udmif/api/src/site/model.ts +++ b/udmif/api/src/site/model.ts @@ -16,5 +16,25 @@ export interface SiteArgs { export interface Site { name: string; - validation?: any; + validation?: SiteValidation; } + +export type SiteValidation = { + timestamp?: string; + version?: string; + last_updated: string; + status?: { + message: string; + detail?: string; + category: string; + timestamp: string; + level: number; + }; + summary: { + correct_devices?: string[]; + extra_devices?: string[]; + missing_devices?: string[]; + error_devices?: string[]; + }; + devices: any; //TODO:: +}; diff --git a/udmif/api/src/site/resolvers.ts b/udmif/api/src/site/resolvers.ts index b885feaf80..00d07fe9d0 100644 --- a/udmif/api/src/site/resolvers.ts +++ b/udmif/api/src/site/resolvers.ts @@ -1,4 +1,9 @@ -import { sum } from 'lodash'; +import { + getCorrectDevicesCount, + getErrorDevicesCount, + getMissingDevicesCount, + getTotalDevicesCount, +} from '../../util/siteUtil'; import { DistinctArgs } from '../common/model'; import { ApolloContext } from '../server/datasources'; import { Site, SiteArgs, SitesArgs } from './model'; @@ -16,17 +21,29 @@ export const resolvers = { }, }, Site: { - totalDevicesCount: async (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { + seenDevicesCount: async (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { return (await deviceDS.getDevicesBySite(site.name)).totalFilteredCount; }, + totalDevicesCount: async (site: Site) => { + return getTotalDevicesCount(site); + }, correctDevicesCount: (site: Site) => { - return site.validation?.summary.correct_devices?.length ?? 0; + return getCorrectDevicesCount(site); + }, + correctDevicesPercent: (site: Site) => { + return getCorrectDevicesCount(site) / (getTotalDevicesCount(site) || 1); }, missingDevicesCount: (site: Site) => { - return site.validation?.summary.missing_devices?.length ?? 0; + return getMissingDevicesCount(site); + }, + missingDevicesPercent: (site: Site) => { + return getMissingDevicesCount(site) / (getTotalDevicesCount(site) || 1); }, errorDevicesCount: (site: Site) => { - return site.validation?.summary.error_devices?.length ?? 0; + return getErrorDevicesCount(site); + }, + errorDevicesPercent: (site: Site) => { + return getErrorDevicesCount(site) / (getTotalDevicesCount(site) || 1); }, extraDevicesCount: (site: Site) => { return site.validation?.summary.extra_devices?.length ?? 0; @@ -34,19 +51,6 @@ export const resolvers = { 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) - ); - }, deviceErrors: (site: Site, _args, { dataSources: { deviceDS } }: ApolloContext) => { return deviceDS.getDeviceErrorsBySite(site.name); }, diff --git a/udmif/api/src/site/schema.graphql b/udmif/api/src/site/schema.graphql index c5a87e77ae..ba6a54934a 100644 --- a/udmif/api/src/site/schema.graphql +++ b/udmif/api/src/site/schema.graphql @@ -22,20 +22,26 @@ type DeviceError { type Site { # Name of the site name: String! - # Total number of devices associated to the site + # Total devices seen by UDMIF on the site + seenDevicesCount: Int! + # Total number of devices on the site; correct + missing + error totalDevicesCount: Int! # Number of correct devices in the message correctDevicesCount: Int! + # Percent of correct devices in the message + correctDevicesPercent: Float! # Number of missing devices in the message missingDevicesCount: Int! + # Percent of error devices in the message + missingDevicesPercent: Float! # Number of error devices in the message errorDevicesCount: Int! + # Percent of extra devices in the message + errorDevicesPercent: Float! # 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 deviceErrors: [DeviceError!]! # Total number of errors across all devices diff --git a/udmif/api/tsconfig.json b/udmif/api/tsconfig.json index 04ec2a1035..c13497d746 100644 --- a/udmif/api/tsconfig.json +++ b/udmif/api/tsconfig.json @@ -10,12 +10,12 @@ "paths": { "*": [ "node_modules/*", - "src/types/*" ] } }, "include": [ - "src/**/*" + "src/**/*", + "util/**/*" ], "exclude": [ "node_modules" diff --git a/udmif/api/util/siteUtil.ts b/udmif/api/util/siteUtil.ts new file mode 100644 index 0000000000..55dc34ce1f --- /dev/null +++ b/udmif/api/util/siteUtil.ts @@ -0,0 +1,17 @@ +import { Site } from '../src/site/model'; + +export const getCorrectDevicesCount = (site: Site): number => { + return site.validation?.summary?.correct_devices?.length ?? 0; +}; + +export const getMissingDevicesCount = (site: Site): number => { + return site.validation?.summary?.missing_devices?.length ?? 0; +}; + +export const getErrorDevicesCount = (site: Site): number => { + return site.validation?.summary?.error_devices?.length ?? 0; +}; + +export const getTotalDevicesCount = (site: Site): number => { + return getCorrectDevicesCount(site) + getMissingDevicesCount(site) + getErrorDevicesCount(site); +}; diff --git a/udmif/event-handler/.gitignore b/udmif/event-handler/.gitignore index 7b2d76ab7e..1d926bb54d 100644 --- a/udmif/event-handler/.gitignore +++ b/udmif/event-handler/.gitignore @@ -15,12 +15,15 @@ globalConfig.json # System files .DS_Store -# environment variables +# Environment variables setupEnv.sh -# mongo output +# Mongo output .mongodb -#Build specific files +# Build specific files dist/ -credentials.json \ No newline at end of file +credentials.json + +# Test output +test-report.html diff --git a/udmif/event-handler/package-lock.json b/udmif/event-handler/package-lock.json index 60223a66e8..e82f4416c3 100644 --- a/udmif/event-handler/package-lock.json +++ b/udmif/event-handler/package-lock.json @@ -22,7 +22,7 @@ "jest": "^27.4.7", "jest-junit": "^13.0.0", "lint-staged": "^12.2.2", - "nodemon": "^2.0.16", + "nodemon": "^2.0.19", "prettier": "^2.5.1", "ts-jest": "^27.1.3", "ts-node": "^10.4.0", @@ -2052,15 +2052,6 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.31.tgz", "integrity": "sha512-uWZaAsh9WFhcY1rWLLcMU/omiIIAQ/PmgqplaF6UWY6ULPH0ZO8hupJRAydzlTQZJIK3Voz8o8dYlEx+Cm6BAA==" }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -2092,18 +2083,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -2476,44 +2455,6 @@ } } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2834,81 +2775,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3038,48 +2904,6 @@ "node": ">= 0.8" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -3192,18 +3016,6 @@ "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3268,15 +3080,6 @@ "node": ">=8" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/cloudevents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", @@ -3405,23 +3208,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3517,15 +3303,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -3602,32 +3379,11 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3641,12 +3397,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3732,24 +3482,6 @@ "node": ">=8" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3869,15 +3601,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4329,21 +4052,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -4352,40 +4060,6 @@ "node": ">=4" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -4445,15 +4119,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -4476,12 +4141,6 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -4582,15 +4241,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -4640,15 +4290,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -4750,24 +4391,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "node_modules/is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -4850,22 +4473,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4878,18 +4485,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4913,24 +4508,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -5038,12 +4615,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5960,12 +5531,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5996,15 +5561,6 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6013,18 +5569,6 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6314,15 +5858,6 @@ "node": ">=8" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6449,15 +5984,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6821,22 +6347,21 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "node_modules/nodemon": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", - "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" + "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" @@ -6932,15 +6457,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -7053,15 +6569,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -7110,21 +6617,6 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -7240,15 +6732,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -7327,16 +6810,6 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -7345,18 +6818,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", @@ -7380,47 +6841,17 @@ }, "node_modules/raw-body": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, "node_modules/react-is": { @@ -7549,30 +6980,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", @@ -7666,15 +7073,6 @@ "node": ">=10" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -7779,18 +7177,6 @@ "semver": "bin/semver.js" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", @@ -7895,6 +7281,27 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/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/sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -8329,15 +7736,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8658,18 +8056,6 @@ "node": ">=4" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -8712,67 +8098,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8782,18 +8107,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -8989,47 +8302,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -9116,15 +8388,6 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -10644,12 +9907,6 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.31.tgz", "integrity": "sha512-uWZaAsh9WFhcY1rWLLcMU/omiIIAQ/PmgqplaF6UWY6ULPH0ZO8hupJRAydzlTQZJIK3Voz8o8dYlEx+Cm6BAA==" }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -10681,15 +9938,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==" }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -11024,40 +10272,6 @@ "ajv": "^8.0.0" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -11305,59 +10519,6 @@ } } }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -11438,41 +10599,9 @@ }, "bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true }, "call-bind": { "version": "1.0.2", @@ -11544,12 +10673,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11601,15 +10724,6 @@ } } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "cloudevents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-6.0.1.tgz", @@ -11712,20 +10826,6 @@ } } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -11806,12 +10906,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -11866,26 +10960,11 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -11896,12 +10975,6 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -11962,21 +11035,6 @@ } } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -12072,12 +11130,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -12420,50 +11472,11 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -12502,12 +11515,6 @@ "has-symbols": "^1.0.2" } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -12527,12 +11534,6 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -12595,12 +11596,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -12635,12 +11630,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -12712,23 +11701,6 @@ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - } - } - }, "is-core-module": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", @@ -12781,28 +11753,12 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -12817,18 +11773,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -12900,12 +11844,6 @@ "call-bind": "^1.0.2" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -13614,12 +12552,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -13644,29 +12576,11 @@ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==" }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -13880,12 +12794,6 @@ } } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -13976,12 +12884,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14273,21 +13175,21 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "nodemon": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", - "integrity": "sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" + "undefsafe": "^2.0.5" }, "dependencies": { "debug": { @@ -14356,12 +13258,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -14444,12 +13340,6 @@ "word-wrap": "~1.2.3" } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -14480,18 +13370,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -14574,12 +13452,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "prettier": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", @@ -14639,30 +13511,11 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", @@ -14687,32 +13540,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -14816,24 +13643,6 @@ "unicode-match-property-value-ecmascript": "^2.0.0" } }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", @@ -14899,15 +13708,6 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==" }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -14982,15 +13782,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, "send": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", @@ -15084,6 +13875,23 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "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 + } + } + }, "sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -15413,12 +14221,6 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15626,15 +14428,6 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -15655,54 +14448,6 @@ "picocolors": "^1.0.0" } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15712,15 +14457,6 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "util": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", @@ -15879,40 +14615,6 @@ "is-typed-array": "^1.1.7" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -15972,12 +14674,6 @@ "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "requires": {} }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", diff --git a/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts b/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts index fa39479bd7..14ba6fa52a 100644 --- a/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts +++ b/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts @@ -92,11 +92,12 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { }); test('creates a device document when existing points are undefined', () => { + const timestamp: string = '2022-04-25T17:00:26Z'; // arrange const inputEvent: UdmiEvent = { attributes: { ...BASIC_POINTSET_ATTRIBUTES }, data: { - timestamp: '2022-04-25T17:00:26Z', + timestamp, points: { [faps]: { present_value: 78 }, [fdpsp]: { present_value: 71 }, @@ -111,18 +112,19 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { { name: fdps, id: fdps, value: '82', meta: { code: fdps }, state }, ]; - const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints }; + const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints, lastPayload: timestamp }; // act and assert expect(createDevice(inputEvent, undefined)).toEqual(expectedDevice); }); test('creates a device document with pointset', () => { + const timestamp: string = '2022-04-25T17:00:26Z'; // arrange const inputEvent: UdmiEvent = { attributes: { ...BASIC_POINTSET_ATTRIBUTES }, data: { - timestamp: '2022-04-25T17:00:26Z', + timestamp, points: { [faps]: { present_value: 78 }, [fdpsp]: { present_value: 71 }, @@ -137,7 +139,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { { name: fdps, id: fdps, value: '82', meta: { code: fdps }, state }, ]; - const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints }; + const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints, lastPayload: timestamp }; // act and assert expect(createDevice(inputEvent, existingPoints)).toEqual(expectedDevice); @@ -176,6 +178,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { }); test('creates a device document with pointset state', () => { + const timestamp: string = '2022-04-25T17:00:26Z'; // arrange const inputEvent: UdmiEvent = { attributes: { ...BASIC_POINTSET_ATTRIBUTES, subType: STATE }, @@ -185,7 +188,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { [fdpsp]: {}, [fdps]: {}, }, - timestamp: '2022-04-25T17:00:26Z', + timestamp, }, }; @@ -194,7 +197,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { { name: fdpsp, id: fdpsp, meta: { code: fdpsp }, state }, { name: fdps, id: fdps, meta: { code: fdps }, state }, ]; - const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints }; + const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints, lastPayload: timestamp }; // act and assert expect(createDevice(inputEvent, existingPoints)).toEqual(expectedDevice); @@ -225,6 +228,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { }); test('merges a device document with pointset', () => { + const timestamp: string = '2022-04-25T17:00:26Z'; // existing point has units and a value existingPoints.push(getFapsPoint('70', 'Bars')); @@ -232,7 +236,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { const inputEvent: UdmiEvent = { attributes: { ...BASIC_POINTSET_ATTRIBUTES }, data: { - timestamp: '2022-04-25T17:00:26Z', + timestamp, points: { [faps]: { present_value: 78 }, [fdpsp]: { present_value: 71 }, @@ -247,7 +251,7 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { { name: fdps, id: fdps, value: '82', meta: { code: fdps }, state }, ]; - const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints }; + const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints, lastPayload: timestamp }; // act and assert expect(createDevice(inputEvent, existingPoints)).toEqual(expectedDevice); diff --git a/udmif/event-handler/src/device/DeviceDocumentUtils.ts b/udmif/event-handler/src/device/DeviceDocumentUtils.ts index b8dff0041c..6bfb3991e2 100644 --- a/udmif/event-handler/src/device/DeviceDocumentUtils.ts +++ b/udmif/event-handler/src/device/DeviceDocumentUtils.ts @@ -87,7 +87,7 @@ function buildDeviceDocumentFromPointset( points.push(point); } - return deviceBuilder.points(points).build(); + return deviceBuilder.points(points).lastPayload(udmiEvent.data.timestamp).build(); } export function buildPoint(udmiEvent: UdmiEvent, existingPoint: Point, pointCode: string): Point { diff --git a/udmif/event-handler/src/model/UdmiEvent.ts b/udmif/event-handler/src/model/UdmiEvent.ts index 398e4c68cb..0381e1a9d7 100644 --- a/udmif/event-handler/src/model/UdmiEvent.ts +++ b/udmif/event-handler/src/model/UdmiEvent.ts @@ -13,6 +13,7 @@ export interface UdmiEvent { export interface PointsetEvent extends UdmiEvent { data: { // pointset + timestamp?: string; points?: any; }; } diff --git a/udmif/web/src/app/site/site.component.html b/udmif/web/src/app/site/site.component.html index 98168172fb..e495b74da8 100644 --- a/udmif/web/src/app/site/site.component.html +++ b/udmif/web/src/app/site/site.component.html @@ -7,8 +7,14 @@

{{ site?.lastValidated | date: 'MM/dd/yy h:mm a' }}

- -

{{ site?.percentValidated | percent: '1.0-2' }}

+ +

{{ site?.correctDevicesCount }} ({{ site?.correctDevicesPercent | percent: '1.0-2' }})

+
+ +

{{ site?.missingDevicesCount }} ({{ site?.missingDevicesPercent | percent: '1.0-2' }})

+
+ +

{{ site?.errorDevicesCount }} ({{ site?.errorDevicesPercent | percent: '1.0-2' }})

{{ site?.[field.value] }}

diff --git a/udmif/web/src/app/site/site.component.spec.ts b/udmif/web/src/app/site/site.component.spec.ts index 31283c753f..e7801019c7 100644 --- a/udmif/web/src/app/site/site.component.spec.ts +++ b/udmif/web/src/app/site/site.component.spec.ts @@ -22,7 +22,6 @@ describe('SiteComponent', () => { errorDevicesCount: 0, extraDevicesCount: 0, lastValidated: '2022-04-24T02:54:51Z', - percentValidated: 0, totalDeviceErrorsCount: 0, validation: '', }; diff --git a/udmif/web/src/app/site/site.constants.ts b/udmif/web/src/app/site/site.constants.ts index df00fd44e2..b9b330899f 100644 --- a/udmif/web/src/app/site/site.constants.ts +++ b/udmif/web/src/app/site/site.constants.ts @@ -10,13 +10,13 @@ export class SiteConstants { public siteDetails: SiteDetail[] = intersectionBy( this.sitesConstants.siteColumns, (<(keyof SiteModel)[]>[ + 'seenDevicesCount', 'totalDevicesCount', 'correctDevicesCount', 'missingDevicesCount', 'errorDevicesCount', 'extraDevicesCount', 'lastValidated', - 'percentValidated', 'totalDeviceErrorsCount', ]).map((value) => ({ value })), 'value' diff --git a/udmif/web/src/app/site/site.d.ts b/udmif/web/src/app/site/site.d.ts index 83e33ca6e2..31d343a313 100644 --- a/udmif/web/src/app/site/site.d.ts +++ b/udmif/web/src/app/site/site.d.ts @@ -2,13 +2,16 @@ import { DeviceError } from '../device-errors/device-errors'; interface SiteModel { name: string; + seenDevicesCount: number; totalDevicesCount: number; correctDevicesCount: number; + correctDevicesPercent: number; missingDevicesCount: number; + missingDevicesPercent: number; errorDevicesCount: number; + errorDevicesPercent: number; extraDevicesCount: number; lastValidated: string; - percentValidated: number; deviceErrors: DeviceError[]; totalDeviceErrorsCount: number; validation: string; diff --git a/udmif/web/src/app/site/site.gql.ts b/udmif/web/src/app/site/site.gql.ts index e44a9df814..edab746e99 100644 --- a/udmif/web/src/app/site/site.gql.ts +++ b/udmif/web/src/app/site/site.gql.ts @@ -4,13 +4,16 @@ export const GET_SITE = gql` query GetSite($name: String!) { site(name: $name) { name + seenDevicesCount totalDevicesCount correctDevicesCount + correctDevicesPercent missingDevicesCount + missingDevicesPercent errorDevicesCount + errorDevicesPercent extraDevicesCount lastValidated - percentValidated totalDeviceErrorsCount validation } diff --git a/udmif/web/src/app/site/site.service.spec.ts b/udmif/web/src/app/site/site.service.spec.ts index 8ce1ef95c8..e08acfa94b 100644 --- a/udmif/web/src/app/site/site.service.spec.ts +++ b/udmif/web/src/app/site/site.service.spec.ts @@ -28,13 +28,16 @@ describe('SiteService', () => { const mockSiteResponse: SiteQueryResponse = { site: { name: 'site one', + seenDevicesCount: 0, totalDevicesCount: 0, correctDevicesCount: 0, + correctDevicesPercent: 0, missingDevicesCount: 0, + missingDevicesPercent: 0, errorDevicesCount: 0, + errorDevicesPercent: 0, extraDevicesCount: 0, lastValidated: '2022-04-24T02:54:51Z', - percentValidated: 0, totalDeviceErrorsCount: 0, validation: '', }, diff --git a/udmif/web/src/app/sites/sites.component.html b/udmif/web/src/app/sites/sites.component.html index 61e00a6abc..af8d061f05 100644 --- a/udmif/web/src/app/sites/sites.component.html +++ b/udmif/web/src/app/sites/sites.component.html @@ -35,12 +35,24 @@ >{{ element.name }}
+ + {{ element.correctDevicesCount }} ({{ element.correctDevicesPercent | percent: '1.0-2' }}) + + + {{ element.missingDevicesCount }} ({{ element.missingDevicesPercent | percent: '1.0-2' }}) + + + {{ element.errorDevicesCount }} ({{ element.errorDevicesPercent | percent: '1.0-2' }}) + {{ element.lastValidated | date: 'MM/dd/yy h:mm a' }} - - {{ element.percentValidated | percent: '1.0-2' }} - {{ element.totalDeviceErrorsCount }} diff --git a/udmif/web/src/app/sites/sites.component.spec.ts b/udmif/web/src/app/sites/sites.component.spec.ts index 22765fe6cd..31eb1f748d 100644 --- a/udmif/web/src/app/sites/sites.component.spec.ts +++ b/udmif/web/src/app/sites/sites.component.spec.ts @@ -26,7 +26,6 @@ describe('SitesComponent', () => { errorDevicesCount: 0, extraDevicesCount: 0, lastValidated: '2022-04-24T02:54:51Z', - percentValidated: 0, deviceErrors: [], totalDeviceErrorsCount: 0, }, diff --git a/udmif/web/src/app/sites/sites.constants.ts b/udmif/web/src/app/sites/sites.constants.ts index 74f36619f4..eb892cfc40 100644 --- a/udmif/web/src/app/sites/sites.constants.ts +++ b/udmif/web/src/app/sites/sites.constants.ts @@ -11,9 +11,14 @@ export class SitesConstants { label: 'Name', isSortable: true, }, + { + value: 'seenDevicesCount', + label: 'Seen Devices', + isSortable: false, + }, { value: 'totalDevicesCount', - label: 'Devices', + label: 'Total Devices', isSortable: false, }, { @@ -41,11 +46,6 @@ export class SitesConstants { label: 'Last Validated', isSortable: false, }, - { - value: 'percentValidated', - label: '% Validated', - isSortable: false, - }, { value: 'totalDeviceErrorsCount', label: 'Device Errors', diff --git a/udmif/web/src/app/sites/sites.gql.ts b/udmif/web/src/app/sites/sites.gql.ts index ea1c015290..67aa15ddbe 100644 --- a/udmif/web/src/app/sites/sites.gql.ts +++ b/udmif/web/src/app/sites/sites.gql.ts @@ -5,13 +5,16 @@ export const GET_SITES = gql` sites(searchOptions: $searchOptions) { sites { name + seenDevicesCount totalDevicesCount correctDevicesCount + correctDevicesPercent missingDevicesCount + missingDevicesPercent errorDevicesCount + errorDevicesPercent extraDevicesCount lastValidated - percentValidated deviceErrors { message timestamp diff --git a/udmif/web/src/app/sites/sites.service.spec.ts b/udmif/web/src/app/sites/sites.service.spec.ts index cfff46c4f2..b56356035a 100644 --- a/udmif/web/src/app/sites/sites.service.spec.ts +++ b/udmif/web/src/app/sites/sites.service.spec.ts @@ -30,13 +30,16 @@ describe('SitesService', () => { sites: [ { name: 'site one', + seenDevicesCount: 0, totalDevicesCount: 0, correctDevicesCount: 0, + correctDevicesPercent: 0, missingDevicesCount: 0, + missingDevicesPercent: 0, errorDevicesCount: 0, + errorDevicesPercent: 0, extraDevicesCount: 0, lastValidated: '2022-04-24T02:54:51Z', - percentValidated: 0, deviceErrors: [], totalDeviceErrorsCount: 0, }, From af4c04bf33952e071d06ff3eb64c9d972b3304ff Mon Sep 17 00:00:00 2001 From: mspratt-biot <100383862+mspratt-biot@users.noreply.github.com> Date: Tue, 29 Nov 2022 09:52:10 -0500 Subject: [PATCH 2/3] #1800 last seen always empty (#246) * #1800-removed last seen from web and added more device fields * #1800-adjusted event handler to save more dates with respect to device and point messages * #1800-adjusted API to expose more date fields on a device, removed lastSeen * #1800-added '-' to indicate missing fields * #1800-swapped out || for ?? Co-authored-by: Marc Spratt --- udmif/api/package-lock.json | 13 ------- .../device/__snapshots__/resolve.spec.ts.snap | 5 ++- .../api/src/__tests__/device/resolve.spec.ts | 5 ++- udmif/api/src/device/model.ts | 4 ++ udmif/api/src/device/resolvers.ts | 3 -- udmif/api/src/device/schema.graphql | 10 ++++- .../device/DeviceDocumentUtils.spec.ts | 38 +++++++++++++++++-- .../src/device/DeviceDocumentUtils.ts | 15 +++++++- .../event-handler/src/device/model/Device.ts | 32 ++++++++++++++++ .../device-errors.component.html | 2 +- .../web/src/app/device/device.component.html | 18 +++++++-- udmif/web/src/app/device/device.constants.ts | 5 ++- udmif/web/src/app/device/device.d.ts | 5 ++- udmif/web/src/app/device/device.gql.ts | 5 ++- .../web/src/app/device/device.service.spec.ts | 5 ++- .../src/app/devices/devices-routing.module.ts | 10 +---- .../src/app/devices/devices.component.html | 5 +-- .../web/src/app/devices/devices.constants.ts | 21 ++++++++-- udmif/web/src/app/devices/devices.gql.ts | 1 - .../src/app/devices/devices.service.spec.ts | 1 - udmif/web/src/app/site/site.component.html | 2 +- udmif/web/src/app/sites/sites.component.html | 2 +- 22 files changed, 153 insertions(+), 54 deletions(-) diff --git a/udmif/api/package-lock.json b/udmif/api/package-lock.json index 3d0cc626f5..a5b3bf287f 100644 --- a/udmif/api/package-lock.json +++ b/udmif/api/package-lock.json @@ -8108,14 +8108,6 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, "node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", @@ -14631,11 +14623,6 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" - }, "whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", 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 3ed33dc000..e4cc64dd14 100644 --- a/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap +++ b/udmif/api/src/__tests__/device/__snapshots__/resolve.spec.ts.snap @@ -9,7 +9,10 @@ Object { "firmware": "v-1", "id": "00000000-0000-0000-0000-000000000001", "lastPayload": "2022-08-30", - "lastSeen": "2022-07-16T18:27:19Z", + "lastStateSaved": null, + "lastStateUpdated": null, + "lastTelemetrySaved": null, + "lastTelemetryUpdated": null, "level": 400, "make": "make-1", "message": "Tickity Boo", diff --git a/udmif/api/src/__tests__/device/resolve.spec.ts b/udmif/api/src/__tests__/device/resolve.spec.ts index eb00720076..0b0c4f4469 100644 --- a/udmif/api/src/__tests__/device/resolve.spec.ts +++ b/udmif/api/src/__tests__/device/resolve.spec.ts @@ -56,9 +56,12 @@ const QUERY_DEVICE = gql` level message details - lastSeen state errorsCount + lastStateUpdated + lastStateSaved + lastTelemetryUpdated + lastTelemetrySaved } } `; diff --git a/udmif/api/src/device/model.ts b/udmif/api/src/device/model.ts index 7935661fd3..afeed7e531 100644 --- a/udmif/api/src/device/model.ts +++ b/udmif/api/src/device/model.ts @@ -40,4 +40,8 @@ export interface Device { tags?: string[]; points?: Point[]; validation?: any; + lastStateUpdated?: string; + lastStateSaved?: string; + lastTelemetryUpdated?: string; + lastTelemetrySaved?: string; } diff --git a/udmif/api/src/device/resolvers.ts b/udmif/api/src/device/resolvers.ts index 4607f4a4d4..ed9a00ce08 100644 --- a/udmif/api/src/device/resolvers.ts +++ b/udmif/api/src/device/resolvers.ts @@ -40,9 +40,6 @@ export const resolvers = { details: async (device: Device, _args, { dataSources: { siteDS } }: ApolloContext) => { return (await siteDS.getSite(device.site))?.validation?.devices[device.name]?.status?.details; }, - lastSeen: async (device: Device, _args, { dataSources: { siteDS } }: ApolloContext) => { - return (await siteDS.getSite(device.site))?.validation?.devices[device.name]?.last_seen; - }, state: async (device: Device, _args, { dataSources: { siteDS } }: ApolloContext) => { const siteValidationSummary = (await siteDS.getSite(device.site))?.validation?.summary; diff --git a/udmif/api/src/device/schema.graphql b/udmif/api/src/device/schema.graphql index b6b233c275..b6f9bc50ab 100644 --- a/udmif/api/src/device/schema.graphql +++ b/udmif/api/src/device/schema.graphql @@ -60,8 +60,14 @@ type Device { message: String # message details from site validation message details: String - # date last seen from site validation message - lastSeen: String + # timestamp on a telemetry message + lastTelemetryUpdated: String + # timestamp on a device message + lastStateUpdated: String + # timestamp when telemetry was saved to db + lastTelemetrySaved: String + # timestamp when device was saved to db + lastStateSaved: String # the bin the device fell into during the site validation, i.e. correct, error, missing, or extra state: DEVICE_STATE # number of errors from device validation message diff --git a/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts b/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts index 14ba6fa52a..100eb04ade 100644 --- a/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts +++ b/udmif/event-handler/src/__tests__/device/DeviceDocumentUtils.spec.ts @@ -6,6 +6,10 @@ import { Point } from '../../device/model/Point'; import { Validation } from '../../model/Validation'; import { createEvent, DEVICE_VALIDATION_EVENT } from '../dataUtils'; +const today: string = '2022-11-01T09:09:09Z'; + +jest.useFakeTimers().setSystemTime(new Date(today)); + const name: string = 'name'; const site: string = 'site-1'; const id: string = 'num1'; @@ -50,6 +54,9 @@ describe('DeviceDocumentUtils.createDevice.system', () => { const operational: string = 'true'; const serialNumber: string = 'serial-no'; const firmware: string = 'v1'; + const lastPayload: string = '2022-03-21T13:19:32Z'; + const lastStateSaved: string = today; + const lastStateUpdated: string = '2022-03-21T13:19:32Z'; const inputEvent: UdmiEvent = { attributes: { ...BASIC_SYSTEM_ATTRIBUTES, subType: STATE }, @@ -58,22 +65,38 @@ describe('DeviceDocumentUtils.createDevice.system', () => { hardware: { make, model }, operational, serial_no: serialNumber, + timestamp: '2022-03-21T13:19:32Z', }, }; - const expectedDevice: Device = { name, site, id, make, model, operational, serialNumber, firmware, tags }; + const expectedDevice: Device = { + name, + site, + id, + make, + model, + operational, + serialNumber, + firmware, + tags, + lastPayload, + lastStateSaved, + lastStateUpdated, + }; expect(createDevice(inputEvent, [])).toEqual(expectedDevice); }); test('creates a device document with system model', () => { const section: string = 'section-a'; + const lastPayload: string = '2022-03-21T13:19:32Z'; const inputEvent: UdmiEvent = { attributes: { ...BASIC_SYSTEM_ATTRIBUTES, subType: MODEL }, data: { location: { section, site }, + timestamp: '2022-03-21T13:19:32Z', }, }; - const expectedDevice: Device = { name, section, site, id, tags }; + const expectedDevice: Device = { name, section, site, id, tags, lastPayload }; expect(createDevice(inputEvent, [])).toEqual(expectedDevice); }); }); @@ -197,7 +220,16 @@ describe('DeviceDocumentUtils.createDevice.pointset', () => { { name: fdpsp, id: fdpsp, meta: { code: fdpsp }, state }, { name: fdps, id: fdps, meta: { code: fdps }, state }, ]; - const expectedDevice: Device = { name, site, id, tags: [], points: expectedPoints, lastPayload: timestamp }; + const expectedDevice: Device = { + name, + site, + id, + tags: [], + points: expectedPoints, + lastPayload: timestamp, + lastTelemetrySaved: today, + lastTelemetryUpdated: timestamp, + }; // act and assert expect(createDevice(inputEvent, existingPoints)).toEqual(expectedDevice); diff --git a/udmif/event-handler/src/device/DeviceDocumentUtils.ts b/udmif/event-handler/src/device/DeviceDocumentUtils.ts index 6bfb3991e2..1c9d72fef9 100644 --- a/udmif/event-handler/src/device/DeviceDocumentUtils.ts +++ b/udmif/event-handler/src/device/DeviceDocumentUtils.ts @@ -1,5 +1,5 @@ import { DeviceBuilder, Device, DeviceKey, DeviceValidation } from './model/Device'; -import { isPointsetSubType, isSystemSubType, isValidationSubType } from '../EventUtils'; +import { isPointsetSubType, isSubType, isSystemSubType, isValidationSubType, STATE } from '../EventUtils'; import { PointsetEvent, SystemEvent, UdmiEvent, ValidationEvent } from '../model/UdmiEvent'; import { PointBuilder, Point } from './model/Point'; import { Validation, ValidationBuilder } from '../model/Validation'; @@ -50,6 +50,8 @@ function buildDeviceDocumentFromSystem(udmiEvent: SystemEvent, builder: DeviceBu .firmware(udmiEvent.data.software?.firmware) .section(udmiEvent.data.location?.section) .id(udmiEvent.attributes.deviceNumId) + .lastStateUpdated(isSubType(udmiEvent, STATE) ? udmiEvent.data.timestamp : null) + .lastStateSaved(isSubType(udmiEvent, STATE) ? getNow() : null) .build(); } @@ -87,7 +89,12 @@ function buildDeviceDocumentFromPointset( points.push(point); } - return deviceBuilder.points(points).lastPayload(udmiEvent.data.timestamp).build(); + return deviceBuilder + .points(points) + .lastPayload(udmiEvent.data.timestamp) + .lastTelemetryUpdated(isSubType(udmiEvent, STATE) ? udmiEvent.data.timestamp : null) + .lastTelemetrySaved(isSubType(udmiEvent, STATE) ? getNow() : null) + .build(); } export function buildPoint(udmiEvent: UdmiEvent, existingPoint: Point, pointCode: string): Point { @@ -108,3 +115,7 @@ export function buildPoint(udmiEvent: UdmiEvent, existingPoint: Point, pointCode .metaCode(pointCode) .build(); } + +function getNow() { + return new Date().toISOString().split('.')[0] + 'Z'; +} diff --git a/udmif/event-handler/src/device/model/Device.ts b/udmif/event-handler/src/device/model/Device.ts index eb1da6d866..a64e194bca 100644 --- a/udmif/event-handler/src/device/model/Device.ts +++ b/udmif/event-handler/src/device/model/Device.ts @@ -45,6 +45,10 @@ export interface Device { tags?: string[]; points?: Point[]; validation?: Validation; + lastTelemetryUpdated?: string; + lastStateUpdated?: string; + lastTelemetrySaved?: string; + lastStateSaved?: string; } export class DeviceBuilder { @@ -143,6 +147,34 @@ export class DeviceBuilder { return this; } + lastStateUpdated(timestamp: string): DeviceBuilder { + if (timestamp) { + this._document.lastStateUpdated = timestamp; + } + return this; + } + + lastStateSaved(timestamp: string): DeviceBuilder { + if (timestamp) { + this._document.lastStateSaved = timestamp; + } + return this; + } + + lastTelemetryUpdated(timestamp: string): DeviceBuilder { + if (timestamp) { + this._document.lastTelemetryUpdated = timestamp; + } + return this; + } + + lastTelemetrySaved(timestamp: string): DeviceBuilder { + if (timestamp) { + this._document.lastTelemetrySaved = timestamp; + } + return this; + } + build(): Device { if (this._document.site === '') { throw new InvalidEventError('Device site can not be empty'); diff --git a/udmif/web/src/app/device-errors/device-errors.component.html b/udmif/web/src/app/device-errors/device-errors.component.html index 640c79d1c3..848511d5dd 100644 --- a/udmif/web/src/app/device-errors/device-errors.component.html +++ b/udmif/web/src/app/device-errors/device-errors.component.html @@ -3,7 +3,7 @@ {{ columnName | capitalize }}
- {{ element.timestamp | date: 'MM/dd/yy h:mm a' }} + {{ element.timestamp | date: 'short' }}
{{ element[columnName] }}{{ field.label }} -

{{ device?.lastPayload | date: 'MM/dd/yy h:mm a' }}

+

{{ (device?.lastPayload | date: 'short') ?? '-' }}

- -

{{ device?.lastSeen | date: 'MM/dd/yy h:mm a' }}

+ +

{{ (device?.lastStateUpdated | date: 'short') ?? '-' }}

+
+ +

{{ (device?.lastStateSaved | date: 'short') ?? '-' }}

+
+ +

{{ (device?.lastTelemetryUpdated | date: 'short') ?? '-' }}

+
+ +

{{ (device?.lastTelemetrySaved | date: 'short') ?? '-' }}

Yes No + -

-

{{ device?.[field.value] }}

+

{{ device?.[field.value] ?? '-' }}

diff --git a/udmif/web/src/app/device/device.constants.ts b/udmif/web/src/app/device/device.constants.ts index 9ed6aa9041..21f7b82daa 100644 --- a/udmif/web/src/app/device/device.constants.ts +++ b/udmif/web/src/app/device/device.constants.ts @@ -19,7 +19,10 @@ export class DeviceConstants { 'serialNumber', 'firmware', 'state', - 'lastSeen', + 'lastStateUpdated', + 'lastStateSaved', + 'lastTelemetryUpdated', + 'lastTelemetrySaved', 'errorsCount', ]).map((value) => ({ value })), 'value' diff --git a/udmif/web/src/app/device/device.d.ts b/udmif/web/src/app/device/device.d.ts index 37a7a62c29..c8914931b5 100644 --- a/udmif/web/src/app/device/device.d.ts +++ b/udmif/web/src/app/device/device.d.ts @@ -14,9 +14,12 @@ interface DeviceModel { level: number; message: string; details: string; - lastSeen: string; state: string; errorsCount: number; + lastStateUpdated?: string; + lastStateSaved?: string; + lastTelemetryUpdated?: string; + lastTelemetrySaved?: string; } export type Device = Partial; diff --git a/udmif/web/src/app/device/device.gql.ts b/udmif/web/src/app/device/device.gql.ts index 1570bb6685..d427e7a51c 100644 --- a/udmif/web/src/app/device/device.gql.ts +++ b/udmif/web/src/app/device/device.gql.ts @@ -14,10 +14,13 @@ export const GET_DEVICE = gql` firmware serialNumber level - lastSeen state errorsCount validation + lastStateUpdated + lastStateSaved + lastTelemetryUpdated + lastTelemetrySaved } } `; diff --git a/udmif/web/src/app/device/device.service.spec.ts b/udmif/web/src/app/device/device.service.spec.ts index 1382d3b6b9..8c44698470 100644 --- a/udmif/web/src/app/device/device.service.spec.ts +++ b/udmif/web/src/app/device/device.service.spec.ts @@ -38,10 +38,13 @@ describe('DeviceService', () => { serialNumber: 's123', firmware: 'V3', level: 400, - lastSeen: '2022-01-03', state: 'CORRECT', errorsCount: 2, validation: '', + lastStateUpdated: '2022-01-03', + lastStateSaved: '2022-01-03', + lastTelemetryUpdated: '2022-01-03', + lastTelemetrySaved: '2022-01-03', }, }; diff --git a/udmif/web/src/app/devices/devices-routing.module.ts b/udmif/web/src/app/devices/devices-routing.module.ts index 72dbd7a158..7d6b968915 100644 --- a/udmif/web/src/app/devices/devices-routing.module.ts +++ b/udmif/web/src/app/devices/devices-routing.module.ts @@ -35,15 +35,7 @@ const routes: Routes = [ searchFields: >{ name: 'getDeviceNames', }, - displayedColumns: <(keyof DeviceModel)[]>[ - 'name', - 'message', - 'details', - 'level', - 'state', - 'lastSeen', - 'errorsCount', - ], + displayedColumns: <(keyof DeviceModel)[]>['name', 'message', 'details', 'level', 'state', 'errorsCount'], }, }, { path: ':deviceId', loadChildren: () => import('../device/device.module').then((m) => m.DeviceModule) }, diff --git a/udmif/web/src/app/devices/devices.component.html b/udmif/web/src/app/devices/devices.component.html index c5ecd09831..0a36151dc9 100644 --- a/udmif/web/src/app/devices/devices.component.html +++ b/udmif/web/src/app/devices/devices.component.html @@ -37,10 +37,7 @@ >
- {{ element.lastPayload | date: 'MM/dd/yy h:mm a' }} - - - {{ element.lastSeen | date: 'MM/dd/yy h:mm a' }} + {{ element.lastPayload | date: 'short' }} diff --git a/udmif/web/src/app/devices/devices.constants.ts b/udmif/web/src/app/devices/devices.constants.ts index 65b3240f1f..bb09d2262c 100644 --- a/udmif/web/src/app/devices/devices.constants.ts +++ b/udmif/web/src/app/devices/devices.constants.ts @@ -72,9 +72,24 @@ export class DevicesConstants { isSortable: false, }, { - value: 'lastSeen', - label: 'Last Seen', - isSortable: false, + value: 'lastStateUpdated', + label: 'Last State Updated', + isSortable: true, + }, + { + value: 'lastStateSaved', + label: 'Last State Saved', + isSortable: true, + }, + { + value: 'lastTelemetryUpdated', + label: 'Last Telemetry Updated', + isSortable: true, + }, + { + value: 'lastTelemetrySaved', + label: 'Last Telemetry Saved', + isSortable: true, }, { value: 'errorsCount', diff --git a/udmif/web/src/app/devices/devices.gql.ts b/udmif/web/src/app/devices/devices.gql.ts index 42652f3d0c..714455a1e5 100644 --- a/udmif/web/src/app/devices/devices.gql.ts +++ b/udmif/web/src/app/devices/devices.gql.ts @@ -15,7 +15,6 @@ export const GET_DEVICES = gql` level message details - lastSeen state errorsCount validation diff --git a/udmif/web/src/app/devices/devices.service.spec.ts b/udmif/web/src/app/devices/devices.service.spec.ts index 7943e62f59..ba0fa3e29e 100644 --- a/udmif/web/src/app/devices/devices.service.spec.ts +++ b/udmif/web/src/app/devices/devices.service.spec.ts @@ -40,7 +40,6 @@ describe('DevicesService', () => { level: 400, message: '', details: '', - lastSeen: '2022-06-203T04:55:21Z', state: 'COMPLETE', errorsCount: 0, validation: '{}', diff --git a/udmif/web/src/app/site/site.component.html b/udmif/web/src/app/site/site.component.html index e495b74da8..275960aabf 100644 --- a/udmif/web/src/app/site/site.component.html +++ b/udmif/web/src/app/site/site.component.html @@ -5,7 +5,7 @@ {{ field.label }} -

{{ site?.lastValidated | date: 'MM/dd/yy h:mm a' }}

+

{{ site?.lastValidated | date: 'short' }}

{{ site?.correctDevicesCount }} ({{ site?.correctDevicesPercent | percent: '1.0-2' }})

diff --git a/udmif/web/src/app/sites/sites.component.html b/udmif/web/src/app/sites/sites.component.html index af8d061f05..02e05e981b 100644 --- a/udmif/web/src/app/sites/sites.component.html +++ b/udmif/web/src/app/sites/sites.component.html @@ -51,7 +51,7 @@ >
- {{ element.lastValidated | date: 'MM/dd/yy h:mm a' }} + {{ element.lastValidated | date: 'short' }} From 2afc7f55da447725e7e9c8bc15d61b3586396e34 Mon Sep 17 00:00:00 2001 From: Marc Spratt Date: Tue, 6 Dec 2022 07:33:13 -0500 Subject: [PATCH 3/3] moved site utils file into src --- udmif/api/src/site/resolvers.ts | 7 +------ udmif/api/{util => src/site}/siteUtil.ts | 2 +- udmif/api/tsconfig.json | 3 +-- 3 files changed, 3 insertions(+), 9 deletions(-) rename udmif/api/{util => src/site}/siteUtil.ts (93%) diff --git a/udmif/api/src/site/resolvers.ts b/udmif/api/src/site/resolvers.ts index 00d07fe9d0..6c7e506210 100644 --- a/udmif/api/src/site/resolvers.ts +++ b/udmif/api/src/site/resolvers.ts @@ -1,9 +1,4 @@ -import { - getCorrectDevicesCount, - getErrorDevicesCount, - getMissingDevicesCount, - getTotalDevicesCount, -} from '../../util/siteUtil'; +import { getCorrectDevicesCount, getErrorDevicesCount, getMissingDevicesCount, getTotalDevicesCount } from './siteUtil'; import { DistinctArgs } from '../common/model'; import { ApolloContext } from '../server/datasources'; import { Site, SiteArgs, SitesArgs } from './model'; diff --git a/udmif/api/util/siteUtil.ts b/udmif/api/src/site/siteUtil.ts similarity index 93% rename from udmif/api/util/siteUtil.ts rename to udmif/api/src/site/siteUtil.ts index 55dc34ce1f..8321e24256 100644 --- a/udmif/api/util/siteUtil.ts +++ b/udmif/api/src/site/siteUtil.ts @@ -1,4 +1,4 @@ -import { Site } from '../src/site/model'; +import { Site } from './model'; export const getCorrectDevicesCount = (site: Site): number => { return site.validation?.summary?.correct_devices?.length ?? 0; diff --git a/udmif/api/tsconfig.json b/udmif/api/tsconfig.json index c13497d746..5affb3e985 100644 --- a/udmif/api/tsconfig.json +++ b/udmif/api/tsconfig.json @@ -14,8 +14,7 @@ } }, "include": [ - "src/**/*", - "util/**/*" + "src/**/*" ], "exclude": [ "node_modules"