From ef74dff71b3af9c98e1a069b8985de9bf152d566 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 18:57:08 -0700 Subject: [PATCH 01/12] account microservice works with register route --- src/account/IUserSchema.ts | 25 +++++++ src/account/account.ts | 145 ++++++++++++++++++++++++++----------- src/account/config.ts | 7 +- src/account/package.json | 20 +++++ 4 files changed, 155 insertions(+), 42 deletions(-) create mode 100644 src/account/IUserSchema.ts create mode 100644 src/account/package.json diff --git a/src/account/IUserSchema.ts b/src/account/IUserSchema.ts new file mode 100644 index 00000000..067adf09 --- /dev/null +++ b/src/account/IUserSchema.ts @@ -0,0 +1,25 @@ +export interface UserSchema { + creationDate: { + value: number; + }; + + deletionDate?: { + value: Number; + }; + + lastUpdated?: { + value: Number; + }; + + email: { + value: String; + }; + + name: { + value: String; + }; + + devicesLinked?: { + value: {}; + }; +} diff --git a/src/account/account.ts b/src/account/account.ts index b2a34b03..3da9ec9d 100644 --- a/src/account/account.ts +++ b/src/account/account.ts @@ -1,66 +1,129 @@ import express from "express"; -import { User } from "../models/UserSchema"; +import { UserSchema } from "./IUserSchema"; +import cors from "cors"; +import { MongoClient } from "mongodb"; +import { config } from "./config"; -// Account microservice port -export const PORT = 5000; +// Information that allows microservice to talk with MongoDB +// USR (username), PSW (password), CLUS (cluster), DB (database) are defined before running docker container +export const USR = config.mongodb.username; +export const PSW = config.mongodb.password; +export const CLUS = config.mongodb.clustername; +export const DB = config.mongodb.database; +export const COL = config.mongodb.collection; + +// Information about the microservice +export const MICROSERVICE = config.microservice.account; +export const PORT = config.microservice.port; + +// URL to mongoDB cluster +export const URL = `mongodb+srv://${USR}:${PSW}@${CLUS}.cgornhw.mongodb.net/Luminosity`; // Creates an Express application export const app = express(); // Single Routing -export const router = express.Router() +export const router = express.Router(); -// Defines the structure of the error Object -interface ErrorWithMessage { - message: string +// Mongo Client object +export const MONGO_CLIENT = new MongoClient(URL); + +// Connect to the Atlas cluster +async function connect() { + try { + await MONGO_CLIENT.connect(); + console.log("Successfully connected to MongoDB."); + } catch (err) { + console.error("Error connecting to MongoDB " + err); + } } // Register method -router.post('/register', (req: any, res: any) => { - const user = new User({ - email:req.body.email, - name:req.body.name - }) - user.save(function (err: any, res: any) { - if (err) { - console.log(err) - } - else { - console.log(res) - } - }) -}) +router.get("/register", (req: any, res: any) => { + async function registerAccount() { + try { + // Create a new document + let accountDocument: UserSchema = { + creationDate: { + value: Date.now() + }, + deletionDate: { + value: Date.now() + }, + lastUpdated: { + value: Date.now() + }, + email: { + value: req.body.email, + }, + name: { + value: req.body.name, + }, + devicesLinked: { + value: {} + } + }; + + // Pick database to connect to with mongo client + const mongo_db = MONGO_CLIENT.db(DB); + + // Reference the "accounts" collection in the specified database + const col = mongo_db.collection(COL); + + // Insert the document into the specified collection + await col.insertOne(accountDocument); + console.log("Account registered successfully"); + + // TODO: Use this code for unit tests + // // Find and return the document + // const filter = { "name.last": "Turing" }; + // const document = await col.findOne(filter); + // console.log("Document found:\n" + JSON.stringify(document)); + } catch (err: any) { + console.log("Error " + err.stack); + console.log("Response " + res); + } + } + registerAccount().catch(console.dir); +}); // Get all method // Get one method -router.post('/account', async (req: any, res: any) => { - User.find({}, function(err: any, users: any) { - let loginIn = false - - // Check if one of the users in the db is already present - // If so set that equal to flag, if not then indicate the user isn't registered - users.forEach(function(user: any) { - if (req.body.email === user.email) - loginIn = true - }); - - res.send({'success' : loginIn}); - }); -}) +// FIXME: User constant was removed which causes route to fail to compile +// router.post("/account", async (req: any, res: any) => { +// User.find({}, function (err: any, users: any) { +// let loginIn = false; + +// // Check if one of the users in the db is already present +// // If so set that equal to flag, if not then indicate the user isn't registered +// users.forEach(function (user: any) { +// if (req.body.email === user.email) loginIn = true; +// }); + +// res.send({ success: loginIn }); +// }); +// }); + +// Returns JSON from expressJS server +app.use(express.json()); + +// Allows server to indicate its origin (domain, scheme, or port) +app.use(cors()); // Use routes provided by the router -app.use(router) +app.use(router); +// ExpressJS listens on defined port app.listen(PORT, () => { - console.log("Account microservice listening on port: " + PORT) -}) + console.log(MICROSERVICE + " microservice listening on port: " + PORT); +}); + +connect(); // Update one // Delete one // Delete all -module.exports = router - - +module.exports = router; diff --git a/src/account/config.ts b/src/account/config.ts index 6d45160d..842e3a21 100644 --- a/src/account/config.ts +++ b/src/account/config.ts @@ -9,6 +9,11 @@ export let config = { username: process.env.USR ?? "username", password: process.env.PSW ?? "password", clustername: process.env.CLUS ?? "cluster", - database: process.env.DB ?? "test" + database: process.env.DB ?? "test", + collection: process.env.COL ?? "collection" + }, + microservice: { + account: "account", + port: 5000 } }; \ No newline at end of file diff --git a/src/account/package.json b/src/account/package.json new file mode 100644 index 00000000..1b8a44f6 --- /dev/null +++ b/src/account/package.json @@ -0,0 +1,20 @@ +{ + "name": "account", + "version": "1.0.0", + "description": "Account microservice", + "main": "account.ts", + "scripts": { + "account": "npx ts-node account.ts" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@types/cors": "^2.8.15", + "@types/express": "^4.17.20", + "cors": "^2.8.5", + "express": "^4.18.2", + "mongodb": "^6.2.0", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} From ce69500934185e66ae643eea390860cc4a9497c0 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 18:57:16 -0700 Subject: [PATCH 02/12] containerize account microservice --- src/account/.gitignore | 24 ++++++++++++++++++++++++ src/account/Dockerfile | 13 +++++++++---- src/account/wip_dockerfile | 8 -------- 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/account/.gitignore delete mode 100644 src/account/wip_dockerfile diff --git a/src/account/.gitignore b/src/account/.gitignore new file mode 100644 index 00000000..f21726c7 --- /dev/null +++ b/src/account/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +.env + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/src/account/Dockerfile b/src/account/Dockerfile index 964de159..5437af0f 100644 --- a/src/account/Dockerfile +++ b/src/account/Dockerfile @@ -1,6 +1,11 @@ -FROM node:16-bullseye +FROM amd64/node:16-bullseye WORKDIR / -RUN npm install -g express COPY account.ts / -RUN ["node", "account.ts"] -EXPOSE 3001 \ No newline at end of file +COPY config.ts / +COPY IUserSchema.ts / +COPY package.json / + +RUN npm install + +EXPOSE 5000 +CMD ["npm", "run", "account"] \ No newline at end of file diff --git a/src/account/wip_dockerfile b/src/account/wip_dockerfile deleted file mode 100644 index fce65ea9..00000000 --- a/src/account/wip_dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:latest -WORKDIR /server -COPY ["package.json", "package-lock.json*", "tsconfig.json*", "/server"] -COPY ["src", "/server/src"] -RUN ["/bin/bash", "-c", "npm install"] - -# Server port, Cors-anywhere port -EXPOSE 4000 8000 From 62d1aed1e1bef5279da3b0d421e385e39f8f6dad Mon Sep 17 00:00:00 2001 From: Erika Date: Mon, 23 Oct 2023 19:07:12 -0700 Subject: [PATCH 03/12] add account README --- src/account/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/account/README.md diff --git a/src/account/README.md b/src/account/README.md new file mode 100644 index 00000000..e69de29b From 6aac498e960741e7a4fef391dcf4fb92344cc921 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 19:56:13 -0700 Subject: [PATCH 04/12] add nodemon capabilities for development work --- src/account/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/account/package.json b/src/account/package.json index 1b8a44f6..12dce9a9 100644 --- a/src/account/package.json +++ b/src/account/package.json @@ -4,6 +4,7 @@ "description": "Account microservice", "main": "account.ts", "scripts": { + "devAccount": "nodemon account.ts", "account": "npx ts-node account.ts" }, "author": "", @@ -16,5 +17,9 @@ "mongodb": "^6.2.0", "ts-node": "^10.9.1", "typescript": "^5.2.2" + }, + "devDependencies": { + "install": "^0.13.0", + "nodemon": "^3.0.1" } } From 9fdaab554218904d0ed13419728bc48bb7162991 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 19:56:22 -0700 Subject: [PATCH 05/12] fix broken cicd scripts --- package.json | 29 ++----------- src/tsconfig.json | 103 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 src/tsconfig.json diff --git a/package.json b/package.json index 7213c855..d17f00cf 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,8 @@ { - "name": "luminosityleds", - "version": "0.1.0", - "description": "Illuminate individual expression and creativity", - "scripts": { - "build": "tsc -p ./src", - "account": "nodemon ./src/account/account.ts", - "device": "nodemon ./src/device/device.ts", - "server": "nodemon ./src/server/server.ts", - "notification": "nodemon ./src/notification/notification.ts", - "search": "nodemon ./src/search/search.ts" - }, - "keywords": [], - "author": "", - "license": "ISC", "dependencies": { - "@types/express": "^4.17.14", - "@types/node": "^18.11.9", - "axios": "^1.2.6", - "cors": "^2.8.5", - "cors-anywhere": "^0.4.4", - "express": "^4.18.2", - "lodash.get": "^4.4.2", - "mongoose": "^6.7.2", - "nodemon": "^2.0.20", - "ts-node": "^10.9.1", - "typescript": "^4.9.3" + "typescript-coverage-report": "^0.7.0" + }, + "scripts": { + "ts-coverage": "typescript-coverage-report" } } diff --git a/src/tsconfig.json b/src/tsconfig.json new file mode 100644 index 00000000..e1a624b7 --- /dev/null +++ b/src/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 447a6af4eb7c69686edf0b173a6b311c9068761c Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 20:16:22 -0700 Subject: [PATCH 06/12] WIP: make account microservice CICD script --- .../{mongodb_connect.yml => account_microservice.yml} | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) rename .github/workflows/{mongodb_connect.yml => account_microservice.yml} (91%) diff --git a/.github/workflows/mongodb_connect.yml b/.github/workflows/account_microservice.yml similarity index 91% rename from .github/workflows/mongodb_connect.yml rename to .github/workflows/account_microservice.yml index 8e9dd5bd..cc05478d 100644 --- a/.github/workflows/mongodb_connect.yml +++ b/.github/workflows/account_microservice.yml @@ -1,6 +1,6 @@ # Workflow to test the connection to mongoDB on pushes to any branch -name: MongoDB Connect +name: Account Microservice # Runs on push to any branch on: @@ -35,10 +35,7 @@ jobs: node-version: '16.x' - name: Test mongoDB connection run: | - cd server - npm install - npm run build - npm run start + echo "Make account microservice unit test" env: MONGO_INITDB_ROOT_USERNAME: ${{ secrets.MONGO_INITDB_ROOT_USERNAME }} MONGO_INITDB_ROOT_PASSWORD: ${{ secrets.MONGO_INITDB_ROOT_PASSWORD }} From 4403ce39d501d8c63a3e4ea4949109aeb8df731d Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 20:58:13 -0700 Subject: [PATCH 07/12] change UserSchema to IUserSchema --- src/account/IUserSchema.ts | 2 +- src/account/account.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/account/IUserSchema.ts b/src/account/IUserSchema.ts index 067adf09..1a840e7d 100644 --- a/src/account/IUserSchema.ts +++ b/src/account/IUserSchema.ts @@ -1,4 +1,4 @@ -export interface UserSchema { +export interface IUserSchema { creationDate: { value: number; }; diff --git a/src/account/account.ts b/src/account/account.ts index 3da9ec9d..357bbbe2 100644 --- a/src/account/account.ts +++ b/src/account/account.ts @@ -1,5 +1,5 @@ import express from "express"; -import { UserSchema } from "./IUserSchema"; +import { IUserSchema } from "./IUserSchema"; import cors from "cors"; import { MongoClient } from "mongodb"; import { config } from "./config"; @@ -43,7 +43,7 @@ router.get("/register", (req: any, res: any) => { async function registerAccount() { try { // Create a new document - let accountDocument: UserSchema = { + let accountDocument: IUserSchema = { creationDate: { value: Date.now() }, From 5418dd6e0e71ef0b2a86c9ce24dc6dfad48160bc Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 20:58:20 -0700 Subject: [PATCH 08/12] add documentation --- src/account/Dockerfile | 9 +++++++ src/account/README.md | 59 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/account/Dockerfile b/src/account/Dockerfile index 5437af0f..cf2f1427 100644 --- a/src/account/Dockerfile +++ b/src/account/Dockerfile @@ -1,11 +1,20 @@ +# Base image for account microservice. This image uses amd64 as the architecture FROM amd64/node:16-bullseye + +# Specifies root of file structure as working directory in docker image WORKDIR / + +# Copy files to root of file structure in docker image COPY account.ts / COPY config.ts / COPY IUserSchema.ts / COPY package.json / +# Install all dependencies to run account microservice RUN npm install +# Exposes port 5000 which is the same port specified in the express app in account.ts EXPOSE 5000 + +# run the command specified in the package.json to start the account microservice CMD ["npm", "run", "account"] \ No newline at end of file diff --git a/src/account/README.md b/src/account/README.md index e69de29b..da1695b5 100644 --- a/src/account/README.md +++ b/src/account/README.md @@ -0,0 +1,59 @@ +# Account Microservice +The scope of this microservice is defined in the following [epic](https://luminosity-led.atlassian.net/browse/LL-2). + +## account.ts +This program defines the account microservice. The microservice uses an isolated express app which exposes the following routes. + +### POST register +This route will register a new user in the MongoDB database. + +## config.ts +This file defines the development and environment variables for the account microservice. + +## IUserSchema.ts +This interface defines the structure of any object that uses the interface. It corresponds the data that will get entered into the MongoDB database. + +## package.json +This file defines the name, version, description, scripts, and dependencies of the account microservice. + +### Development Scripts +Uses `nodemon` which restarts the service whenever there is a change made to `account.ts`. +#### How to Run +```bash +npm run devAccount +``` + +### Production Scripts +Uses `ts-node` which precompiles `account.ts` TypeScript code that can be run in a terminal. +#### How to Run +```bash +npm run account +``` + +## Dockerfile +Defines how the docker images for the account microservice will be created. +### How to Build Docker Image +```bash +docker build -t account:VERSION . +``` +VERSION = the version of the account microservice +**Run the above command from the root of the src/account directory.** +### How to Run Docker Container +```bash +docker run --rm -t -e USR=USR -e PSW=PSW -e CLUS=CLUS -e DB=DB -e COL=COL --network="host" --dns=8.8.8.8 account +``` +USR = username for MongoDB + +PSW = password for MongoDB + +CLUS = cluster for MongoDB + +DB = database for MongoDB + +COL = collection for MongoDB + +network means tell docker container to use localhost + +dns means tell docker container to use google's public DNS + +**Run the above command from anywhere.** \ No newline at end of file From f1248f73336d6439d9dec60fef84f450ecf8bf1f Mon Sep 17 00:00:00 2001 From: pogi7 Date: Mon, 23 Oct 2023 21:04:56 -0700 Subject: [PATCH 09/12] update config.ts to use initialized variables with blank values --- src/account/README.md | 2 +- src/account/config.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/account/README.md b/src/account/README.md index da1695b5..134256e9 100644 --- a/src/account/README.md +++ b/src/account/README.md @@ -8,7 +8,7 @@ This program defines the account microservice. The microservice uses an isolate This route will register a new user in the MongoDB database. ## config.ts -This file defines the development and environment variables for the account microservice. +This file defines the environment variables and initalized variables with blank values for the account microservice. ## IUserSchema.ts This interface defines the structure of any object that uses the interface. It corresponds the data that will get entered into the MongoDB database. diff --git a/src/account/config.ts b/src/account/config.ts index 0fb8b1b3..9d4982cb 100644 --- a/src/account/config.ts +++ b/src/account/config.ts @@ -1,16 +1,16 @@ -// This config defines the production variables which are on the left side of the OR operator -// The development variables are on the right side of the OR operator +// This config defines the environment variables which are on the left side of the OR operator +// The initalized variables with blank values are on the right side of the OR operator // ?? is the nullish coalescing operator // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing // IMPORTANT: These variables are only scoped for the account microservice export let config = { mongodb: { - username: process.env.USR ?? process.env.DEV_USR, - password: process.env.PSW ?? process.env.DEV_PSW, - clustername: process.env.CLUS ?? process.env.DEV_CLUS, - database: process.env.DB ?? process.env.DEV_DB, - collection: process.env.COL ?? process.env.DEV_COL + username: process.env.USR ?? "", + password: process.env.PSW ?? "", + clustername: process.env.CLUS ?? "", + database: process.env.DB ?? "", + collection: process.env.COL ?? "" }, microservice: { account: "account", From 2e73048eb981186f2d81c18d21d4d18b4c0b4ad2 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Tue, 24 Oct 2023 14:18:31 -0700 Subject: [PATCH 10/12] fix typo in documentation --- src/account/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/account/README.md b/src/account/README.md index 134256e9..7d7c3779 100644 --- a/src/account/README.md +++ b/src/account/README.md @@ -11,7 +11,7 @@ This route will register a new user in the MongoDB database. This file defines the environment variables and initalized variables with blank values for the account microservice. ## IUserSchema.ts -This interface defines the structure of any object that uses the interface. It corresponds the data that will get entered into the MongoDB database. +This interface defines the structure of any object that uses the interface. It corresponds to the data that will get entered into the MongoDB database. ## package.json This file defines the name, version, description, scripts, and dependencies of the account microservice. @@ -40,8 +40,10 @@ VERSION = the version of the account microservice **Run the above command from the root of the src/account directory.** ### How to Run Docker Container ```bash -docker run --rm -t -e USR=USR -e PSW=PSW -e CLUS=CLUS -e DB=DB -e COL=COL --network="host" --dns=8.8.8.8 account +docker run --rm -t -e USR=USR -e PSW=PSW -e CLUS=CLUS -e DB=DB -e COL=COL --network="host" --dns=8.8.8.8 account:VERSION ``` +**Run the above command from anywhere.** + USR = username for MongoDB PSW = password for MongoDB @@ -52,8 +54,8 @@ DB = database for MongoDB COL = collection for MongoDB +VERSION = the version of the account microservice + network means tell docker container to use localhost dns means tell docker container to use google's public DNS - -**Run the above command from anywhere.** \ No newline at end of file From c1b7e82c2335032c76f6e1a7dcb45949dba23b9e Mon Sep 17 00:00:00 2001 From: pogi7 Date: Tue, 24 Oct 2023 19:02:43 -0700 Subject: [PATCH 11/12] edit docker compose file for account microservice --- docker-compose.yaml | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 0027e6a1..1ccba55e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,19 +1,23 @@ version: "3.8" services: - server: - build: "server/" - command: "npx ts-node src/routes/github.ts" + account: + build: "src/account/" + command: "npm run account" ports: - - "4000:4000" - - "8000:8000" - env_file: ".env" - client: - build: "client/" - command: "npm start" - ports: - - "3000:3000" - env_file: ".env" -# Requires server services to run before running client servers - depends_on: - - "server" + - "5000:5000" + env_file: "src/account/.env" + extra_hosts: + - "host.docker.internal:host-gateway" + dns: + - "8.8.8.8" + network_mode: "host" +# client: +# build: "client/" +# command: "npm start" +# ports: +# - "3000:3000" +# env_file: ".env" +# # Requires server services to run before running client servers +# depends_on: +# - "server" From 11a53986121df0e86c0eeac7efbb89ce0783bf09 Mon Sep 17 00:00:00 2001 From: pogi7 Date: Fri, 27 Oct 2023 21:36:09 -0700 Subject: [PATCH 12/12] change to post route for register route --- docker-compose.yaml | 3 - src/account/account.ts | 97 +++--- yarn.lock | 698 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 747 insertions(+), 51 deletions(-) create mode 100644 yarn.lock diff --git a/docker-compose.yaml b/docker-compose.yaml index 1ccba55e..74ac391b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,11 +7,8 @@ services: ports: - "5000:5000" env_file: "src/account/.env" - extra_hosts: - - "host.docker.internal:host-gateway" dns: - "8.8.8.8" - network_mode: "host" # client: # build: "client/" # command: "npm start" diff --git a/src/account/account.ts b/src/account/account.ts index 357bbbe2..e1a04008 100644 --- a/src/account/account.ts +++ b/src/account/account.ts @@ -29,63 +29,64 @@ export const router = express.Router(); export const MONGO_CLIENT = new MongoClient(URL); // Connect to the Atlas cluster -async function connect() { +export async function connect(): Promise { try { await MONGO_CLIENT.connect(); console.log("Successfully connected to MongoDB."); + return true; } catch (err) { console.error("Error connecting to MongoDB " + err); + return false; } } -// Register method -router.get("/register", (req: any, res: any) => { - async function registerAccount() { - try { - // Create a new document - let accountDocument: IUserSchema = { - creationDate: { - value: Date.now() - }, - deletionDate: { - value: Date.now() - }, - lastUpdated: { - value: Date.now() - }, - email: { - value: req.body.email, - }, - name: { - value: req.body.name, - }, - devicesLinked: { - value: {} - } - }; - - // Pick database to connect to with mongo client - const mongo_db = MONGO_CLIENT.db(DB); - - // Reference the "accounts" collection in the specified database - const col = mongo_db.collection(COL); - - // Insert the document into the specified collection - await col.insertOne(accountDocument); - console.log("Account registered successfully"); - - // TODO: Use this code for unit tests - // // Find and return the document - // const filter = { "name.last": "Turing" }; - // const document = await col.findOne(filter); - // console.log("Document found:\n" + JSON.stringify(document)); - } catch (err: any) { - console.log("Error " + err.stack); - console.log("Response " + res); - } +export async function registerAccount(req: any, res: any): Promise { + try { + // Create a new document + let accountDocument: IUserSchema = { + creationDate: { + value: Date.now() + }, + deletionDate: { + value: Date.now() + }, + lastUpdated: { + value: Date.now() + }, + email: { + value: req.body.email, + }, + name: { + value: req.body.name, + }, + devicesLinked: { + value: {} + } + }; + + // Pick database to connect to with mongo client + const mongo_db = MONGO_CLIENT.db(DB); + + // Reference the "accounts" collection in the specified database + const col = mongo_db.collection(COL); + + // Insert the document into the specified collection + await col.insertOne(accountDocument); + console.log("Account registered successfully"); + + // TODO: Use this code for unit tests + // // Find and return the document + // const filter = { "name.last": "Turing" }; + // const document = await col.findOne(filter); + // console.log("Document found:\n" + JSON.stringify(document)); + } catch (err: any) { + console.log("Error " + err.stack); + console.log("Response " + res); } - registerAccount().catch(console.dir); -}); +} + +// Register route +router.post("/register", registerAccount); // Get all method diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..ac2620fe --- /dev/null +++ b/yarn.lock @@ -0,0 +1,698 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.1.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@hypnosphi/create-react-context@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@semantic-ui-react/event-stack@^3.1.0": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.3.tgz#2862d2631d67dd846c705db2fc1ede1c468be3a1" + integrity sha512-FdTmJyWvJaYinHrKRsMLDrz4tTMGdFfds299Qory53hBugiDvGC0tEJf+cHsi5igDwWb/CLOgOiChInHwq8URQ== + dependencies: + exenv "^1.2.2" + prop-types "^15.6.2" + +"@stardust-ui/react-component-event-listener@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-event-listener/-/react-component-event-listener-0.38.0.tgz#1787faded94b40ad41226e6289baf13e701c6e7f" + integrity sha512-sIP/e0dyOrrlb8K7KWumfMxj/gAifswTBC4o68Aa+C/GA73ccRp/6W1VlHvF/dlOR4KLsA+5SKnhjH36xzPsWg== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + +"@stardust-ui/react-component-ref@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-ref/-/react-component-ref-0.38.0.tgz#52d555f2d5edd213c923c93a106f7de940e427ef" + integrity sha512-xjs6WnvJVueSIXMWw0C3oWIgAPpcD03qw43oGOjUXqFktvpNkB73JoKIhS4sCrtQxBdct75qqr4ZL6JiyPcESw== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + react-is "^16.6.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +call-bind@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +classnames@^2.2.6: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +cli-table3@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + +fast-glob@3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.0.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +keyboard-key@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.1.0.tgz#6f2e8e37fa11475bb1f1d65d5174f1b35653f5b7" + integrity sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ== + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"minimatch@6 || 7 || 8 || 9": + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== + +normalize-path@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^16.13.1: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-is@^16.13.1, react-is@^16.6.3, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-popper@^1.3.4: + version "1.3.11" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== + dependencies: + "@babel/runtime" "^7.1.2" + "@hypnosphi/create-react-context" "^0.3.1" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react@^16.13.1: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regexp.prototype.flags@^1.2.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +semantic-ui-react@^0.88.2: + version "0.88.2" + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-0.88.2.tgz#3d4b54f8b799769b412435c8531475fd34aa4149" + integrity sha512-+02kN2z8PuA/cMdvDUsHhbJmBzxxgOXVHMFr9XK7zGb0wkW9A6OPQMFokWz7ozlVtKjN6r7zsb+Qvjk/qq1OWw== + dependencies: + "@babel/runtime" "^7.1.2" + "@semantic-ui-react/event-stack" "^3.1.0" + "@stardust-ui/react-component-event-listener" "~0.38.0" + "@stardust-ui/react-component-ref" "~0.38.0" + classnames "^2.2.6" + keyboard-key "^1.0.4" + lodash "^4.17.15" + prop-types "^15.7.2" + react-is "^16.8.6" + react-popper "^1.3.4" + shallowequal "^1.1.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +"tslib@1 || 2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@3: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-coverage-core@^2.23.0: + version "2.26.3" + resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.26.3.tgz#47e2c8225f582d1ca9551c2bace20836b295c944" + integrity sha512-rzNdW/tClHJvsUiy787b/UX53bNh1Dn7A5KqZDQjkL3j7iKFv/KnTolxDBBgTPcK4Zn9Ab7WLrik7cXw2oZZqw== + dependencies: + fast-glob "3" + minimatch "6 || 7 || 8 || 9" + normalize-path "3" + tslib "1 || 2" + tsutils "3" + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + +typescript-coverage-report@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/typescript-coverage-report/-/typescript-coverage-report-0.7.0.tgz#ed3898d9f196478945520f7110fab1f6bc109e03" + integrity sha512-ODeA510qAN2C76NjDCoZj2wcGGkkuaf2FQJElyJS9ABmGbpkgrhtoWOfiKkoeaPHkvysqOfhFEVUWNrOUlww7w== + dependencies: + chalk "^4.0.0" + cli-table3 "^0.6.1" + commander "^5.0.0" + ncp "^2.0.0" + react "^16.13.1" + react-dom "^16.13.1" + rimraf "^3.0.2" + semantic-ui-react "^0.88.2" + type-coverage-core "^2.23.0" + +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==