From 4738fc4b692aa9e3a109b04a1df744cb2eae4b4d Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Sat, 8 Jul 2023 10:23:19 +0200 Subject: [PATCH] start apollo server and implement first working resolver mutation --- dlt-connector/.env.dist | 5 +- dlt-connector/.env.template | 5 +- dlt-connector/package.json | 6 + dlt-connector/src/client/IotaClient.ts | 4 +- dlt-connector/src/config/index.ts | 7 +- .../src/graphql/enum/TransactionType.ts | 12 ++ .../src/graphql/input/TransactionInput.ts | 21 +++ .../graphql/resolver/TransactionsResolver.ts | 25 +++ dlt-connector/src/graphql/schema.ts | 19 +- dlt-connector/src/index.ts | 34 +--- dlt-connector/src/proto/TransactionBody.ts | 19 ++ dlt-connector/src/server/LogError.test.ts | 27 +++ dlt-connector/src/server/LogError.ts | 10 ++ dlt-connector/src/server/cors.ts | 8 + dlt-connector/src/server/createServer.ts | 55 ++++++ dlt-connector/tsconfig.json | 3 + dlt-connector/yarn.lock | 162 ++++++++---------- 17 files changed, 283 insertions(+), 139 deletions(-) create mode 100755 dlt-connector/src/graphql/enum/TransactionType.ts create mode 100755 dlt-connector/src/graphql/input/TransactionInput.ts create mode 100755 dlt-connector/src/graphql/resolver/TransactionsResolver.ts create mode 100644 dlt-connector/src/proto/TransactionBody.ts create mode 100644 dlt-connector/src/server/LogError.test.ts create mode 100644 dlt-connector/src/server/LogError.ts create mode 100644 dlt-connector/src/server/cors.ts create mode 100755 dlt-connector/src/server/createServer.ts diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index ada027483..96867eebb 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -1,4 +1,4 @@ -CONFIG_VERSION=v1.2023-07-04 +CONFIG_VERSION=v2.2023-07-07 # SET LOG LEVEL AS NEEDED IN YOUR .ENV # POSSIBLE VALUES: all | trace | debug | info | warn | error | fatal @@ -7,3 +7,6 @@ CONFIG_VERSION=v1.2023-07-04 # IOTA IOTA_API_URL=https://chrysalis-nodes.iota.org IOTA_COMMUNITY_ALIAS=GRADIDO: TestHelloWelt2 + +# DLT-Connector +DLT_CONNECTOR_PORT=6000 \ No newline at end of file diff --git a/dlt-connector/.env.template b/dlt-connector/.env.template index 891bf4825..bd9466046 100644 --- a/dlt-connector/.env.template +++ b/dlt-connector/.env.template @@ -2,4 +2,7 @@ CONFIG_VERSION=$DLT_CONNECTOR_CONFIG_VERSION #IOTA IOTA_API_URL=$IOTA_API_URL -IOTA_COMMUNITY_ALIAS=$IOTA_COMMUNITY_ALIAS \ No newline at end of file +IOTA_COMMUNITY_ALIAS=$IOTA_COMMUNITY_ALIAS + +# DLT-Connector +DLT_CONNECTOR_PORT=$DLT_CONNECTOR_PORT \ No newline at end of file diff --git a/dlt-connector/package.json b/dlt-connector/package.json index b7498e1ea..2a68483a7 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -16,9 +16,13 @@ "test": "cross-env TZ=UTC NODE_ENV=development jest --runInBand --forceExit --detectOpenHandles" }, "dependencies": { + "@apollo/protobufjs": "^1.2.7", "@apollo/server": "^4.7.5", + "@apollo/utils.fetcher": "^3.0.0", "@iota/client": "^2.2.4", + "body-parser": "^1.20.2", "class-validator": "^0.14.0", + "cors": "^2.8.5", "cross-env": "^7.0.3", "decimal.js-light": "^2.5.1", "dotenv": "10.0.0", @@ -28,11 +32,13 @@ "graphql-scalars": "^1.22.2", "log4js": "^6.7.1", "nodemon": "^2.0.20", + "reflect-metadata": "^0.1.13", "tsconfig-paths": "^4.1.2", "type-graphql": "^2.0.0-beta.2" }, "devDependencies": { "@eslint-community/eslint-plugin-eslint-comments": "^3.2.1", + "@types/cors": "^2.8.13", "@types/jest": "^27.0.2", "@types/node": "^18.11.18", "@types/uuid": "^8.3.4", diff --git a/dlt-connector/src/client/IotaClient.ts b/dlt-connector/src/client/IotaClient.ts index b583746ff..f6e6b1772 100644 --- a/dlt-connector/src/client/IotaClient.ts +++ b/dlt-connector/src/client/IotaClient.ts @@ -8,10 +8,10 @@ const client = new ClientBuilder().node(CONFIG.IOTA_API_URL).build() /** * send data message onto iota tangle * use CONFIG.IOTA_COMMUNITY_ALIAS for index - * @param {string} message - the message as utf based string, will be converted to hex automatically from @iota/client + * @param {string | Uint8Array} message - the message as utf based string, will be converted to hex automatically from @iota/client * @return {Promise} the iota message typed */ -function sendMessage(message: string): Promise { +function sendMessage(message: string | Uint8Array): Promise { return client.message().index(CONFIG.IOTA_COMMUNITY_ALIAS).data(message).submit() } diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index d0a564eb6..be0d4b7da 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -8,7 +8,7 @@ const constants = { LOG_LEVEL: process.env.LOG_LEVEL || 'info', CONFIG_VERSION: { DEFAULT: 'DEFAULT', - EXPECTED: 'v1.2023-07-04', + EXPECTED: 'v2.2023-07-07', CURRENT: '', }, } @@ -22,6 +22,10 @@ const iota = { IOTA_COMMUNITY_ALIAS: process.env.IOTA_COMMUNITY_ALIAS ?? 'GRADIDO: TestHelloWelt2', } +const dltConnector = { + DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT || 6000, +} + // Check config version constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION || constants.CONFIG_VERSION.DEFAULT if ( @@ -38,4 +42,5 @@ export const CONFIG = { ...constants, ...server, ...iota, + ...dltConnector, } diff --git a/dlt-connector/src/graphql/enum/TransactionType.ts b/dlt-connector/src/graphql/enum/TransactionType.ts new file mode 100755 index 000000000..aaa5bf92e --- /dev/null +++ b/dlt-connector/src/graphql/enum/TransactionType.ts @@ -0,0 +1,12 @@ +import { registerEnumType } from 'type-graphql' + +export enum TransactionType { + CREATION = 1, + SEND = 2, + RECEIVE = 3, +} + +registerEnumType(TransactionType, { + name: 'TransactionType', // this one is mandatory + description: 'Type of the transaction', // this one is optional +}) diff --git a/dlt-connector/src/graphql/input/TransactionInput.ts b/dlt-connector/src/graphql/input/TransactionInput.ts new file mode 100755 index 000000000..a1c0aadb5 --- /dev/null +++ b/dlt-connector/src/graphql/input/TransactionInput.ts @@ -0,0 +1,21 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { Decimal } from 'decimal.js-light' +import { TransactionType } from '../enum/TransactionType' +import { InputType, Field } from 'type-graphql' + +@InputType() +export class TransactionInput { + @Field(() => TransactionType) + type: TransactionType + + @Field(() => Decimal) + amount: Decimal + + @Field(() => Number) + created: number + + // @protoField.d(4, 'string') + // @Field(() => Decimal) + // communitySum: Decimal +} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts new file mode 100755 index 000000000..4a5c42a54 --- /dev/null +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -0,0 +1,25 @@ +import { Resolver, Query, Arg, Mutation } from 'type-graphql' + +import { TransactionInput } from '@input/TransactionInput' +import { TransactionBody } from '../../proto/TransactionBody' + +import { sendMessage as iotaSendMessage } from '@/client/IotaClient' + +@Resolver() +export class TransactionResolver { + @Query(() => String) + dummy(): string { + return 'nothing' + } + + @Mutation(() => String) + async sendTransaction( + @Arg('data') + transaction: TransactionInput, + ): Promise { + const message = TransactionBody.fromObject(transaction) + const messageBuffer = TransactionBody.encode(message).finish() + const resultMessage = iotaSendMessage(messageBuffer) + return (await resultMessage).messageId + } +} diff --git a/dlt-connector/src/graphql/schema.ts b/dlt-connector/src/graphql/schema.ts index 6d192f979..84951f360 100755 --- a/dlt-connector/src/graphql/schema.ts +++ b/dlt-connector/src/graphql/schema.ts @@ -1,26 +1,13 @@ -import path from 'path' -import glob from 'glob' - import { Decimal } from 'decimal.js-light' import { GraphQLSchema } from 'graphql' -import { buildSchema, NonEmptyArray } from 'type-graphql' +import { buildSchema } from 'type-graphql' import { DecimalScalar } from './scalar/Decimal' +import { TransactionResolver } from './resolver/TransactionsResolver' export const schema = async (): Promise => { - const resolverFiles = glob.sync(path.join(__dirname, 'resolver', '!(*.test).{js,ts}')) - const importPromises = resolverFiles.map((file) => import(file)) - const importedModules = await Promise.all(importPromises) - const resolverClasses = importedModules.map((module) => module.default) - const filteredResolvers = resolverClasses.filter((resolver) => typeof resolver === 'function') - - if (filteredResolvers.length === 0) { - throw new Error('No resolvers found.') - } - return buildSchema({ - // eslint-disable-next-line @typescript-eslint/ban-types - resolvers: filteredResolvers as NonEmptyArray, + resolvers: [TransactionResolver], scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], }) } diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 909b3afa9..5284d9b1e 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,34 +1,16 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { - sendMessage as iotaSendMessage, - receiveMessage as iotaReceiveMessage, -} from '@/client/IotaClient' import { CONFIG } from '@/config' -import { IndexationPayload } from '@iota/client/lib/types' -import { logger } from './server/logger' +import createServer from './server/createServer' async function main() { - const now = new Date() - const messageString = 'Hello World - ' + now.toString() - const messageHexString = Buffer.from(messageString, 'utf8').toString('hex') - const indexHexString = Buffer.from(CONFIG.IOTA_COMMUNITY_ALIAS, 'utf8').toString('hex') + // eslint-disable-next-line no-console + console.log(`DLT_CONNECTOR_PORT=${CONFIG.DLT_CONNECTOR_PORT}`) + const { app } = await createServer() - const iotaSendedMessage = await iotaSendMessage(messageString) - - if (iotaSendedMessage && iotaSendedMessage.messageId) { - logger.info('Hello World Message send to iota, get messageId: %s', iotaSendedMessage.messageId) - - const iotaReceivedMessage = await iotaReceiveMessage(iotaSendedMessage.messageId) - const indexationPayload = iotaReceivedMessage.message.payload as IndexationPayload - if ( - indexationPayload.index.toString() === indexHexString || - indexationPayload.data.toString() === messageHexString - ) { - logger.info('Hello World Message received unchanged from Iota') - } else { - logger.error('Hello World Message changed on Tangle!!!') - } - } + app.listen(CONFIG.DLT_CONNECTOR_PORT, () => { + // eslint-disable-next-line no-console + console.log(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) + }) } main().catch((e) => { diff --git a/dlt-connector/src/proto/TransactionBody.ts b/dlt-connector/src/proto/TransactionBody.ts new file mode 100644 index 000000000..be257e924 --- /dev/null +++ b/dlt-connector/src/proto/TransactionBody.ts @@ -0,0 +1,19 @@ +import { Decimal } from 'decimal.js-light' +import { TransactionType } from '../graphql/enum/TransactionType' +import { Field, Message } from '@apollo/protobufjs' + +// https://www.npmjs.com/package/@apollo/protobufjs +// eslint-disable-next-line no-use-before-define +export class TransactionBody extends Message { + @Field.d(1, TransactionType) + type: TransactionType + + @Field.d(2, 'string') + amount: Decimal + + @Field.d(3, 'uint64') + created: number + + // @protoField.d(4, 'string') + // communitySum: Decimal +} diff --git a/dlt-connector/src/server/LogError.test.ts b/dlt-connector/src/server/LogError.test.ts new file mode 100644 index 000000000..115567a8b --- /dev/null +++ b/dlt-connector/src/server/LogError.test.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import { logger } from '@test/testSetup' + +import { LogError } from './LogError' + +describe('LogError', () => { + it('logs an Error when created', () => { + /* eslint-disable-next-line no-new */ + new LogError('new LogError') + expect(logger.error).toBeCalledWith('new LogError') + }) + + it('logs an Error including additional data when created', () => { + /* eslint-disable-next-line no-new */ + new LogError('new LogError', { some: 'data' }) + expect(logger.error).toBeCalledWith('new LogError', { some: 'data' }) + }) + + it('does not contain additional data in Error object when thrown', () => { + try { + throw new LogError('new LogError', { someWeirdValue123: 'arbitraryData456' }) + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + } catch (e: any) { + expect(e.stack).not.toMatch(/(someWeirdValue123|arbitraryData456)/i) + } + }) +}) diff --git a/dlt-connector/src/server/LogError.ts b/dlt-connector/src/server/LogError.ts new file mode 100644 index 000000000..8e145a0ef --- /dev/null +++ b/dlt-connector/src/server/LogError.ts @@ -0,0 +1,10 @@ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { logger } from './logger' + +export class LogError extends Error { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + constructor(msg: string, ...details: any[]) { + super(msg) + logger.error(msg, ...details) + } +} diff --git a/dlt-connector/src/server/cors.ts b/dlt-connector/src/server/cors.ts new file mode 100644 index 000000000..95663695d --- /dev/null +++ b/dlt-connector/src/server/cors.ts @@ -0,0 +1,8 @@ +import corsLib from 'cors' + +const corsOptions = { + origin: '*', + exposedHeaders: ['token'], +} + +export const cors = corsLib(corsOptions) diff --git a/dlt-connector/src/server/createServer.ts b/dlt-connector/src/server/createServer.ts new file mode 100755 index 000000000..00ba0a912 --- /dev/null +++ b/dlt-connector/src/server/createServer.ts @@ -0,0 +1,55 @@ +import 'reflect-metadata' + +import { ApolloServer } from '@apollo/server' +import { expressMiddleware } from '@apollo/server/express4' +import express, { Express } from 'express' + +// graphql +import { schema } from '@/graphql/schema' + +import { logger as dltLogger } from './logger' +import { Logger } from 'log4js' +import cors from 'cors' +import bodyParser from 'body-parser' + +type ServerDef = { apollo: ApolloServer; app: Express } + +interface MyContext { + token?: string +} + +const createServer = async ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + // context: any = serverContext, + logger: Logger = dltLogger, + // localization: i18n.I18n = i18n, +): Promise => { + logger.addContext('user', 'unknown') + logger.debug('createServer...') + + // Express Server + const app = express() + + // Apollo Server + const apollo = new ApolloServer({ + schema: await schema(), + introspection: true, + // context, + // plugins + logger, + }) + await apollo.start() + app.use( + '/', + cors(), + bodyParser.json(), + expressMiddleware(apollo, { + context: async ({ req }) => ({ token: req.headers.token }), + }), + ) + logger.debug('createServer...successful') + + return { apollo, app } +} + +export default createServer diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index 5f95779f7..06f5b44db 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -48,6 +48,9 @@ "baseUrl": ".", /* Base directory to resolve non-absolute module names. */ "paths": { /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ "@/*": ["src/*"], + "@arg/*": ["src/graphql/arg/*"], + "@enum/*": ["src/graphql/enum/*"], + "@input/*": ["src/graphql/input/*"], "@test/*": ["test/*"], /* external */ }, diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index b86d73b7f..9622e49a8 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -20,7 +20,7 @@ resolved "https://registry.yarnpkg.com/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz#5da62cf64c3b4419dabfef4536b57a40c8ff0b47" integrity sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g== -"@apollo/protobufjs@1.2.7": +"@apollo/protobufjs@1.2.7", "@apollo/protobufjs@^1.2.7": version "1.2.7" resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.7.tgz#3a8675512817e4a046a897e5f4f16415f16a7d8a" integrity sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg== @@ -105,6 +105,11 @@ resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz#2f6e3edc8ce79fbe916110d9baaddad7e13d955f" integrity sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A== +"@apollo/utils.fetcher@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-3.0.0.tgz#1eb49f95a09fc7e34f9e000af29ff5ec05f808bf" + integrity sha512-WL4pabs5TwWyl2ho0DMk5uRtsD4ORsP/7po83y03CrkCCBAB+E4cs6OteLPaQtizYGiBfMpANxWi11Cy3pwsUA== + "@apollo/utils.isnodelike@^2.0.0", "@apollo/utils.isnodelike@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz#08a7e50f08d2031122efa25af089d1c6ee609f31" @@ -175,19 +180,19 @@ integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.6.tgz#aafafbe86e9a1679d876b99dc46382964ef72494" - integrity sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw== + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" + "@babel/generator" "^7.22.7" "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-module-transforms" "^7.22.5" "@babel/helpers" "^7.22.6" - "@babel/parser" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" + "@babel/traverse" "^7.22.8" "@babel/types" "^7.22.5" "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" @@ -195,10 +200,10 @@ gensync "^1.0.0-beta.2" json5 "^2.2.2" -"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== +"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== dependencies: "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" @@ -309,10 +314,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.6.tgz#201f8b47be20c76c7c5743b9c16129760bf9a975" - integrity sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -414,18 +419,18 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.7.2": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.6.tgz#8f2f83a5c588251584914debeee38f35f661a300" - integrity sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w== +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== dependencies: "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" + "@babel/generator" "^7.22.7" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.6" + "@babel/parser" "^7.22.7" "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" @@ -833,16 +838,16 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pkgr/utils@^2.3.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" - integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" + integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== dependencies: cross-spawn "^7.0.3" - fast-glob "^3.2.12" + fast-glob "^3.3.0" is-glob "^4.0.3" open "^9.1.0" picocolors "^1.0.0" - tslib "^2.5.0" + tslib "^2.6.0" "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -984,6 +989,13 @@ dependencies: "@types/node" "*" +"@types/cors@^2.8.13": + version "2.8.13" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + dependencies: + "@types/node" "*" + "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": version "4.17.35" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" @@ -1077,11 +1089,6 @@ form-data "^3.0.0" "@types/node@*", "@types/node@^20.1.2": - version "20.3.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.3.tgz#329842940042d2b280897150e023e604d11657d6" - integrity sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw== - -"@types/node@>=13.7.0": version "20.4.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.0.tgz#01d637d1891e419bc85763b46f42809cd2d5addb" integrity sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g== @@ -1286,9 +1293,9 @@ acorn@^7.1.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1, acorn@^8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6: version "6.0.2" @@ -1591,7 +1598,7 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" -body-parser@^1.20.0: +body-parser@^1.20.0, body-parser@^1.20.2: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== @@ -1733,9 +1740,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001503: - version "1.0.30001512" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz#7450843fb581c39f290305a83523c7a9ef0d4cb4" - integrity sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw== + version "1.0.30001513" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz#382fe5fbfb0f7abbaf8c55ca3ac71a0307a752e9" + integrity sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww== chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" @@ -1835,9 +1842,9 @@ code-point-at@^1.0.0: integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" @@ -2194,9 +2201,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.431: - version "1.4.449" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz#79ffe4514c81c35d4eb13030a63ff3383a8cc655" - integrity sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ== + version "1.4.453" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.453.tgz#0a81fdc1943db202e8724d9f61369a71f0dd51e8" + integrity sha512-BU8UtQz6CB3T7RIGhId4BjmjJVXQDujb0+amGL8jpcluFJr6lwspBOvkUbnttfpZCm4zFMHmjrX1QrdPWBBMjQ== emittery@^0.8.1: version "0.8.1" @@ -2730,7 +2737,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== @@ -3066,13 +3073,13 @@ globby@^11.1.0: slash "^3.0.0" globby@^13.1.3: - version "13.2.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.1.tgz#986d44187ba6a9fc4aa9b16caf0ab9a04db94ae9" - integrity sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg== + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" @@ -4211,11 +4218,6 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4447,20 +4449,15 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== nodemon@^2.0.20: version "2.0.22" @@ -4520,9 +4517,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.6" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.6.tgz#f876bd7ae9509cac72c640826355abf63d3c326a" - integrity sha512-vSZ4miHQ4FojLjmz2+ux4B0/XA16jfwt/LBzIUftDpRd8tujHFkXjMyLwjS08fIZCzesj2z7gJukOKJwqebJAQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-assign@^4, object-assign@^4.1.0: version "4.1.1" @@ -4803,24 +4800,6 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -protobufjs@^7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" - integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-addr@~2.0.5, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -4958,6 +4937,11 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + regexp-tree@~0.1.1: version "0.1.27" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" @@ -5287,13 +5271,6 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -sodium-native@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-4.0.4.tgz#561b7c39c97789f8202d6fd224845fe2e8cd6879" - integrity sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw== - dependencies: - node-gyp-build "^4.6.0" - source-map-support@^0.5.6: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -5746,7 +5723,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0, tslib@^2.5.0: +tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== @@ -6081,6 +6058,7 @@ wordwrapjs@^4.0.0: typical "^5.2.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==