diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index c0e65078f..f85fdfa4c 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -92,19 +92,4 @@ jobs: bun install --global --no-save turbo@^2 - name: Backend | Typecheck - run: turbo backend#typecheck backend#build - - locales: - if: needs.files-changed.outputs.backend == 'true' - name: Locales - Backend - needs: files-changed - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: install bun - uses: oven-sh/setup-bun@v2 - - - name: Backend | Locales - run: cd backend && bun locales \ No newline at end of file + run: turbo backend#typecheck backend#build \ No newline at end of file diff --git a/.github/workflows/test_core.yml b/.github/workflows/test_core.yml index ff5f29c1a..f3857e2ae 100644 --- a/.github/workflows/test_core.yml +++ b/.github/workflows/test_core.yml @@ -43,3 +43,18 @@ jobs: - name: typecheck && unit test run: turbo core#test core#typecheck + locales: + if: needs.files-changed.outputs.core == 'true' + name: Locales - Core + needs: files-changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: install bun + uses: oven-sh/setup-bun@v2 + + - name: Core | Locales + run: cd core && bun locales + diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fa75018f..9d8683db1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,18 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -#### [v2.7.0](https://github.com/gradido/gradido/compare/v2.7.0...v2.7.0) +#### [v2.7.1](https://github.com/gradido/gradido/compare/v2.7.0...v2.7.1) -- fixes [`414ff8a`](https://github.com/gradido/gradido/commit/414ff8ac5a7477109f80123ccca5c4c8ed4511b2) +- feat(frontend): new startpage images [`#3576`](https://github.com/gradido/gradido/pull/3576) +- feat(frontend): update login subtitle [`#3574`](https://github.com/gradido/gradido/pull/3574) +- feat(frontend): update copy symbol and change link order [`#3575`](https://github.com/gradido/gradido/pull/3575) +- fix(backend): correct seeding [`#3572`](https://github.com/gradido/gradido/pull/3572) +- feat(dlt): dlt-connector takes care of gradido node [`#3568`](https://github.com/gradido/gradido/pull/3568) +- refactor(dlt): upgrade dlt for using gradido blockchain lib and hiero [`#3551`](https://github.com/gradido/gradido/pull/3551) +- chore(release): v2.7.0 [`#3557`](https://github.com/gradido/gradido/pull/3557) +- feat(federation): use own table for handshake state [`#3555`](https://github.com/gradido/gradido/pull/3555) +- fix(workflow): use bun instead of yarn [`#3550`](https://github.com/gradido/gradido/pull/3550) +- feat(workflow): adjust for new bun version [`#3554`](https://github.com/gradido/gradido/pull/3554) #### [v2.7.0](https://github.com/gradido/gradido/compare/2.6.1...v2.7.0) diff --git a/README.md b/README.md index 9abb4eb90..2bc9c6a32 100644 --- a/README.md +++ b/README.md @@ -189,11 +189,11 @@ describe('test', () => { ```ts import { clearLogs, printLogs } from 'config-schema/test/testSetup' ``` -- vitest (frontend, admin, database): +- vitest (frontend, admin): ```ts import { clearLogs, printLogs } from 'config-schema/test/testSetup.vitest' ``` -- bun (shared, core): +- bun (shared, core, database): ```ts import { clearLogs, printLogs } from 'config-schema/test/testSetup.bun' ``` diff --git a/admin/package.json b/admin/package.json index 672da9425..463162667 100644 --- a/admin/package.json +++ b/admin/package.json @@ -3,7 +3,7 @@ "description": "Administration Interface for Gradido", "main": "index.js", "author": "Gradido Academy - https://www.gradido.net", - "version": "2.7.0", + "version": "2.7.1", "license": "Apache-2.0", "scripts": { "dev": "vite", diff --git a/backend/.env.dist b/backend/.env.dist index 0860b9c94..f9fcb035f 100644 --- a/backend/.env.dist +++ b/backend/.env.dist @@ -22,7 +22,7 @@ KLICKTIPP_APIKEY_DE=SomeFakeKeyDE KLICKTIPP_APIKEY_EN=SomeFakeKeyEN # DltConnector -DLT_CONNECTOR=true +DLT_ACTIVE=false DLT_CONNECTOR_URL=http://localhost:6010 # Community diff --git a/backend/.env.org b/backend/.env.org deleted file mode 100644 index 2267fdc50..000000000 --- a/backend/.env.org +++ /dev/null @@ -1,77 +0,0 @@ -# Server -PORT=4000 -JWT_SECRET=secret123 -JWT_EXPIRES_IN=10m -GRAPHIQL=false -GDT_API_URL=https://gdt.gradido.net - -# Database -DB_HOST=127.0.0.1 -DB_PORT=3306 -DB_USER=root -DB_PASSWORD= -DB_DATABASE=gradido_community -TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log - -# Klicktipp -KLICKTIPP=false -KLICKTTIPP_API_URL=https://api.klicktipp.com -KLICKTIPP_USER=gradido_test -KLICKTIPP_PASSWORD=secret321 -KLICKTIPP_APIKEY_DE=SomeFakeKeyDE -KLICKTIPP_APIKEY_EN=SomeFakeKeyEN - -# DltConnector -DLT_CONNECTOR=true -DLT_CONNECTOR_URL=http://localhost:6010 - -# Community -COMMUNITY_NAME=Gradido Entwicklung -COMMUNITY_URL=http://localhost -COMMUNITY_REGISTER_PATH=/register -COMMUNITY_REDEEM_PATH=/redeem/{code} -COMMUNITY_REDEEM_CONTRIBUTION_PATH=/redeem/CL-{code} -COMMUNITY_DESCRIPTION=Die lokale Entwicklungsumgebung von Gradido. -COMMUNITY_SUPPORT_MAIL=support@supportmail.com - -# Login Server -LOGIN_APP_SECRET=21ffbbc616fe -LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a - -# EMail -EMAIL=false -EMAIL_TEST_MODUS=false -EMAIL_TEST_RECEIVER=stage1@gradido.net -EMAIL_USERNAME=gradido_email -EMAIL_SENDER=info@gradido.net -EMAIL_PASSWORD=xxx -EMAIL_SMTP_HOST=gmail.com -EMAIL_SMTP_PORT=587 -EMAIL_LINK_VERIFICATION_PATH=/checkEmail/{optin}{code} -EMAIL_LINK_SETPASSWORD_PATH=/reset-password/{optin} -EMAIL_LINK_FORGOTPASSWORD_PATH=/forgot-password -EMAIL_LINK_OVERVIEW_PATH=/overview -EMAIL_CODE_VALID_TIME=1440 -EMAIL_CODE_REQUEST_TIME=10 - -# Webhook -WEBHOOK_ELOPAGE_SECRET=secret - -# SET LOG LEVEL AS NEEDED IN YOUR .ENV -# POSSIBLE VALUES: all | trace | debug | info | warn | error | fatal -LOG_LEVEL=INFO - -# Federation -FEDERATION_VALIDATE_COMMUNITY_TIMER=60000 - -# GMS -# GMS_ACTIVE=true -# Coordinates of Illuminz test instance -#GMS_API_URL=http://54.176.169.179:3071 -GMS_API_URL=http://localhost:4044 -GMS_DASHBOARD_URL=http://localhost:8080 - -# HUMHUB -HUMHUB_ACTIVE=true -HUMHUB_API_URL=https://community-test.gradido.net -HUMHUB_JWT_KEY=GwdkIKi-rkRS0mXC4Cg3MYc3ktZh89VFmntDpNKET_dUfcIdjL_957F3nCv3brNtDfbbV81NViKaktUsfExrkH diff --git a/backend/.env.template b/backend/.env.template index 5212d1e1b..98090546d 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -24,7 +24,7 @@ KLICKTIPP_APIKEY_DE=$KLICKTIPP_APIKEY_DE KLICKTIPP_APIKEY_EN=$KLICKTIPP_APIKEY_EN # DltConnector -DLT_CONNECTOR=$DLT_CONNECTOR +DLT_ACTIVE=$DLT_ACTIVE DLT_CONNECTOR_PORT=$DLT_CONNECTOR_PORT # Community diff --git a/backend/Dockerfile b/backend/Dockerfile index f015350c0..8cebcbe8d 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -114,8 +114,7 @@ COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/backend/build/worker.js ./wo # add node_modules from production_node_modules COPY --chown=app:app --from=production-node-modules ${DOCKER_WORKDIR}/node_modules ./node_modules -# Copy locales -COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/backend/locales ./locales +COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/core/build/templates ./templates # Run command CMD ["node", "index.js"] diff --git a/backend/package.json b/backend/package.json index 5921bca92..463683372 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "backend", - "version": "2.7.0", + "version": "2.7.1", "private": false, "description": "Gradido unified backend providing an API-Service for Gradido Transactions", "repository": "https://github.com/gradido/gradido/backend", @@ -8,7 +8,7 @@ "author": "Gradido Academy - https://www.gradido.net", "main": "src/index.ts", "scripts": { - "build": "ts-node ./esbuild.config.ts && mkdirp build/templates/ && ncp src/emails/templates build/templates && mkdirp locales/ && ncp src/locales locales", + "build": "ts-node ./esbuild.config.ts && mkdirp build/templates/ && ncp ../core/build/templates build/templates", "dev": "cross-env TZ=UTC nodemon -w src --ext ts,pug,json,css -r tsconfig-paths/register src/index.ts", "test": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_backend jest --runInBand --forceExit --detectOpenHandles", "test:coverage": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_backend jest --coverage --runInBand --forceExit --detectOpenHandles", @@ -19,8 +19,6 @@ "lint": "biome check --error-on-warnings .", "lint:fix": "biome check --error-on-warnings . --write", "lint:fix:unsafe": "biome check --fix --unsafe", - "locales": "scripts/sort.sh", - "locales:fix": "scripts/sort.sh --fix", "start": "cross-env TZ=UTC node build/index.js", "typecheck": "tsc --noEmit", "clear": "rm -rf node_modules && rm -rf build && rm -rf .turbo" @@ -49,7 +47,6 @@ "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -83,11 +80,9 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "^6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", - "pug": "^3.0.2", "random-bigint": "^0.0.1", "reflect-metadata": "^0.1.13", "regenerator-runtime": "^0.14.1", diff --git a/backend/scripts/sort_filter.jq b/backend/scripts/sort_filter.jq deleted file mode 100644 index 9d108f8f0..000000000 --- a/backend/scripts/sort_filter.jq +++ /dev/null @@ -1,13 +0,0 @@ -def walk(f): - . as $in - | if type == "object" then - reduce keys_unsorted[] as $key - ( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f - elif type == "array" then map( walk(f) ) | f - else f - end; - -def keys_sort_by(f): - to_entries | sort_by(.key|f ) | from_entries; - -walk(if type == "object" then keys_sort_by(ascii_upcase) else . end) \ No newline at end of file diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index e3673791b..55acb6e04 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -5,17 +5,17 @@ import { DltConnectorClient } from './DltConnectorClient' describe('undefined DltConnectorClient', () => { it('invalid url', () => { CONFIG.DLT_CONNECTOR_URL = '' - CONFIG.DLT_CONNECTOR = true + CONFIG.DLT_ACTIVE = true const result = DltConnectorClient.getInstance() expect(result).toBeUndefined() CONFIG.DLT_CONNECTOR_URL = 'http://dlt-connector:6010' }) - it('DLT_CONNECTOR is false', () => { - CONFIG.DLT_CONNECTOR = false + it('DLT_ACTIVE is false', () => { + CONFIG.DLT_ACTIVE = false const result = DltConnectorClient.getInstance() expect(result).toBeUndefined() - CONFIG.DLT_CONNECTOR = true + CONFIG.DLT_ACTIVE = true }) }) diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index a5e162ba0..2a1ced85d 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -31,7 +31,7 @@ export class DltConnectorClient { * just one instance of each subclass around. */ public static getInstance(): DltConnectorClient | undefined { - if (!CONFIG.DLT_CONNECTOR || !CONFIG.DLT_CONNECTOR_URL) { + if (!CONFIG.DLT_ACTIVE || !CONFIG.DLT_CONNECTOR_URL) { logger.info(`dlt-connector are disabled via config...`) return } diff --git a/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts b/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts index 81a7c5398..5a2c96d79 100644 --- a/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts @@ -30,7 +30,7 @@ export class DltConnectorClient { * just one instance of each subclass around. */ public static getInstance(): DltConnectorClient | undefined { - if (!CONFIG.DLT_CONNECTOR || !CONFIG.DLT_CONNECTOR_URL) { + if (!CONFIG.DLT_ACTIVE || !CONFIG.DLT_CONNECTOR_URL) { logger.info(`dlt-connector are disabled via config...`) return } diff --git a/backend/src/apis/dltConnector/index.ts b/backend/src/apis/dltConnector/index.ts index f81d928d1..ae7d138ef 100644 --- a/backend/src/apis/dltConnector/index.ts +++ b/backend/src/apis/dltConnector/index.ts @@ -66,7 +66,7 @@ async function executeDltTransaction(draft: TransactionDraft | null, typeId: Dlt * and update dltTransactionId of transaction in db with hiero transaction id */ export async function registerAddressTransaction(user: DbUser, community: DbCommunity): Promise { - if (!CONFIG.DLT_CONNECTOR) { + if (!CONFIG.DLT_ACTIVE) { return Promise.resolve(null) } if (!user.id) { @@ -90,7 +90,7 @@ export async function contributionTransaction( signingUser: DbUser, createdAt: Date, ): Promise { - if (!CONFIG.DLT_CONNECTOR) { + if (!CONFIG.DLT_ACTIVE) { return Promise.resolve(null) } const homeCommunity = await getHomeCommunity() @@ -109,7 +109,7 @@ export async function transferTransaction( memo: string, createdAt: Date ): Promise { - if (!CONFIG.DLT_CONNECTOR) { + if (!CONFIG.DLT_ACTIVE) { return Promise.resolve(null) } // load community if not already loaded, maybe they are remote communities @@ -127,7 +127,7 @@ export async function transferTransaction( export async function deferredTransferTransaction(senderUser: DbUser, transactionLink: DbTransactionLink) : Promise { - if (!CONFIG.DLT_CONNECTOR) { + if (!CONFIG.DLT_ACTIVE) { return Promise.resolve(null) } // load community if not already loaded @@ -140,7 +140,7 @@ export async function deferredTransferTransaction(senderUser: DbUser, transactio export async function redeemDeferredTransferTransaction(transactionLink: DbTransactionLink, amount: string, createdAt: Date, recipientUser: DbUser) : Promise { - if (!CONFIG.DLT_CONNECTOR) { + if (!CONFIG.DLT_ACTIVE) { return Promise.resolve(null) } // load user and communities if not already loaded diff --git a/backend/src/apis/gms/ExportUsers.ts b/backend/src/apis/gms/ExportUsers.ts index 03cc92fa4..5c5cb72d8 100644 --- a/backend/src/apis/gms/ExportUsers.ts +++ b/backend/src/apis/gms/ExportUsers.ts @@ -4,7 +4,7 @@ import { User as DbUser } from 'database' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' // import { createGmsUser } from '@/apis/gms/GmsClient' // import { GmsUser } from '@/apis/gms/model/GmsUser' -import { CONFIG } from '@/config' +import { CONFIG as CORE_CONFIG } from 'core' import { sendUserToGms } from '@/graphql/resolver/util/sendUserToGms' import { LogError } from '@/server/LogError' import { initLogging } from '@/server/logger' @@ -13,7 +13,7 @@ import { getLogger } from 'log4js' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.gms.ExportUsers`) -CONFIG.EMAIL = false +CORE_CONFIG.EMAIL = false // use force to copy over all user even if gmsRegistered is set to true const forceMode = process.argv.includes('--force') diff --git a/backend/src/apis/openai/OpenaiClient.ts b/backend/src/apis/openai/OpenaiClient.ts index eb37a04f8..5655020aa 100644 --- a/backend/src/apis/openai/OpenaiClient.ts +++ b/backend/src/apis/openai/OpenaiClient.ts @@ -92,6 +92,7 @@ export class OpenaiClient { if (openaiThreadEntity.updatedAt < new Date(Date.now() - OPENAI_AI_THREAD_DEFAULT_TIMEOUT_DAYS * 24 * 60 * 60 * 1000)) { logger.info(`Openai thread for user: ${user.id} is older than ${OPENAI_AI_THREAD_DEFAULT_TIMEOUT_DAYS} days, deleting...`) // let run async, because it could need some time, but we don't need to wait, because we create a new one nevertheless + // biome-ignore lint/complexity/noVoid: start it intentionally async without waiting for result void this.deleteThread(openaiThreadEntity.id) return [] } diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index f29f0b0f7..9a57fed43 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -17,6 +17,7 @@ const logging = { const server = { BACKEND_PORT: process.env.BACKEND_PORT ?? 4000, + DLT_ACTIVE: process.env.DLT_ACTIVE === 'true' || false, JWT_SECRET: process.env.JWT_SECRET ?? 'secret123', JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN ?? '10m', REDEEM_JWT_TOKEN_EXPIRATION: process.env.REDEEM_JWT_TOKEN_EXPIRATION ?? '10m', @@ -41,9 +42,7 @@ const COMMUNITY_URL = process.env.COMMUNITY_URL ?? `${URL_PROTOCOL}://${COMMUNIT const DLT_CONNECTOR_PORT = process.env.DLT_CONNECTOR_PORT ?? 6010 const dltConnector = { - DLT_CONNECTOR: process.env.DLT_CONNECTOR === 'true' || false, DLT_CONNECTOR_URL: process.env.DLT_CONNECTOR_URL ?? `${COMMUNITY_URL}:${DLT_CONNECTOR_PORT}`, - DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: process.env.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER ?? '~/.gradido', } const community = { @@ -64,22 +63,10 @@ const loginServer = { } const email = { - EMAIL: process.env.EMAIL === 'true', - EMAIL_TEST_MODUS: process.env.EMAIL_TEST_MODUS === 'true', - EMAIL_TEST_RECEIVER: process.env.EMAIL_TEST_RECEIVER ?? 'stage1@gradido.net', - EMAIL_USERNAME: process.env.EMAIL_USERNAME ?? '', - EMAIL_SENDER: process.env.EMAIL_SENDER ?? 'info@gradido.net', - EMAIL_PASSWORD: process.env.EMAIL_PASSWORD ?? '', - EMAIL_SMTP_HOST: process.env.EMAIL_SMTP_HOST ?? 'mailserver', - EMAIL_SMTP_PORT: Number(process.env.EMAIL_SMTP_PORT) || 1025, - - EMAIL_TLS: process.env.EMAIL_TLS !== 'false', EMAIL_LINK_VERIFICATION: COMMUNITY_URL + (process.env.EMAIL_LINK_VERIFICATION_PATH ?? '/checkEmail/'), EMAIL_LINK_SETPASSWORD: COMMUNITY_URL + (process.env.EMAIL_LINK_SETPASSWORD_PATH ?? '/reset-password/'), - EMAIL_LINK_FORGOTPASSWORD: - COMMUNITY_URL + (process.env.EMAIL_LINK_FORGOTPASSWORD_PATH ?? '/forgot-password'), EMAIL_LINK_OVERVIEW: COMMUNITY_URL + (process.env.EMAIL_LINK_OVERVIEW_PATH ?? '/overview'), // time in minutes a optin code is valid EMAIL_CODE_VALID_TIME: process.env.EMAIL_CODE_VALID_TIME diff --git a/backend/src/config/schema.ts b/backend/src/config/schema.ts index 4b13b4e64..2f65435cc 100644 --- a/backend/src/config/schema.ts +++ b/backend/src/config/schema.ts @@ -4,6 +4,7 @@ import { COMMUNITY_SUPPORT_MAIL, COMMUNITY_URL, DECAY_START_TIME, + DLT_ACTIVE, GDT_ACTIVE, GDT_API_URL, GMS_ACTIVE, @@ -27,6 +28,7 @@ export const schema = Joi.object({ COMMUNITY_DESCRIPTION, COMMUNITY_SUPPORT_MAIL, DECAY_START_TIME, + DLT_ACTIVE, GDT_API_URL, GDT_ACTIVE, GMS_ACTIVE, @@ -68,90 +70,11 @@ export const schema = Joi.object({ .default('http://0.0.0.0/redeem/CL-') .required(), - DLT_CONNECTOR: Joi.boolean() - .description('Flag to indicate if DLT-Connector is used. (Still in development)') - .default(false) - .required(), - DLT_CONNECTOR_URL: Joi.string() .uri({ scheme: ['http', 'https'] }) .default('http://localhost:6010') - .when('DLT_CONNECTOR', { is: true, then: Joi.required() }) - .description('The URL for GDT API endpoint'), - - DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: Joi.string() - .default('~/.gradido') - .description('The home folder for the gradido dlt node server'), - - EMAIL: Joi.boolean() - .default(false) - .description('Enable or disable email functionality') - .required(), - - EMAIL_TEST_MODUS: Joi.boolean() - .default(false) - .description('When enabled, all emails are sended to EMAIL_TEST_RECEIVER') - .optional(), - - EMAIL_TEST_RECEIVER: Joi.string() - .email() - .default('stage1@gradido.net') - .when('EMAIL_TEST_MODUS', { is: true, then: Joi.required() }) - .description('Email address used in test mode'), - - EMAIL_USERNAME: Joi.alternatives().conditional(Joi.ref('EMAIL'), { - is: true, - then: Joi.alternatives().conditional(Joi.ref('NODE_ENV'), { - is: 'development', - then: Joi.string() - .allow('') - .description('Username for SMTP authentication (optional in development)'), - otherwise: Joi.string() - .pattern(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) - .description('Valid SMTP username required in production') - .required(), - }), - otherwise: Joi.string().allow('').optional(), - }), - - EMAIL_SENDER: Joi.string() - .email() - .when('EMAIL', { is: true, then: Joi.required() }) - .default('info@gradido.net') - .description('Email address used as sender'), - - EMAIL_PASSWORD: Joi.alternatives().conditional(Joi.ref('EMAIL'), { - is: true, - then: Joi.alternatives().conditional(Joi.ref('NODE_ENV'), { - is: 'development', - then: Joi.string() - .allow('') - .description('Password for SMTP authentication (optional in development)'), - otherwise: Joi.string() - .min(8) - .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#]).{8,}$/) - .description( - 'Password must be at least 8 characters long, include uppercase and lowercase letters, a number, and a special character', - ) - .required(), - }), - otherwise: Joi.string().allow('').optional(), - }), - - EMAIL_SMTP_HOST: Joi.string() - .hostname() - .when('EMAIL', { is: true, then: Joi.required() }) - .default('mailserver') - .description('SMTP server hostname'), - - EMAIL_SMTP_PORT: Joi.number() - .integer() - .positive() - .when('EMAIL', { is: true, then: Joi.required() }) - .default(1025) - .description('SMTP server port'), - - EMAIL_TLS: Joi.boolean().default(true).description('Enable or disable TLS for SMTP').optional(), + .when('DLT_ACTIVE', { is: true, then: Joi.required() }) + .description('The URL for DLT connector'), EMAIL_LINK_VERIFICATION: Joi.string() .uri({ scheme: ['http', 'https'] }) @@ -175,17 +98,6 @@ export const schema = Joi.object({ .description('Email Verification link for set initial Password.') .required(), - EMAIL_LINK_FORGOTPASSWORD: Joi.string() - .uri({ scheme: ['http', 'https'] }) - .custom((value: string, helpers: Joi.CustomHelpers): string | Joi.ErrorReport => { - if (!value.startsWith(helpers.state.ancestors[0].COMMUNITY_URL)) { - return helpers.error('string.pattern.base', { value, communityUrl: COMMUNITY_URL }) - } - return value - }) - .description('Email Verification link for set new Password, when old Password was forgotten.') - .required(), - EMAIL_LINK_OVERVIEW: Joi.string() .uri({ scheme: ['http', 'https'] }) .custom((value: string, helpers: Joi.CustomHelpers): string | Joi.ErrorReport => { @@ -213,7 +125,7 @@ export const schema = Joi.object({ .description('Time in minutes before a new code can be requested') .required(), - FEDERATION_VALIDATE_COMMUNITY_TIMER: Joi.number() + FEDERATION_VALIDATE_COMMUNITY_TIMER: Joi.number() .integer() .min(1000) .default(60000) diff --git a/backend/src/emails/sendEmailVariants.ts b/backend/src/emails/sendEmailVariants.ts deleted file mode 100644 index aac726002..000000000 --- a/backend/src/emails/sendEmailVariants.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { Decimal } from 'decimal.js-light' - -import { CONFIG } from '@/config' -import { decimalSeparatorByLanguage } from 'core' - -import { sendEmailTranslated } from './sendEmailTranslated' - -export interface ContributionEmailCommonData { - firstName: string - lastName: string - email: string - language: string - senderFirstName: string - senderLastName: string - contributionMemo: string - contributionFrontendLink: string -} - -function toContributionEmailLocales(data: ContributionEmailCommonData): Record { - return { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - senderFirstName: data.senderFirstName, - senderLastName: data.senderLastName, - contributionMemo: data.contributionMemo, - contributionFrontendLink: data.contributionFrontendLink, - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - } -} - -export const sendAddedContributionMessageEmail = ( - data: ContributionEmailCommonData & { - message: string - }, -): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { - to: `${data.firstName} ${data.lastName} <${data.email}>`, - }, - template: 'addedContributionMessage', - locals: { - ...toContributionEmailLocales(data), - message: data.message, - }, - }) -} - -export const sendAccountActivationEmail = (data: { - firstName: string - lastName: string - email: string - language: string - activationLink: string - timeDurationObject: Record - logoUrl?: string | null -}): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'accountActivation', - locals: { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - activationLink: data.activationLink, - timeDurationObject: data.timeDurationObject, - logoUrl: data.logoUrl, - resendLink: CONFIG.EMAIL_LINK_FORGOTPASSWORD, - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - communityURL: CONFIG.COMMUNITY_URL, - }, - }) -} - -export const sendAccountMultiRegistrationEmail = (data: { - firstName: string - lastName: string - email: string - language: string -}): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'accountMultiRegistration', - locals: { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - resendLink: CONFIG.EMAIL_LINK_FORGOTPASSWORD, - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - communityURL: CONFIG.COMMUNITY_URL, - }, - }) -} - -export const sendContributionConfirmedEmail = ( - data: ContributionEmailCommonData & { - contributionAmount: Decimal - }, -): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'contributionConfirmed', - locals: { - ...toContributionEmailLocales(data), - contributionAmount: decimalSeparatorByLanguage(data.contributionAmount, data.language), - }, - }) -} - -export const sendContributionChangedByModeratorEmail = ( - data: ContributionEmailCommonData & { - contributionMemoUpdated: string - }, -): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'contributionChangedByModerator', - locals: { - ...toContributionEmailLocales(data), - contributionMemoUpdated: data.contributionMemoUpdated, - }, - }) -} - -export const sendContributionDeletedEmail = ( - data: ContributionEmailCommonData, -): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'contributionDeleted', - locals: toContributionEmailLocales(data), - }) -} - -export const sendContributionDeniedEmail = ( - data: ContributionEmailCommonData, -): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'contributionDenied', - locals: toContributionEmailLocales(data), - }) -} - -export const sendResetPasswordEmail = (data: { - firstName: string - lastName: string - email: string - language: string - resetLink: string - timeDurationObject: Record -}): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'resetPassword', - locals: { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - resetLink: data.resetLink, - timeDurationObject: data.timeDurationObject, - resendLink: CONFIG.EMAIL_LINK_FORGOTPASSWORD, - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - communityURL: CONFIG.COMMUNITY_URL, - }, - }) -} - -export const sendTransactionLinkRedeemedEmail = (data: { - firstName: string - lastName: string - email: string - language: string - senderFirstName: string - senderLastName: string - senderEmail: string - transactionMemo: string - transactionAmount: Decimal -}): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'transactionLinkRedeemed', - locals: { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - senderFirstName: data.senderFirstName, - senderLastName: data.senderLastName, - senderEmail: data.senderEmail, - transactionMemo: data.transactionMemo, - transactionAmount: decimalSeparatorByLanguage(data.transactionAmount, data.language), - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - communityURL: CONFIG.COMMUNITY_URL, - }, - }) -} - -export const sendTransactionReceivedEmail = (data: { - firstName: string - lastName: string - email: string - language: string - senderFirstName: string - senderLastName: string - senderEmail: string - memo: string - transactionAmount: Decimal -}): Promise | boolean | null> => { - return sendEmailTranslated({ - receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, - template: 'transactionReceived', - locals: { - firstName: data.firstName, - lastName: data.lastName, - locale: data.language, - memo: data.memo, - senderFirstName: data.senderFirstName, - senderLastName: data.senderLastName, - senderEmail: data.senderEmail, - transactionAmount: decimalSeparatorByLanguage(data.transactionAmount, data.language), - supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - communityURL: CONFIG.COMMUNITY_URL, - }, - }) -} diff --git a/backend/src/graphql/resolver/CommunityResolver.test.ts b/backend/src/graphql/resolver/CommunityResolver.test.ts index 57173c9d1..0f48d356b 100644 --- a/backend/src/graphql/resolver/CommunityResolver.test.ts +++ b/backend/src/graphql/resolver/CommunityResolver.test.ts @@ -5,7 +5,6 @@ import { DataSource } from 'typeorm' import { v4 as uuidv4 } from 'uuid' import { cleanDB, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' import { userFactory } from '@/seeds/factory/user' import { login, updateHomeCommunityQuery } from '@/seeds/graphql/mutations' @@ -43,7 +42,7 @@ const peterLoginData = { } beforeAll(async () => { - testEnv = await testEnvironment(getLogger('apollo'), localization) + testEnv = await testEnvironment(getLogger('apollo')) mutate = testEnv.mutate query = testEnv.query con = testEnv.con diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts index 962b77766..483747b90 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts @@ -5,10 +5,9 @@ import { DataSource } from 'typeorm' import { ContributionStatus } from '@enum/ContributionStatus' import { cleanDB, resetToken, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' -import { sendAddedContributionMessageEmail } from '@/emails/sendEmailVariants' +import { sendAddedContributionMessageEmail } from 'core' import { EventType } from '@/event/Events' import { userFactory } from '@/seeds/factory/user' import { @@ -30,14 +29,12 @@ const interactionLogger = getLogger( ) jest.mock('@/password/EncryptorUtils') -jest.mock('@/emails/sendEmailVariants', () => { - const originalModule = jest.requireActual('@/emails/sendEmailVariants') +jest.mock('core', () => { + const originalModule = jest.requireActual('core') return { __esModule: true, ...originalModule, - sendAddedContributionMessageEmail: jest.fn((a) => - originalModule.sendAddedContributionMessageEmail(a), - ), + sendAddedContributionMessageEmail: jest.fn(), } }) @@ -51,7 +48,7 @@ let testEnv: { let result: any beforeAll(async () => { - testEnv = await testEnvironment(logger, localization) + testEnv = await testEnvironment(logger) mutate = testEnv.mutate con = testEnv.con await cleanDB() diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.ts b/backend/src/graphql/resolver/ContributionMessageResolver.ts index 8ddf782b0..5926a1bc4 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.ts @@ -14,7 +14,7 @@ import { Order } from '@enum/Order' import { ContributionMessage, ContributionMessageListResult } from '@model/ContributionMessage' import { RIGHTS } from '@/auth/RIGHTS' -import { sendAddedContributionMessageEmail } from '@/emails/sendEmailVariants' +import { sendAddedContributionMessageEmail } from 'core' import { EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE, EVENT_CONTRIBUTION_MESSAGE_CREATE, diff --git a/backend/src/graphql/resolver/ContributionResolver.test.ts b/backend/src/graphql/resolver/ContributionResolver.test.ts index 6dee20592..31d405942 100644 --- a/backend/src/graphql/resolver/ContributionResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionResolver.test.ts @@ -14,14 +14,13 @@ import { resetToken, testEnvironment, } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import { sendContributionConfirmedEmail, sendContributionDeletedEmail, sendContributionDeniedEmail, -} from '@/emails/sendEmailVariants' +} from 'core' import { EventType } from '@/event/Events' import { creations } from '@/seeds/creation/index' import { creationFactory } from '@/seeds/factory/creation' @@ -54,7 +53,17 @@ import { getFirstDayOfPreviousNMonth } from 'core' import { getLogger } from 'config-schema/test/testSetup' import { getLogger as originalGetLogger } from 'log4js' -jest.mock('@/emails/sendEmailVariants') +jest.mock('core', () => { + const originalModule = jest.requireActual('core') + return { + __esModule: true, + ...originalModule, + sendContributionDeniedEmail: jest.fn(), + sendContributionConfirmedEmail: jest.fn(), + sendContributionDeletedEmail: jest.fn(), + sendEmailTranslated: jest.fn(), + } +}) jest.mock('@/password/EncryptorUtils') const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.LogError`) @@ -77,7 +86,7 @@ let contributionToDelete: any let bibiCreatedContribution: Contribution beforeAll(async () => { - testEnv = await testEnvironment(originalGetLogger('apollo'), localization) + testEnv = await testEnvironment(originalGetLogger('apollo')) mutate = testEnv.mutate query = testEnv.query con = testEnv.con diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index ac06f012e..180c22cfb 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -21,15 +21,15 @@ import { AdminUpdateContribution } from '@model/AdminUpdateContribution' import { Contribution, ContributionListResult } from '@model/Contribution' import { OpenCreation } from '@model/OpenCreation' import { UnconfirmedContribution } from '@model/UnconfirmedContribution' -import { TransactionTypeId } from 'core' - import { RIGHTS } from '@/auth/RIGHTS' import { + fullName, sendContributionChangedByModeratorEmail, sendContributionConfirmedEmail, sendContributionDeletedEmail, sendContributionDeniedEmail, -} from '@/emails/sendEmailVariants' + TransactionTypeId +} from 'core' import { EVENT_ADMIN_CONTRIBUTION_CONFIRM, EVENT_ADMIN_CONTRIBUTION_CREATE, @@ -44,7 +44,6 @@ import { UpdateUnconfirmedContributionContext } from '@/interactions/updateUncon import { LogError } from '@/server/LogError' import { Context, getClientTimezoneOffset, getUser } from '@/server/context' import { TRANSACTIONS_LOCK } from 'database' -import { fullName } from 'core' import { calculateDecay, Decay } from 'shared' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' diff --git a/backend/src/graphql/resolver/EmailOptinCodes.test.ts b/backend/src/graphql/resolver/EmailOptinCodes.test.ts index b916d23b6..18114dbb2 100644 --- a/backend/src/graphql/resolver/EmailOptinCodes.test.ts +++ b/backend/src/graphql/resolver/EmailOptinCodes.test.ts @@ -5,6 +5,7 @@ import { DataSource } from 'typeorm' import { cleanDB, testEnvironment } from '@test/helpers' +import { CONFIG as CORE_CONFIG } from 'core' import { CONFIG } from '@/config' import { writeHomeCommunityEntry } from '@/seeds/community' import { createUser, forgotPassword, setPassword } from '@/seeds/graphql/mutations' @@ -21,7 +22,7 @@ let testEnv: { CONFIG.EMAIL_CODE_VALID_TIME = 1440 CONFIG.EMAIL_CODE_REQUEST_TIME = 10 -CONFIG.EMAIL = false +CORE_CONFIG.EMAIL = false beforeAll(async () => { testEnv = await testEnvironment() diff --git a/backend/src/graphql/resolver/KlicktippResolver.test.ts b/backend/src/graphql/resolver/KlicktippResolver.test.ts index f3ac85ef4..1c285d440 100644 --- a/backend/src/graphql/resolver/KlicktippResolver.test.ts +++ b/backend/src/graphql/resolver/KlicktippResolver.test.ts @@ -2,7 +2,6 @@ import { Event as DbEvent, UserContact } from 'database' import { GraphQLError } from 'graphql' import { cleanDB, resetToken, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' import { getLogger } from 'config-schema/test/testSetup' import { EventType } from '@/event/Events' @@ -20,7 +19,7 @@ let mutate: any let con: any beforeAll(async () => { - testEnv = await testEnvironment(logger, localization) + testEnv = await testEnvironment(logger) mutate = testEnv.mutate con = testEnv.con await cleanDB() diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts index 95aa03993..3d24c42b5 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -43,7 +43,7 @@ const logErrorLogger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.LogError`) jest.mock('@/password/EncryptorUtils') -CONFIG.DLT_CONNECTOR = false +CONFIG.DLT_ACTIVE = false // mock semaphore to allow use fake timers jest.mock('database/src/util/TRANSACTIONS_LOCK') diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index a134ca84b..aeb8aea24 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -34,12 +34,13 @@ import { peterLustig } from '@/seeds/users/peter-lustig' import { stephenHawking } from '@/seeds/users/stephen-hawking' import { getLogger } from 'config-schema/test/testSetup' import { CONFIG } from '@/config' +import { CONFIG as CORE_CONFIG} from 'core' jest.mock('@/password/EncryptorUtils') const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.LogError`) -CONFIG.DLT_CONNECTOR = false -CONFIG.EMAIL = false +CONFIG.DLT_ACTIVE = false +CORE_CONFIG.EMAIL = false let mutate: ApolloServerTestClient['mutate'] let query: ApolloServerTestClient['query'] @@ -72,7 +73,6 @@ let peter: User let homeCom: DbCommunity let foreignCom: DbCommunity -let fedForeignCom: DbFederatedCommunity describe('send coins', () => { beforeAll(async () => { diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 359e69b45..923971743 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -1,14 +1,11 @@ import { AppDatabase, countOpenPendingTransactions, - Community as DbCommunity, DltTransaction as DbDltTransaction, Transaction as dbTransaction, TransactionLink as dbTransactionLink, User as dbUser, findUserByIdentifier, - TransactionLoggingView, - UserLoggingView } from 'database' import { Decimal } from 'decimal.js-light' import { Args, Authorized, Ctx, Mutation, Query, Resolver } from 'type-graphql' @@ -20,21 +17,22 @@ import { Order } from '@enum/Order' import { Transaction } from '@model/Transaction' import { TransactionList } from '@model/TransactionList' import { User } from '@model/User' -import { processXComCompleteTransaction, TransactionTypeId } from 'core' - +import { + fullName, + processXComCompleteTransaction, + sendTransactionLinkRedeemedEmail, + sendTransactionReceivedEmail, + TransactionTypeId +} from 'core' import { RIGHTS } from '@/auth/RIGHTS' import { CONFIG } from '@/config' import { - sendTransactionLinkRedeemedEmail, - sendTransactionReceivedEmail, -} from '@/emails/sendEmailVariants' -import { EVENT_TRANSACTION_RECEIVE, EVENT_TRANSACTION_SEND } from '@/event/Events' + EVENT_TRANSACTION_RECEIVE, EVENT_TRANSACTION_SEND } from '@/event/Events' import { LogError } from '@/server/LogError' import { Context, getUser } from '@/server/context' import { communityUser } from '@/util/communityUser' import { calculateBalance } from '@/util/validate' import { virtualDecayTransaction, virtualLinkTransaction } from '@/util/virtualTransactions' -import { fullName } from 'core' import { TRANSACTIONS_LOCK } from 'database' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 8b4faa443..c5a64cb36 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -20,7 +20,6 @@ import { UserContactType } from '@enum/UserContactType' import { ContributionLink } from '@model/ContributionLink' import { Location } from '@model/Location' import { cleanDB, headerPushMock, resetToken, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' import { subscribe } from '@/apis/KlicktippController' import { CONFIG } from '@/config' @@ -28,7 +27,7 @@ import { sendAccountActivationEmail, sendAccountMultiRegistrationEmail, sendResetPasswordEmail, -} from '@/emails/sendEmailVariants' +} from 'core' import { EventType } from '@/event/Events' import { PublishNameType } from '@/graphql/enum/PublishNameType' import { SecretKeyCryptographyCreateKey } from '@/password/EncryptorUtils' @@ -74,16 +73,15 @@ import { Location2Point } from './util/Location2Point' jest.mock('@/apis/humhub/HumHubClient') jest.mock('@/password/EncryptorUtils') -jest.mock('@/emails/sendEmailVariants', () => { - const originalModule = jest.requireActual('@/emails/sendEmailVariants') +jest.mock('core', () => { + const originalModule = jest.requireActual('core') return { __esModule: true, ...originalModule, - sendAccountActivationEmail: jest.fn((a) => originalModule.sendAccountActivationEmail(a)), - sendAccountMultiRegistrationEmail: jest.fn((a) => - originalModule.sendAccountMultiRegistrationEmail(a), - ), - sendResetPasswordEmail: jest.fn((a) => originalModule.sendResetPasswordEmail(a)), + sendAccountActivationEmail: jest.fn(), + sendAccountMultiRegistrationEmail: jest.fn(), + sendResetPasswordEmail: jest.fn(), + sendEmailTranslated: jest.fn(), } }) @@ -112,12 +110,12 @@ let testEnv: { } beforeAll(async () => { - testEnv = await testEnvironment(getLogger('apollo'), localization) + testEnv = await testEnvironment(getLogger('apollo')) mutate = testEnv.mutate query = testEnv.query con = testEnv.con CONFIG.HUMHUB_ACTIVE = false - CONFIG.DLT_CONNECTOR = false + CONFIG.DLT_ACTIVE = false await cleanDB() }) @@ -155,6 +153,7 @@ describe('UserResolver', () => { expect(result).toEqual( expect.objectContaining({ data: { createUser: { id: expect.any(Number) } } }), ) + }) describe('valid input data', () => { diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 70b1642a8..4a2ca85ca 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -10,7 +10,6 @@ import { findUserByIdentifier } from 'database' import { GraphQLResolveInfo } from 'graphql' -import i18n from 'i18n' import { Arg, Args, @@ -57,11 +56,6 @@ import { encode } from '@/auth/JWT' import { RIGHTS } from '@/auth/RIGHTS' import { CONFIG } from '@/config' import { PublishNameLogic } from '@/data/PublishName.logic' -import { - sendAccountActivationEmail, - sendAccountMultiRegistrationEmail, - sendResetPasswordEmail, -} from '@/emails/sendEmailVariants' import { EVENT_ADMIN_USER_DELETE, EVENT_ADMIN_USER_ROLE_SET, @@ -85,8 +79,12 @@ import { Context, getClientTimezoneOffset, getUser } from '@/server/context' import { communityDbUser } from '@/util/communityUser' import { hasElopageBuys } from '@/util/hasElopageBuys' import { durationInMinutesFromDates, getTimeDurationObject, printTimeDuration } from '@/util/time' -import { delay } from 'core' - +import { + delay, + sendAccountActivationEmail, + sendAccountMultiRegistrationEmail, + sendResetPasswordEmail, +} from 'core' import random from 'random-bigint' import { randombytes_random } from 'sodium-native' @@ -233,7 +231,6 @@ export class UserResolver { logger.debug('validation of login credentials successful...') const user = new User(dbUser) - i18n.setLocale(user.language) // Elopage Status & Stored PublisherId user.hasElopage = await this.hasElopage({ ...context, user: dbUser }) @@ -322,7 +319,6 @@ export class UserResolver { if (!language || !isLanguage(language)) { language = DEFAULT_LANGUAGE } - i18n.setLocale(language) // check if user with email still exists? email = email.trim().toLowerCase() @@ -764,7 +760,6 @@ export class UserResolver { throw new LogError('Given language is not a valid language or not supported') } user.language = language - i18n.setLocale(language) updated = true } diff --git a/backend/src/graphql/resolver/semaphore.test.ts b/backend/src/graphql/resolver/semaphore.test.ts index d0bf08b7c..791ec0491 100644 --- a/backend/src/graphql/resolver/semaphore.test.ts +++ b/backend/src/graphql/resolver/semaphore.test.ts @@ -22,12 +22,13 @@ import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { bobBaumeister } from '@/seeds/users/bob-baumeister' import { peterLustig } from '@/seeds/users/peter-lustig' import { CONFIG } from '@/config' +import { CONFIG as CORE_CONFIG } from 'core' import { TRANSACTIONS_LOCK } from 'database' jest.mock('@/password/EncryptorUtils') -CONFIG.DLT_CONNECTOR = false -CONFIG.EMAIL = false +CONFIG.DLT_ACTIVE = false +CORE_CONFIG.EMAIL = false let mutate: ApolloServerTestClient['mutate'] let con: DataSource diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 44db02c8f..36d9adfeb 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -18,7 +18,6 @@ export const userFactory = async ( // console.log('call createUser with', JSON.stringify(user, null, 2)) const response = await mutate({ mutation: createUser, variables: user }) if (!response?.data?.createUser) { - // biome-ignore lint/suspicious/noConsole: will be used in tests where logging is mocked // console.log(JSON.stringify(response, null, 2)) throw new Error('createUser mutation returned unexpected response') } diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts index 451f671ac..3a1504262 100644 --- a/backend/src/seeds/index.ts +++ b/backend/src/seeds/index.ts @@ -3,6 +3,7 @@ import { entities } from 'database' import { datatype, internet, name } from 'faker' import { CONFIG } from '@/config' +import { CONFIG as CORE_CONFIG } from 'core' import { createServer } from '@/server/createServer' import { initLogging } from '@/server/logger' @@ -17,7 +18,7 @@ import { userFactory } from './factory/user' import { transactionLinks } from './transactionLink/index' import { users } from './users/index' -CONFIG.EMAIL = false +CORE_CONFIG.EMAIL = false const logger = getLogger('seed') const context = { diff --git a/backend/src/server/createServer.ts b/backend/src/server/createServer.ts index 5f3bb02ef..eaa2ea5b4 100644 --- a/backend/src/server/createServer.ts +++ b/backend/src/server/createServer.ts @@ -1,4 +1,5 @@ import { CONFIG } from '@/config' +import { CONFIG as CORE_CONFIG } from 'core' import { schema } from '@/graphql/schema' import { elopageWebhook } from '@/webhook/elopage' import { gmsWebhook } from '@/webhook/gms' @@ -28,7 +29,6 @@ interface ServerDef { export const createServer = async ( apolloLogger: Logger, context: any = serverContext, - localization: i18n.I18n = i18n, ): Promise => { const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.createServer`) logger.debug('createServer...') @@ -73,9 +73,9 @@ export const createServer = async ( app.use(json()) // bodyparser urlencoded for elopage app.use(urlencoded({ extended: true })) - + // i18n - app.use(localization.init) + app.use(i18n.init) // Elopage Webhook @@ -100,7 +100,7 @@ export const createServer = async ( }) apollo.applyMiddleware({ app, path: '/' }) logger.info( - `running with PRODUCTION=${CONFIG.PRODUCTION}, sending EMAIL enabled=${CONFIG.EMAIL} and EMAIL_TEST_MODUS=${CONFIG.EMAIL_TEST_MODUS} ...`, + `running with PRODUCTION=${CONFIG.PRODUCTION}, sending EMAIL enabled=${CORE_CONFIG.EMAIL} and EMAIL_TEST_MODUS=${CORE_CONFIG.EMAIL_TEST_MODUS} ...`, ) logger.debug('createServer...successful') diff --git a/backend/src/server/localization.ts b/backend/src/server/localization.ts index 1e587104a..2332f0eaf 100644 --- a/backend/src/server/localization.ts +++ b/backend/src/server/localization.ts @@ -1,4 +1,3 @@ -import path from 'node:path' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import i18n from 'i18n' import { getLogger } from 'log4js' @@ -9,7 +8,10 @@ i18n.configure({ locales: ['en', 'de'], defaultLocale: 'en', retryInDefaultLocale: false, - directory: path.join(__dirname, '..', 'locales'), + staticCatalog: { + en: { general: { decimalSeparator: "." } }, + de: { general: { decimalSeparator: "," } }, + }, // autoReload: true, // if this is activated the seeding hangs at the very end updateFiles: false, objectNotation: true, diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts index c7f533931..7001e3067 100644 --- a/backend/test/helpers.ts +++ b/backend/test/helpers.ts @@ -3,8 +3,6 @@ import { entities } from 'database' import { createServer } from '@/server/createServer' -import { i18n } from './testSetup' - import { getLogger } from 'log4js' export const headerPushMock = jest.fn((t) => { @@ -29,8 +27,8 @@ export const cleanDB = async () => { } } -export const testEnvironment = async (testLogger = getLogger('apollo'), testI18n = i18n) => { - const server = await createServer( testLogger, context, testI18n) +export const testEnvironment = async (testLogger = getLogger('apollo')) => { + const server = await createServer( testLogger, context) const con = server.con const testClient = createTestClient(server.apollo) const mutate = testClient.mutate diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts index c010ff705..841046e0f 100644 --- a/backend/test/testSetup.ts +++ b/backend/test/testSetup.ts @@ -1,27 +1,13 @@ import 'openai/shims/node' import { CONFIG } from '@/config' -import { i18n } from '@/server/localization' +import { CONFIG as CORE_CONFIG } from 'core' import { getLogger, printLogs, clearLogs } from 'config-schema/test/testSetup' -CONFIG.EMAIL = true -CONFIG.EMAIL_TEST_MODUS = false +CORE_CONFIG.EMAIL = false +CORE_CONFIG.EMAIL_TEST_MODUS = false CONFIG.HUMHUB_ACTIVE = false CONFIG.GMS_ACTIVE = false jest.setTimeout(1000000) -jest.mock('@/server/localization', () => { - const originalModule = jest.requireActual('@/server/localization') - return { - __esModule: true, - ...originalModule, - i18n: { - init: jest.fn(), - // configure: jest.fn(), - // __: jest.fn(), - // setLocale: jest.fn(), - }, - } -}) - -export { i18n, getLogger, printLogs, clearLogs as cleanLogs } +export { getLogger, printLogs, clearLogs as cleanLogs } diff --git a/backend/tsconfig.json b/backend/tsconfig.json index 2152f4b79..b71bf1938 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -63,7 +63,7 @@ "typeRoots": [ /* List of folders to include type definitions from. */ "@types", "node_modules/@types", - "../node_modules/@types" + "../node_modules/@types", ], // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ @@ -86,6 +86,9 @@ "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ }, + "include": [ + "../core/src/types" + ], "ts-node": { "swc": true } diff --git a/backend/turbo.json b/backend/turbo.json index 822b2765f..399bfa6ba 100644 --- a/backend/turbo.json +++ b/backend/turbo.json @@ -8,10 +8,8 @@ "locales": {}, "locales:fix": {}, "lint": { - "dependsOn": ["locales"] }, "lint:fix": { - "dependsOn": ["locales:fix"] }, "test": { "dependsOn": ["database#up:backend_test", "^build"] diff --git a/bun.lock b/bun.lock index db5bdb51d..6dd175b61 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "gradido", @@ -13,12 +14,12 @@ "devDependencies": { "@biomejs/biome": "2.0.0", "@types/minimatch": "6.0.0", - "bbump": "^1.0.2", + "bumpp": "^10.3.1", }, }, "admin": { "name": "admin", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "@iconify/json": "^2.2.228", "@popperjs/core": "^2.11.8", @@ -88,7 +89,7 @@ }, "backend": { "name": "backend", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "cross-env": "^7.0.3", "email-templates": "^10.0.1", @@ -108,7 +109,6 @@ "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -142,11 +142,9 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "^6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", - "pug": "^3.0.2", "random-bigint": "^0.0.1", "reflect-metadata": "^0.1.13", "regenerator-runtime": "^0.14.1", @@ -166,7 +164,7 @@ }, "config-schema": { "name": "config-schema", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "esbuild": "^0.25.2", "joi": "17.13.3", @@ -184,36 +182,43 @@ }, "core": { "name": "core", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "database": "*", + "email-templates": "^10.0.1", "esbuild": "^0.25.2", "i18n": "^0.15.1", "joi": "^17.13.3", "jose": "^4.14.4", "log4js": "^6.9.1", + "nodemailer": "^6.6.5", + "pug": "^3.0.2", "shared": "*", "sodium-native": "^3.4.1", "zod": "^3.25.61", }, "devDependencies": { "@biomejs/biome": "2.0.0", + "@types/email-templates": "^10.0.4", "@types/i18n": "^0.13.4", "@types/minimatch": "6.0.0", "@types/node": "^17.0.21", + "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "config-schema": "*", "decimal.js-light": "^2.5.1", "dotenv": "^10.0.0", "graphql-request": "5.0.0", "jest": "27.2.4", + "mkdirp": "^3.0.1", + "ncp": "^2.0.0", "type-graphql": "^1.1.1", "typescript": "^4.9.5", }, }, "database": { "name": "database", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "@types/uuid": "^8.3.4", "cross-env": "^7.0.3", @@ -223,7 +228,7 @@ "geojson": "^0.5.0", "log4js": "^6.9.1", "mysql": "^2.18.1", - "mysql2": "^2.3.0", + "mysql2": "^3.15.3", "reflect-metadata": "^0.1.13", "shared": "*", "source-map-support": "^0.5.21", @@ -235,27 +240,19 @@ }, "devDependencies": { "@biomejs/biome": "2.0.0", - "@swc-node/register": "^1.10.10", - "@swc/cli": "^0.7.3", - "@swc/core": "^1.11.24", - "@swc/helpers": "^0.5.17", "@types/faker": "^5.5.9", "@types/geojson": "^7946.0.13", - "@types/jest": "27.0.2", "@types/mysql": "^2.15.27", "@types/node": "^18.7.14", "await-semaphore": "^0.1.3", "crypto-random-bigint": "^2.1.1", - "jest": "27.2.4", - "ts-jest": "27.0.5", "ts-node": "^10.9.2", "typescript": "^4.9.5", - "vitest": "^2.0.5", }, }, "dht-node": { "name": "dht-node", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "cross-env": "^7.0.3", "dht-rpc": "6.18.1", @@ -292,9 +289,10 @@ }, "federation": { "name": "federation", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "cross-env": "^7.0.3", + "email-templates": "^10.0.1", "sodium-native": "^3.4.1", }, "devDependencies": { @@ -332,6 +330,8 @@ "joi": "17.13.3", "lodash.clonedeep": "^4.5.0", "log4js": "^6.7.1", + "mkdirp": "^3.0.1", + "ncp": "^2.0.0", "nodemon": "^2.0.7", "prettier": "^3.5.3", "reflect-metadata": "^0.1.13", @@ -348,7 +348,7 @@ }, "frontend": { "name": "frontend", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "@morev/vue-transitions": "^3.0.2", "@types/leaflet": "^1.9.12", @@ -444,7 +444,7 @@ }, "shared": { "name": "shared", - "version": "2.7.0", + "version": "2.7.1", "dependencies": { "decimal.js-light": "^2.5.1", "esbuild": "^0.25.2", @@ -492,53 +492,55 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-ses": ["@aws-sdk/client-ses@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-jUF1mN+webeAgkNXS/tl6KpJyUbsAWxQGsQgsWoHwaNCSnxMDBEyPmgBnzbqf2CrybIa7zmzaqCO0z6FgKeZRg=="], + "@aws-sdk/client-ses": ["@aws-sdk/client-ses@3.936.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.936.0", "@aws-sdk/credential-provider-node": "3.936.0", "@aws-sdk/middleware-host-header": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", "@aws-sdk/middleware-user-agent": "3.936.0", "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.936.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", "@smithy/middleware-serde": "^4.2.6", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.11", "@smithy/util-defaults-mode-node": "^4.2.14", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-2toHYwRkcYGasPHYGwOwaIAa2Api/uFhmL3px0Tyt4bne2ilqhSwq+6a/0UVMd8JYwWaLMJolTbWKFt2jUlmGg=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.936.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.936.0", "@aws-sdk/middleware-host-header": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", "@aws-sdk/middleware-user-agent": "3.936.0", "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.936.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", "@smithy/middleware-serde": "^4.2.6", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.11", "@smithy/util-defaults-mode-node": "^4.2.14", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ=="], - "@aws-sdk/core": ["@aws-sdk/core@3.911.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws-sdk/xml-builder": "3.911.0", "@smithy/core": "^3.16.1", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/signature-v4": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw=="], + "@aws-sdk/core": ["@aws-sdk/core@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@aws-sdk/xml-builder": "3.930.0", "@smithy/core": "^3.18.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/node-http-handler": "^4.4.1", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" } }, "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/node-http-handler": "^4.4.5", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" } }, "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.913.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/credential-provider-env": "3.936.0", "@aws-sdk/credential-provider-http": "3.936.0", "@aws-sdk/credential-provider-login": "3.936.0", "@aws-sdk/credential-provider-process": "3.936.0", "@aws-sdk/credential-provider-sso": "3.936.0", "@aws-sdk/credential-provider-web-identity": "3.936.0", "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.913.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-8DVrdRqPyUU66gfV7VZNToh56ZuO5D6agWrkLQE/xbLJOm2RbeRgh6buz7CqV8ipRd6m+zCl9mM4F3osQLZn8Q=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.936.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.936.0", "@aws-sdk/credential-provider-http": "3.936.0", "@aws-sdk/credential-provider-ini": "3.936.0", "@aws-sdk/credential-provider-process": "3.936.0", "@aws-sdk/credential-provider-sso": "3.936.0", "@aws-sdk/credential-provider-web-identity": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.911.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.911.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/token-providers": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.936.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.936.0", "@aws-sdk/core": "3.936.0", "@aws-sdk/token-providers": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@smithy/core": "^3.16.1", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@aws/lambda-invoke-store": "^0.2.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@smithy/core": "^3.18.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/node-config-provider": "^4.3.2", "@smithy/types": "^4.7.1", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.936.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.936.0", "@aws-sdk/middleware-host-header": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", "@aws-sdk/middleware-user-agent": "3.936.0", "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.936.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", "@smithy/fetch-http-handler": "^5.3.6", "@smithy/hash-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", "@smithy/middleware-serde": "^4.2.6", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.11", "@smithy/util-defaults-mode-node": "^4.2.14", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@smithy/config-resolver": "^4.4.3", "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw=="], - "@aws-sdk/types": ["@aws-sdk/types@3.910.0", "", { "dependencies": { "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.936.0", "", { "dependencies": { "@aws-sdk/core": "3.936.0", "@aws-sdk/nested-clients": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-endpoints": "^3.2.2", "tslib": "^2.6.2" } }, "sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A=="], + "@aws-sdk/types": ["@aws-sdk/types@3.936.0", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg=="], + + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" } }, "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w=="], "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.893.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/types": "^4.7.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.936.0", "", { "dependencies": { "@aws-sdk/types": "3.936.0", "@smithy/types": "^4.9.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.911.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/node-config-provider": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.936.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.936.0", "@aws-sdk/types": "3.936.0", "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.911.0", "", { "dependencies": { "@smithy/types": "^4.7.1", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.930.0", "", { "dependencies": { "@smithy/types": "^4.9.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA=="], - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.0.1", "", {}, "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw=="], + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.1", "", {}, "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], @@ -656,12 +658,6 @@ "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.2.1", "", {}, "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg=="], - "@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], - - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.11", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.25.11", "", { "os": "android", "cpu": "arm" }, "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg=="], @@ -760,10 +756,6 @@ "@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="], - "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], - - "@inquirer/figures": ["@inquirer/figures@1.0.14", "", {}, "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ=="], - "@intlify/bundle-utils": ["@intlify/bundle-utils@10.0.1", "", { "dependencies": { "@intlify/message-compiler": "^11.1.2", "@intlify/shared": "^11.1.2", "acorn": "^8.8.2", "escodegen": "^2.1.0", "estree-walker": "^2.0.2", "jsonc-eslint-parser": "^2.3.0", "mlly": "^1.2.0", "source-map-js": "^1.0.1", "yaml-eslint-parser": "^1.2.2" } }, "sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ=="], "@intlify/core-base": ["@intlify/core-base@9.13.1", "", { "dependencies": { "@intlify/message-compiler": "9.13.1", "@intlify/shared": "9.13.1" } }, "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w=="], @@ -778,6 +770,8 @@ "@intlify/vue-i18n-extensions": ["@intlify/vue-i18n-extensions@8.0.0", "", { "dependencies": { "@babel/parser": "^7.24.6", "@intlify/shared": "^10.0.0", "@vue/compiler-dom": "^3.2.45", "vue-i18n": "^10.0.0" }, "peerDependencies": { "vue": "^3.0.0" }, "optionalPeers": ["vue"] }, "sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ=="], + "@ioredis/commands": ["@ioredis/commands@1.4.0", "", {}, "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ=="], + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], @@ -888,8 +882,6 @@ "@napi-rs/nice-win32-x64-msvc": ["@napi-rs/nice-win32-x64-msvc@1.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -900,44 +892,6 @@ "@one-ini/wasm": ["@one-ini/wasm@0.1.1", "", {}, "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="], - "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.11.0", "", { "os": "android", "cpu": "arm" }, "sha512-aN0UJg1xr0N1dADQ135z4p3bP9AYAUN1Ey2VvLMK6IwWYIJGWpKT+cr1l3AiyBeLK8QZyFDb4IDU8LHgjO9TDQ=="], - - "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.11.0", "", { "os": "android", "cpu": "arm64" }, "sha512-FckvvMclo8CSJqQjKpHueIIbKrg9L638NKWQTiJQaD8W9F61h8hTjF8+QFLlCHh6R9RcE5roVHdkkiBKHlB2Zw=="], - - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.11.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-7ZcpgaXSBnwRHM1YR8Vazq7mCTtGdYRvM7k46CscA+oipCVqmI4LbW2wLsc6HVjqX+SM/KPOfFGoGjEgmQPFTQ=="], - - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.11.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Wsd1JWORokMmOKrR4t4jxpwYEWG11+AHWu9bdzjCO5EIyi0AuNpPIAEcEFCP9FNd0h8c+VUYbMRU/GooD2zOIg=="], - - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.11.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YX+W10kHrMouu/+Y+rqJdCWO3dFBKM1DIils30PHsmXWp1v+ZZvhibaST2BP6zrWkWquZ8pMmsObD6N10lLgiA=="], - - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.11.0", "", { "os": "linux", "cpu": "arm" }, "sha512-UAhlhVkW2ui98bClmEkDLKQz4XBSccxMahG7rMeX2RepS2QByAWxYFFThaNbHtBSB+B4Rc1hudkihq8grQkU3g=="], - - "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.11.0", "", { "os": "linux", "cpu": "arm" }, "sha512-5pEliabSEiimXz/YyPxzyBST82q8PbM6BoEMS8kOyaDbEBuzTr7pWU1U0F7ILGBFjJmHaj3N7IAhQgeXdpdySg=="], - - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.11.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-CiyufPFIOJrW/HovAMGsH0AbV7BSCb0oE0KDtt7z1+e+qsDo7HRlTSnqE3JbNuhJRg3Cz/j7qEYzgGqco9SE4Q=="], - - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.11.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-w07MfGtDLZV0rISdXl2cGASxD/sRrrR93Qd4q27O2Hsky4MGbLw94trbzhmAkc7OKoJI0iDg1217i3jfxmVk1Q=="], - - "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.11.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gzM+ZfIjfcCofwX/m1eLCoTT+3T70QLWaKDOW5Hf3+ddLlxMEVRIQtUoRsp0e/VFanr7u7VKS57TxhkRubseNg=="], - - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.11.0", "", { "os": "linux", "cpu": "none" }, "sha512-oCR0ImJQhIwmqwNShsRT0tGIgKF5/H4nhtIEkQAQ9bLzMgjtRqIrZ3DtGHqd7w58zhXWfIZdyPNF9IrSm+J/fQ=="], - - "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.11.0", "", { "os": "linux", "cpu": "none" }, "sha512-MjCEqsUzXMfWPfsEUX+UXttzXz6xiNU11r7sj00C5og/UCyqYw1OjrbC/B1f/dloDpTn0rd4xy6c/LTvVQl2tg=="], - - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.11.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4TaTX7gT3357vWQsTe3IfDtWyJNe0FejypQ4ngwxB3v1IVaW6KAUt0huSvx/tmj+YWxd3zzXdWd8AzW0jo6dpg=="], - - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.11.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ch1o3+tBra9vmrgXqrufVmYnvRPFlyUb7JWs/VXndBmyNSuP2KP+guAUrC0fr2aSGoOQOasAiZza7MTFU7Vrxg=="], - - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.11.0", "", { "os": "linux", "cpu": "x64" }, "sha512-llTdl2gJAqXaGV7iV1w5BVlqXACcoT1YD3o840pCQx1ZmKKAAz7ydPnTjYVdkGImXNWPOIWJixHW0ryDm4Mx7w=="], - - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.11.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-cROavohP0nX91NtIVVgOTugqoxlUSNxI9j7MD+B7fmD3gEFl8CVyTamR0/p6loDxLv51bQYTHRKn/ZYTd3ENzw=="], - - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.11.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-6amVs34yHmxE6Q3CtTPXnSvIYGqwQJ/lVVRYccLzg9smge3WJ1knyBV5jpKKayp0n316uPYzB4EgEbgcuRvrPw=="], - - "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.11.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-v/IZ5s2/3auHUoi0t6Ea1CDsWxrE9BvgvbDcJ04QX+nEbmTBazWPZeLsH8vWkRAh8EUKCZHXxjQsPhEH5Yk5pQ=="], - - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.11.0", "", { "os": "win32", "cpu": "x64" }, "sha512-qvm+IQ6r2q4HZitSV69O+OmvCD1y4pH7SbhR6lPwLsfZS5QRHS8V20VHxmG1jJzSPPw7S8Bb1rdNcxDSqc4bYA=="], - "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], @@ -1056,55 +1010,55 @@ "@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], - "@smithy/abort-controller": ["@smithy/abort-controller@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ=="], + "@smithy/abort-controller": ["@smithy/abort-controller@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA=="], - "@smithy/config-resolver": ["@smithy/config-resolver@4.3.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw=="], + "@smithy/config-resolver": ["@smithy/config-resolver@4.4.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw=="], - "@smithy/core": ["@smithy/core@3.17.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-stream": "^4.5.3", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg=="], + "@smithy/core": ["@smithy/core@3.18.5", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.6", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw=="], - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw=="], + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ=="], - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.4", "", { "dependencies": { "@smithy/protocol-http": "^5.3.3", "@smithy/querystring-builder": "^4.2.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw=="], + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.6", "", { "dependencies": { "@smithy/protocol-http": "^5.3.5", "@smithy/querystring-builder": "^4.2.5", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg=="], - "@smithy/hash-node": ["@smithy/hash-node@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g=="], + "@smithy/hash-node": ["@smithy/hash-node@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA=="], - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q=="], + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A=="], "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ=="], - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.3", "", { "dependencies": { "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA=="], + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.5", "", { "dependencies": { "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.3.4", "", { "dependencies": { "@smithy/core": "^3.17.0", "@smithy/middleware-serde": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "@smithy/url-parser": "^4.2.3", "@smithy/util-middleware": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.3.12", "", { "dependencies": { "@smithy/core": "^3.18.5", "@smithy/middleware-serde": "^4.2.6", "@smithy/node-config-provider": "^4.3.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "@smithy/url-parser": "^4.2.5", "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" } }, "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/protocol-http": "^5.3.3", "@smithy/service-error-classification": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-retry": "^4.2.3", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.12", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/service-error-classification": "^4.2.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ=="], - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.3", "", { "dependencies": { "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ=="], + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.6", "", { "dependencies": { "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ=="], - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA=="], + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ=="], - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.3", "", { "dependencies": { "@smithy/property-provider": "^4.2.3", "@smithy/shared-ini-file-loader": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA=="], + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.5", "", { "dependencies": { "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.2", "", { "dependencies": { "@smithy/abort-controller": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/querystring-builder": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.5", "", { "dependencies": { "@smithy/abort-controller": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/querystring-builder": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw=="], - "@smithy/property-provider": ["@smithy/property-provider@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ=="], + "@smithy/property-provider": ["@smithy/property-provider@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg=="], - "@smithy/protocol-http": ["@smithy/protocol-http@5.3.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw=="], + "@smithy/protocol-http": ["@smithy/protocol-http@5.3.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ=="], - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ=="], + "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg=="], - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA=="], + "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ=="], - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0" } }, "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g=="], + "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0" } }, "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ=="], - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.3.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ=="], + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.0", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA=="], - "@smithy/signature-v4": ["@smithy/signature-v4@5.3.3", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.3", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA=="], + "@smithy/signature-v4": ["@smithy/signature-v4@5.3.5", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.5", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.9.0", "", { "dependencies": { "@smithy/core": "^3.17.0", "@smithy/middleware-endpoint": "^4.3.4", "@smithy/middleware-stack": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", "@smithy/util-stream": "^4.5.3", "tslib": "^2.6.2" } }, "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.9.8", "", { "dependencies": { "@smithy/core": "^3.18.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-stack": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" } }, "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA=="], - "@smithy/types": ["@smithy/types@4.8.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ=="], + "@smithy/types": ["@smithy/types@4.9.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA=="], - "@smithy/url-parser": ["@smithy/url-parser@4.2.3", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw=="], + "@smithy/url-parser": ["@smithy/url-parser@4.2.5", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ=="], "@smithy/util-base64": ["@smithy/util-base64@4.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ=="], @@ -1116,36 +1070,30 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.3", "", { "dependencies": { "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.11", "", { "dependencies": { "@smithy/property-provider": "^4.2.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.4", "", { "dependencies": { "@smithy/config-resolver": "^4.3.3", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", "@smithy/smithy-client": "^4.9.0", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.14", "", { "dependencies": { "@smithy/config-resolver": "^4.4.3", "@smithy/credential-provider-imds": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA=="], - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ=="], + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A=="], "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw=="], - "@smithy/util-middleware": ["@smithy/util-middleware@4.2.3", "", { "dependencies": { "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw=="], + "@smithy/util-middleware": ["@smithy/util-middleware@4.2.5", "", { "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA=="], - "@smithy/util-retry": ["@smithy/util-retry@4.2.3", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg=="], + "@smithy/util-retry": ["@smithy/util-retry@4.2.5", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg=="], - "@smithy/util-stream": ["@smithy/util-stream@4.5.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.4", "@smithy/node-http-handler": "^4.4.2", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A=="], + "@smithy/util-stream": ["@smithy/util-stream@4.5.6", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.6", "@smithy/node-http-handler": "^4.4.5", "@smithy/types": "^4.9.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ=="], "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA=="], "@smithy/util-utf8": ["@smithy/util-utf8@4.2.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw=="], - "@smithy/util-waiter": ["@smithy/util-waiter@4.2.3", "", { "dependencies": { "@smithy/abort-controller": "^4.2.3", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" } }, "sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ=="], + "@smithy/util-waiter": ["@smithy/util-waiter@4.2.5", "", { "dependencies": { "@smithy/abort-controller": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" } }, "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g=="], "@smithy/uuid": ["@smithy/uuid@1.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw=="], "@sqltools/formatter": ["@sqltools/formatter@1.2.5", "", {}, "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw=="], - "@swc-node/core": ["@swc-node/core@1.14.1", "", { "peerDependencies": { "@swc/core": ">= 1.13.3", "@swc/types": ">= 0.1" } }, "sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw=="], - - "@swc-node/register": ["@swc-node/register@1.11.1", "", { "dependencies": { "@swc-node/core": "^1.14.1", "@swc-node/sourcemap-support": "^0.6.1", "colorette": "^2.0.20", "debug": "^4.4.1", "oxc-resolver": "^11.6.1", "pirates": "^4.0.7", "tslib": "^2.8.1" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3" } }, "sha512-VQ0hJ5jX31TVv/fhZx4xJRzd8pwn6VvzYd2tGOHHr2TfXGCBixZoqdPDXTiEoJLCTS2MmvBf6zyQZZ0M8aGQCQ=="], - - "@swc-node/sourcemap-support": ["@swc-node/sourcemap-support@0.6.1", "", { "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.8.1" } }, "sha512-ovltDVH5QpdHXZkW138vG4+dgcNsxfwxHVoV6BtmTbz2KKl1A8ZSlbdtxzzfNjCjbpayda8Us9eMtcHobm38dA=="], - "@swc/cli": ["@swc/cli@0.7.8", "", { "dependencies": { "@swc/counter": "^0.1.3", "@xhmikosr/bin-wrapper": "^13.0.5", "commander": "^8.3.0", "minimatch": "^9.0.3", "piscina": "^4.3.1", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3", "tinyglobby": "^0.2.13" }, "peerDependencies": { "@swc/core": "^1.2.66", "chokidar": "^4.0.1" }, "optionalPeers": ["chokidar"], "bin": { "swc": "bin/swc.js", "swcx": "bin/swcx.js", "spack": "bin/spack.js" } }, "sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w=="], "@swc/core": ["@swc/core@1.13.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.13.5", "@swc/core-darwin-x64": "1.13.5", "@swc/core-linux-arm-gnueabihf": "1.13.5", "@swc/core-linux-arm64-gnu": "1.13.5", "@swc/core-linux-arm64-musl": "1.13.5", "@swc/core-linux-x64-gnu": "1.13.5", "@swc/core-linux-x64-musl": "1.13.5", "@swc/core-win32-arm64-msvc": "1.13.5", "@swc/core-win32-ia32-msvc": "1.13.5", "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ=="], @@ -1194,8 +1142,6 @@ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], - "@types/accepts": ["@types/accepts@1.3.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -1286,7 +1232,7 @@ "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], - "@types/nodemailer": ["@types/nodemailer@6.4.20", "", { "dependencies": { "@aws-sdk/client-ses": "^3.731.1", "@types/node": "*" } }, "sha512-uj83z0GqwqMUE6RI4EKptPlav0FYE6vpIlqJAnxzu+/sSezRdbH69rSBCMsdW6DdsCAzoFQZ52c2UIlhRVQYDA=="], + "@types/nodemailer": ["@types/nodemailer@6.4.21", "", { "dependencies": { "@aws-sdk/client-ses": "^3.731.1", "@types/node": "*" } }, "sha512-Eix+sb/Nj28MNnWvO2X1OLrk5vuD4C9SMnb2Vf4itWnxphYeSceqkFX7IdmxTzn+dvmnNz7paMbg4Uc60wSfJg=="], "@types/prettier": ["@types/prettier@2.7.3", "", {}, "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA=="], @@ -1454,6 +1400,8 @@ "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + "@zone-eu/mailsplit": ["@zone-eu/mailsplit@5.4.7", "", { "dependencies": { "libbase64": "1.3.0", "libmime": "5.3.7", "libqp": "2.1.1" } }, "sha512-jApX86aDgolMz08pP20/J2zcns02NSK3zSiYouf01QQg4250L+GUAWSWicmS7eRvs+Z7wP7QfXrnkaTBGrIpwQ=="], + "abab": ["abab@2.0.6", "", {}, "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="], "abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], @@ -1494,7 +1442,7 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], + "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], @@ -1550,6 +1498,8 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "args-tokenizer": ["args-tokenizer@0.3.0", "", {}, "sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q=="], + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], "array-differ": ["array-differ@3.0.0", "", {}, "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg=="], @@ -1596,6 +1546,8 @@ "await-semaphore": ["await-semaphore@0.1.3", "", {}, "sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q=="], + "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="], + "axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], @@ -1636,8 +1588,6 @@ "baseline-browser-mapping": ["baseline-browser-mapping@2.8.18", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w=="], - "bbump": ["bbump@1.0.2", "", { "dependencies": { "inquirer": "^9.0.0" }, "bin": { "bbump": "index.js" } }, "sha512-JGwlqjBF9cvPCjONPlb8R7YH4Uum8E06MJchUxpbjr2Ft7v/hjq+mM7zq93anI0Ww7sg9WAQulzCVDGUnd9YdQ=="], - "bignumber.js": ["bignumber.js@9.0.0", "", {}, "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="], "bin-version": ["bin-version@6.0.0", "", { "dependencies": { "execa": "^5.0.0", "find-versions": "^5.0.0" } }, "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw=="], @@ -1648,8 +1598,6 @@ "birpc": ["birpc@2.6.1", "", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], @@ -1688,6 +1636,8 @@ "builtins": ["builtins@5.1.0", "", { "dependencies": { "semver": "^7.0.0" } }, "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg=="], + "bumpp": ["bumpp@10.3.1", "", { "dependencies": { "ansis": "^4.2.0", "args-tokenizer": "^0.3.0", "c12": "^3.3.0", "cac": "^6.7.14", "escalade": "^3.2.0", "jsonc-parser": "^3.3.1", "package-manager-detector": "^1.3.0", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "yaml": "^2.8.1" }, "bin": { "bumpp": "bin/bumpp.mjs" } }, "sha512-cOKPRFCWvHcYPJQAHN6V7Jp/wAfnyqQRXQ+2fgWIL6Gao20rpu7xQ1cGGo1APOfmbQmmHngEPg9Fy7nJ3giRkQ=="], + "busboy": ["busboy@0.3.1", "", { "dependencies": { "dicer": "0.3.0" } }, "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], @@ -1724,8 +1674,6 @@ "character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw=="], - "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], "cheerio": ["cheerio@1.0.0-rc.10", "", { "dependencies": { "cheerio-select": "^1.5.0", "dom-serializer": "^1.3.2", "domhandler": "^4.2.0", "htmlparser2": "^6.1.0", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "tslib": "^2.2.0" } }, "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw=="], @@ -1746,17 +1694,11 @@ "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], - "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], - - "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], - - "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], - "clipboard-polyfill": ["clipboard-polyfill@4.1.1", "", {}, "sha512-nbvNLrcX0zviek5QHLFRAaLrx8y/s8+RF2stH43tuS+kP5XlHMrcD0UGBWq43Hwp6WuuK7KefRMP56S45ibZkA=="], "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], @@ -1782,7 +1724,7 @@ "concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="], - "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], @@ -1800,7 +1742,7 @@ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -2336,7 +2278,7 @@ "i18n-locales": ["i18n-locales@0.0.5", "", { "dependencies": { "@ladjs/country-language": "^0.2.1" } }, "sha512-Kve1AHy6rqyfJHPy8MIvaKBKhHhHPXV+a/TgMkjp3UBhO3gfWR40ZQn8Xy7LI6g3FhmbvkFtv+GCZy6yvuyeHQ=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], "identity-obj-proxy": ["identity-obj-proxy@3.0.0", "", { "dependencies": { "harmony-reflect": "^1.4.6" } }, "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA=="], @@ -2364,12 +2306,12 @@ "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "inquirer": ["inquirer@9.3.8", "", { "dependencies": { "@inquirer/external-editor": "^1.0.2", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" } }, "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w=="], - "inspect-with-kind": ["inspect-with-kind@1.0.5", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g=="], "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + "ioredis": ["ioredis@5.8.2", "", { "dependencies": { "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q=="], + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], @@ -2410,8 +2352,6 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], - "is-language-code": ["is-language-code@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.14.0" } }, "sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA=="], "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], @@ -2450,8 +2390,6 @@ "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], - "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], @@ -2658,8 +2596,12 @@ "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], + "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], @@ -2668,13 +2610,11 @@ "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], - "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], - "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], - "long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -2686,13 +2626,13 @@ "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "lru.min": ["lru.min@1.1.3", "", {}, "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q=="], + "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], - "mailparser": ["mailparser@3.7.5", "", { "dependencies": { "encoding-japanese": "2.2.0", "he": "1.2.0", "html-to-text": "9.0.5", "iconv-lite": "0.7.0", "libmime": "5.3.7", "linkify-it": "5.0.0", "mailsplit": "5.4.6", "nodemailer": "7.0.9", "punycode.js": "2.3.1", "tlds": "1.260.0" } }, "sha512-o59RgZC+4SyCOn4xRH1mtRiZ1PbEmi6si6Ufnd3tbX/V9zmZN1qcqu8xbXY62H6CwIclOT3ppm5u/wV2nujn4g=="], - - "mailsplit": ["mailsplit@5.4.6", "", { "dependencies": { "libbase64": "1.3.0", "libmime": "5.3.7", "libqp": "2.1.1" } }, "sha512-M+cqmzaPG/mEiCDmqQUz8L177JZLZmXAUpq38owtpq2xlXlTSw+kntnxRt2xsxVFFV6+T8Mj/U0l5s7s6e0rNw=="], + "mailparser": ["mailparser@3.9.0", "", { "dependencies": { "@zone-eu/mailsplit": "5.4.7", "encoding-japanese": "2.2.0", "he": "1.2.0", "html-to-text": "9.0.5", "iconv-lite": "0.7.0", "libmime": "5.3.7", "linkify-it": "5.0.0", "nodemailer": "7.0.10", "punycode.js": "2.3.1", "tlds": "1.261.0" } }, "sha512-jpaNLhDjwy0w2f8sySOSRiWREjPqssSc0C2czV98btCXCRX3EyNloQ2IWirmMDj1Ies8Fkm0l96bZBZpDG7qkg=="], "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], @@ -2760,11 +2700,9 @@ "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], - "mute-stream": ["mute-stream@1.0.0", "", {}, "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA=="], - "mysql": ["mysql@2.18.1", "", { "dependencies": { "bignumber.js": "9.0.0", "readable-stream": "2.3.7", "safe-buffer": "5.1.2", "sqlstring": "2.3.1" } }, "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig=="], - "mysql2": ["mysql2@2.3.3", "", { "dependencies": { "denque": "^2.0.1", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^4.0.0", "lru-cache": "^6.0.0", "named-placeholders": "^1.1.2", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA=="], + "mysql2": ["mysql2@3.15.3", "", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg=="], "named-placeholders": ["named-placeholders@1.1.3", "", { "dependencies": { "lru-cache": "^7.14.1" } }, "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w=="], @@ -2846,7 +2784,7 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -2862,12 +2800,8 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - "oxc-resolver": ["oxc-resolver@11.11.0", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.11.0", "@oxc-resolver/binding-android-arm64": "11.11.0", "@oxc-resolver/binding-darwin-arm64": "11.11.0", "@oxc-resolver/binding-darwin-x64": "11.11.0", "@oxc-resolver/binding-freebsd-x64": "11.11.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.11.0", "@oxc-resolver/binding-linux-arm-musleabihf": "11.11.0", "@oxc-resolver/binding-linux-arm64-gnu": "11.11.0", "@oxc-resolver/binding-linux-arm64-musl": "11.11.0", "@oxc-resolver/binding-linux-ppc64-gnu": "11.11.0", "@oxc-resolver/binding-linux-riscv64-gnu": "11.11.0", "@oxc-resolver/binding-linux-riscv64-musl": "11.11.0", "@oxc-resolver/binding-linux-s390x-gnu": "11.11.0", "@oxc-resolver/binding-linux-x64-gnu": "11.11.0", "@oxc-resolver/binding-linux-x64-musl": "11.11.0", "@oxc-resolver/binding-wasm32-wasi": "11.11.0", "@oxc-resolver/binding-win32-arm64-msvc": "11.11.0", "@oxc-resolver/binding-win32-ia32-msvc": "11.11.0", "@oxc-resolver/binding-win32-x64-msvc": "11.11.0" } }, "sha512-vVeBJf77zBeqOA/LBCTO/pr0/ETHGSleCRsI5Kmsf2OsfB5opzhhZptt6VxkqjKWZH+eF1se88fYDG5DGRLjkg=="], - "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], "p-event": ["p-event@4.2.0", "", { "dependencies": { "p-timeout": "^3.1.0" } }, "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ=="], @@ -2886,7 +2820,7 @@ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + "package-manager-detector": ["package-manager-detector@1.5.0", "", {}, "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw=="], "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], @@ -2932,7 +2866,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], @@ -2942,7 +2876,7 @@ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], - "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], "portal-vue": ["portal-vue@3.0.0", "", { "peerDependencies": { "vue": "^3.0.4" }, "optionalPeers": ["vue"] }, "sha512-9eprMxNURLx6ijbcgkWjYNcTWJYu/H8QF8nyAeBzOmk9lKCea01BW1hYBeLkgz+AestmPOvznAEOFmNuO4Adjw=="], @@ -3062,6 +2996,10 @@ "record-cache": ["record-cache@1.2.0", "", { "dependencies": { "b4a": "^1.3.1" } }, "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw=="], + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], + + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], + "reflect-metadata": ["reflect-metadata@0.1.14", "", {}, "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A=="], "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], @@ -3098,8 +3036,6 @@ "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], - "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], - "ret": ["ret@0.1.15", "", {}, "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="], "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], @@ -3116,8 +3052,6 @@ "run-applescript": ["run-applescript@3.2.0", "", { "dependencies": { "execa": "^0.10.0" } }, "sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg=="], - "run-async": ["run-async@3.0.0", "", {}, "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], @@ -3232,6 +3166,8 @@ "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], @@ -3346,7 +3282,7 @@ "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], @@ -3358,7 +3294,7 @@ "titleize": ["titleize@2.1.0", "", {}, "sha512-m+apkYlfiQTKLW+sI4vqUkwMEzfgEUEYSqljx1voUE3Wz/z1ZsxyzSxvH2X8uKVrOp7QkByWt0rA6+gvhCKy6g=="], - "tlds": ["tlds@1.260.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ=="], + "tlds": ["tlds@1.261.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA=="], "tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="], @@ -3570,8 +3506,6 @@ "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], - "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], - "web-resource-inliner": ["web-resource-inliner@6.0.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "escape-goat": "^3.0.0", "htmlparser2": "^5.0.0", "mime": "^2.4.6", "node-fetch": "^2.6.0", "valid-data-url": "^3.0.0" } }, "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A=="], "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], @@ -3614,7 +3548,7 @@ "workerpool": ["workerpool@9.3.4", "", {}, "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg=="], - "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -3638,7 +3572,7 @@ "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], "yaml-eslint-parser": ["yaml-eslint-parser@0.5.0", "", { "dependencies": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", "yaml": "^1.10.2" } }, "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g=="], @@ -3662,8 +3596,14 @@ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "@antfu/install-pkg/package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + + "@antfu/install-pkg/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "@apollo/protobufjs/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], + "@apollo/protobufjs/long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + "@apollographql/graphql-upload-8-fork/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], "@asamuzakjp/css-color/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -3674,8 +3614,6 @@ "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], @@ -3710,8 +3648,6 @@ "@iconify/utils/local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], - "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], - "@intlify/bundle-utils/@intlify/message-compiler": ["@intlify/message-compiler@11.1.12", "", { "dependencies": { "@intlify/shared": "11.1.12", "source-map-js": "^1.0.2" } }, "sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ=="], "@intlify/bundle-utils/@intlify/shared": ["@intlify/shared@11.1.12", "", {}, "sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A=="], @@ -3760,6 +3696,8 @@ "@jest/source-map/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "@jest/transform/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], @@ -3768,22 +3706,18 @@ "@keyv/bigmap/keyv": ["keyv@5.5.3", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A=="], + "@morev/utils/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "@morev/utils/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "@nuxt/kit/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], "@nuxt/kit/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@nuxt/kit/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "@nuxt/kit/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "@nuxt/kit/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], - "@rollup/pluginutils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "@selderee/plugin-htmlparser2/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], "@swc/cli/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], @@ -3870,6 +3804,8 @@ "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "apollo-boost/ts-invariant": ["ts-invariant@0.4.4", "", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA=="], "apollo-boost/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -3916,26 +3852,16 @@ "backend/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], - "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "c12/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], - "c12/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "c12/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "c12/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "cacheable/keyv": ["keyv@5.5.3", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A=="], "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3954,8 +3880,6 @@ "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "concurrently/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "css-select/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], @@ -3966,8 +3890,6 @@ "database/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - "database/ts-jest": ["ts-jest@27.0.5", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", "lodash": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, "optionalPeers": ["@babel/core", "@types/jest", "babel-jest"], "bin": { "ts-jest": "cli.js" } }, "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w=="], - "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], "dht-node/@types/jest": ["@types/jest@27.5.1", "", { "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" } }, "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ=="], @@ -4104,6 +4026,8 @@ "jest-util/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "jest-watcher/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], "jest-worker/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], @@ -4118,16 +4042,22 @@ "juice/commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + "libmime/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "local-pkg/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "mailparser/html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="], - "mailparser/iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], + "mailparser/nodemailer": ["nodemailer@7.0.10", "", {}, "sha512-Us/Se1WtT0ylXgNFfyFSx4LElllVLJXQjWi2Xz17xWw7amDKO2MLtFnVp1WACy7GkVGs+oBlRopVNUzlrGSw1w=="], - "mailparser/nodemailer": ["nodemailer@7.0.9", "", {}, "sha512-9/Qm0qXIByEP8lEV2qOqcAW7bRpL8CR9jcTwk3NBnHJNmP9fIJ86g2fgmIXqHY+nj55ZEMwWqYAT2QTDpRUYiQ=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "multimatch/@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="], "multimatch/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -4156,10 +4086,6 @@ "nypm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "nypm/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - - "nypm/tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - "openai/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -4180,8 +4106,6 @@ "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "run-applescript/execa": ["execa@0.10.0", "", { "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw=="], "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -4252,8 +4176,6 @@ "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "ts-jest/jest": ["jest@27.5.1", "", { "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", "jest-cli": "^27.5.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ=="], @@ -4262,6 +4184,8 @@ "type-graphql/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + "typeorm/ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], + "typeorm/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], "typeorm/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], @@ -4282,20 +4206,16 @@ "unimport/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "unimport/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "unimport/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "unimport/unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], "unplugin-utils/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "unplugin-utils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "unplugin-vue-components/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "unplugin-vue-components/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "vee-validate/@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], "vee-validate/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -4310,6 +4230,8 @@ "vite-plugin-html/pathe": ["pathe@0.2.0", "", {}, "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw=="], + "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="], "vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ=="], @@ -4320,20 +4242,22 @@ "vue-apollo/throttle-debounce": ["throttle-debounce@2.3.0", "", {}, "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="], - "wcwidth/defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], - "web-resource-inliner/htmlparser2": ["htmlparser2@5.0.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^3.3.0", "domutils": "^2.4.2", "entities": "^2.0.0" } }, "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ=="], "web-resource-inliner/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "wkx/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], "xss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "yaml-eslint-parser/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "@apollographql/graphql-upload-8-fork/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], "@apollographql/graphql-upload-8-fork/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], @@ -4346,14 +4270,6 @@ "@hyperswarm/secret-stream/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], - "@iconify/utils/@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.5.0", "", {}, "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw=="], - - "@iconify/utils/@antfu/install-pkg/tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - - "@iconify/utils/local-pkg/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - - "@intlify/bundle-utils/yaml-eslint-parser/yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], - "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base": ["@intlify/core-base@10.0.8", "", { "dependencies": { "@intlify/message-compiler": "10.0.8", "@intlify/shared": "10.0.8" } }, "sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -4374,8 +4290,6 @@ "@jest/transform/write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "@nuxt/kit/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "@swc/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], @@ -4412,8 +4326,6 @@ "css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], - "database/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "dht-node/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], "dht-rpc/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], @@ -4482,14 +4394,22 @@ "jest-worker/jest-util/@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + "jest-worker/jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "js-beautify/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "jsdom/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "local-pkg/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "local-pkg/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "mailparser/html-to-text/@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], "mailparser/html-to-text/selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="], + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], @@ -4500,8 +4420,6 @@ "noise-curve-ed/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], - "nypm/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "run-applescript/execa/cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="], @@ -4538,16 +4456,14 @@ "typeorm/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "unctx/unplugin/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "unimport/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "unplugin-vue-components/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "unplugin-vue-components/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "unplugin-vue-components/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "vite-plugin-html/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], @@ -4616,10 +4532,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@iconify/utils/local-pkg/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - - "@iconify/utils/local-pkg/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base/@intlify/message-compiler": ["@intlify/message-compiler@10.0.8", "", { "dependencies": { "@intlify/shared": "10.0.8", "source-map-js": "^1.0.2" } }, "sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg=="], "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], @@ -4644,8 +4556,6 @@ "html-to-text/htmlparser2/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], - "jest-cli/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "jest-environment-jsdom/jsdom/cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], "jest-environment-jsdom/jsdom/http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], @@ -4666,6 +4576,8 @@ "mailparser/html-to-text/selderee/parseley": ["parseley@0.12.1", "", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="], + "nodemon/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "run-applescript/execa/cross-spawn/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], @@ -4682,6 +4594,8 @@ "typeorm/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "unplugin-vue-components/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "unplugin-vue-components/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "vue-apollo/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], diff --git a/config-schema/package.json b/config-schema/package.json index e5fd4544b..0b843ce3c 100644 --- a/config-schema/package.json +++ b/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "config-schema", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido Config for validate config", "main": "./build/index.js", "types": "./src/index.ts", diff --git a/config-schema/src/commonSchema.ts b/config-schema/src/commonSchema.ts index 250ea3182..f28115ea7 100644 --- a/config-schema/src/commonSchema.ts +++ b/config-schema/src/commonSchema.ts @@ -35,6 +35,11 @@ export const COMMUNITY_URL = Joi.string() .default('http://0.0.0.0') .required() +export const DLT_ACTIVE = Joi.boolean() + .description('Flag to indicate if the DLT (Decentralized Ledger Technology) service is used.') + .default(false) + .required() + export const GRAPHQL_URI = Joi.string() .uri({ scheme: ['http', 'https'] }) .description( diff --git a/config-schema/src/validate.ts b/config-schema/src/validate.ts index c566dfab7..17ccea483 100644 --- a/config-schema/src/validate.ts +++ b/config-schema/src/validate.ts @@ -17,17 +17,23 @@ export function validate(schema: ObjectSchema, data: any) { throw new Error('missing key in config validation with joi: ' + details) } const value = err.context.value - const description = schemaJson.keys[key] - ? schema.describe().keys[key].flags.description - : 'No description available' - if (data[key] === undefined) { - throw new Error( - `Environment Variable '${key}' is missing. ${description}, details: ${details}`, - ) - } else { - throw new Error( - `Error on Environment Variable ${key} with value = ${value}: ${err.message}. ${description}`, - ) + try { + const description = schemaJson.keys[key] + ? schema.describe().keys[key].flags.description + : 'No description available' + if (data[key] === undefined) { + throw new Error( + `Environment Variable '${key}' is missing. ${description}, details: ${details}`, + ) + } else { + throw new Error( + `Error on Environment Variable ${key} with value = ${value}: ${err.message}. ${description}`, + ) + } + } catch (e) { + // biome-ignore lint/suspicious/noConsole: schema validation may be run before logger is initialized + console.error('Error getting description for key ' + key + ': ' + e) + throw e } }) } diff --git a/config-schema/test/testSetup.bun.ts b/config-schema/test/testSetup.bun.ts index f64b81279..fd7153133 100644 --- a/config-schema/test/testSetup.bun.ts +++ b/config-schema/test/testSetup.bun.ts @@ -91,7 +91,8 @@ const getLoggerMocked = mock().mockImplementation((param: any) => { }) mock.module('log4js', () => ({ - getLogger: getLoggerMocked + getLogger: getLoggerMocked, + addLayout: jest.fn() })) export function getLogger(name: string) { diff --git a/core/esbuild.config.ts b/core/esbuild.config.ts new file mode 100644 index 000000000..dae89f49c --- /dev/null +++ b/core/esbuild.config.ts @@ -0,0 +1,16 @@ +import { build } from 'esbuild' + +build({ + entryPoints: ['src/index.ts'], + outdir: 'build', + platform: 'node', + target: 'node18.20.7', + loader: { + '.png': 'binary', + '.jpeg': 'binary', + '.jpg': 'binary', + }, + bundle: true, + sourcemap: true, + packages: 'external', +}) diff --git a/core/package.json b/core/package.json index 3771e3a8e..93c7431ad 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "core", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido Core Code, High-Level Shared Code, with dependencies on other modules", "main": "./build/index.js", "types": "./src/index.ts", @@ -15,37 +15,46 @@ "license": "Apache-2.0", "private": true, "scripts": { - "build": "esbuild src/index.ts --outdir=build --platform=node --target=node18.20.7 --bundle --packages=external", + "build": "bun esbuild.config.ts && mkdirp build/templates/ && ncp src/emails/templates build/templates", "build:bun": "bun build src/index.ts --outdir=build --target=bun --packages=external", "test": "bun test", "test:debug": "bun test --inspect-brk", "typecheck": "tsc --noEmit", "lint": "biome check --error-on-warnings .", "lint:fix": "biome check --error-on-warnings . --write", + "locales": "scripts/sort.sh src/emails/locales", + "locales:fix": "scripts/sort.sh src/emails/locales --fix", "clear": "rm -rf node_modules && rm -rf build && rm -rf .turbo" }, "dependencies": { "database": "*", + "email-templates": "^10.0.1", "esbuild": "^0.25.2", "i18n": "^0.15.1", "joi": "^17.13.3", "jose": "^4.14.4", "log4js": "^6.9.1", + "nodemailer": "^6.6.5", + "pug": "^3.0.2", "shared": "*", "sodium-native": "^3.4.1", "zod": "^3.25.61" }, "devDependencies": { "@biomejs/biome": "2.0.0", + "@types/email-templates": "^10.0.4", "@types/i18n": "^0.13.4", "@types/minimatch": "6.0.0", "@types/node": "^17.0.21", + "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "config-schema": "*", "decimal.js-light": "^2.5.1", "dotenv": "^10.0.0", "graphql-request": "5.0.0", "jest": "27.2.4", + "mkdirp": "^3.0.1", + "ncp": "^2.0.0", "type-graphql": "^1.1.1", "typescript": "^4.9.5" }, diff --git a/backend/scripts/sort.sh b/core/scripts/sort.sh similarity index 83% rename from backend/scripts/sort.sh rename to core/scripts/sort.sh index d24307d7c..ba54e835a 100755 --- a/backend/scripts/sort.sh +++ b/core/scripts/sort.sh @@ -4,11 +4,11 @@ ROOT_DIR=$(dirname "$0")/.. exit_code=0 -for locale_file in $ROOT_DIR/src/locales/*.json +for locale_file in $ROOT_DIR/"$1"/*.json do jq -M 'to_entries | sort_by(.key) | from_entries' "$locale_file" > tmp.json - if [ "$*" == "--fix" ] + if [ "$2" == "--fix" ] then mv tmp.json "$locale_file" else diff --git a/core/src/config/index.ts b/core/src/config/index.ts index 31b8cf033..be3179236 100644 --- a/core/src/config/index.ts +++ b/core/src/config/index.ts @@ -20,8 +20,34 @@ const federation = { ), } +const COMMUNITY_HOST = process.env.COMMUNITY_HOST ?? 'localhost' +const URL_PROTOCOL = process.env.URL_PROTOCOL ?? 'http' +const COMMUNITY_URL = process.env.COMMUNITY_URL ?? `${URL_PROTOCOL}://${COMMUNITY_HOST}` + +const community = { + COMMUNITY_SUPPORT_MAIL: process.env.COMMUNITY_SUPPORT_MAIL ?? 'support@supportmail.com', + COMMUNITY_URL, +} + + +const email = { + EMAIL: process.env.EMAIL === 'true', + EMAIL_LINK_FORGOTPASSWORD: + COMMUNITY_URL + (process.env.EMAIL_LINK_FORGOTPASSWORD_PATH ?? '/forgot-password'), + EMAIL_TLS: process.env.EMAIL_TLS !== 'false', + EMAIL_TEST_MODUS: process.env.EMAIL_TEST_MODUS === 'true', + EMAIL_TEST_RECEIVER: process.env.EMAIL_TEST_RECEIVER ?? 'stage1@gradido.net', + EMAIL_USERNAME: process.env.EMAIL_USERNAME ?? '', + EMAIL_SENDER: process.env.EMAIL_SENDER ?? 'info@gradido.net', + EMAIL_PASSWORD: process.env.EMAIL_PASSWORD ?? '', + EMAIL_SMTP_HOST: process.env.EMAIL_SMTP_HOST ?? 'mailserver', + EMAIL_SMTP_PORT: Number(process.env.EMAIL_SMTP_PORT) || 1025, +} + export const CONFIG = { ...federation, + ...community, + ...email, } validate(schema, CONFIG) diff --git a/core/src/config/schema.ts b/core/src/config/schema.ts index dbf6478de..6f8e2d6a8 100644 --- a/core/src/config/schema.ts +++ b/core/src/config/schema.ts @@ -1,6 +1,93 @@ + import Joi from 'joi' +import { COMMUNITY_SUPPORT_MAIL, COMMUNITY_URL, NODE_ENV } from 'config-schema' export const schema = Joi.object({ + COMMUNITY_SUPPORT_MAIL, + COMMUNITY_URL, + NODE_ENV, + + EMAIL: Joi.boolean() + .default(false) + .description('Enable or disable email functionality') + .required(), + + EMAIL_LINK_FORGOTPASSWORD: Joi.string() + .uri({ scheme: ['http', 'https'] }) + .custom((value: string, helpers: Joi.CustomHelpers): string | Joi.ErrorReport => { + if (!value.startsWith(helpers.state.ancestors[0].COMMUNITY_URL)) { + return helpers.error('string.pattern.base', { value, communityUrl: COMMUNITY_URL }) + } + return value + }) + .description('Email Verification link for set new Password, when old Password was forgotten.') + .required(), + + EMAIL_TEST_MODUS: Joi.boolean() + .default(false) + .description('When enabled, all emails are sended to EMAIL_TEST_RECEIVER') + .optional(), + + EMAIL_TEST_RECEIVER: Joi.string() + .email() + .default('stage1@gradido.net') + .when('EMAIL_TEST_MODUS', { is: true, then: Joi.required() }) + .description('Email address used in test mode'), + + EMAIL_USERNAME: Joi.alternatives().conditional(Joi.ref('EMAIL'), { + is: true, + then: Joi.alternatives().conditional(Joi.ref('NODE_ENV'), { + is: 'development', + then: Joi.string() + .allow('') + .description('Username for SMTP authentication (optional in development)'), + otherwise: Joi.string() + .pattern(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) + .description('Valid SMTP username required in production') + .required(), + }), + otherwise: Joi.string().allow('').optional(), + }), + + EMAIL_SENDER: Joi.string() + .email() + .when('EMAIL', { is: true, then: Joi.required() }) + .default('info@gradido.net') + .description('Email address used as sender'), + + EMAIL_PASSWORD: Joi.alternatives().conditional(Joi.ref('EMAIL'), { + is: true, + then: Joi.alternatives().conditional(Joi.ref('NODE_ENV'), { + is: 'development', + then: Joi.string() + .allow('') + .description('Password for SMTP authentication (optional in development)'), + otherwise: Joi.string() + .min(8) + .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#]).{8,}$/) + .description( + 'Password must be at least 8 characters long, include uppercase and lowercase letters, a number, and a special character', + ) + .required(), + }), + otherwise: Joi.string().allow('').optional(), + }), + + EMAIL_SMTP_HOST: Joi.string() + .hostname() + .when('EMAIL', { is: true, then: Joi.required() }) + .default('mailserver') + .description('SMTP server hostname'), + + EMAIL_SMTP_PORT: Joi.number() + .integer() + .positive() + .when('EMAIL', { is: true, then: Joi.required() }) + .default(1025) + .description('SMTP server port'), + + EMAIL_TLS: Joi.boolean().default(true).description('Enable or disable TLS for SMTP').optional(), + FEDERATION_BACKEND_SEND_ON_API: Joi.string() .pattern(/^\d+_\d+$/) .default('1_0') diff --git a/backend/src/emails/README.md b/core/src/emails/README.md similarity index 100% rename from backend/src/emails/README.md rename to core/src/emails/README.md diff --git a/backend/src/emails/__snapshots__/sendEmailVariants.test.ts.snap b/core/src/emails/__snapshots__/sendEmailVariants.test.ts.snap similarity index 58% rename from backend/src/emails/__snapshots__/sendEmailVariants.test.ts.snap rename to core/src/emails/__snapshots__/sendEmailVariants.test.ts.snap index aec3510fe..0bf88e84d 100644 --- a/backend/src/emails/__snapshots__/sendEmailVariants.test.ts.snap +++ b/core/src/emails/__snapshots__/sendEmailVariants.test.ts.snap @@ -2,12 +2,12 @@ exports[`sendEmailVariants sendAccountActivationEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -133,41 +133,41 @@ exports[`sendEmailVariants sendAccountActivationEmail result has the correct htm } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Email Verification

-
+
+

Email Verification

+

Hello Peter Lustig,

Your email address has just been registered with Gradido.

-
-

Complete registration

-
Please click here to complete the registration and activate your Gradido account.
Activate account -
Or copy the link into your browser window.
http://localhost/checkEmail/6627633878930542284 +
+

Complete registration

+
Please click here to complete the registration and activate your Gradido account.
Activate account +
Or copy the link into your browser window.
http://localhost/checkEmail/6627633878930542284 -

Request new valid link

-
The link has a validity of 23 hours and 30 minutes. -If the validity of the link has already expired, you can have a new link sent to you here.
New link +

Request new valid link

+
The link has a validity of 23 hours and 30 minutes. +If the validity of the link has already expired, you can have a new link sent to you here.
New link
-
+

Kind regards,
your Gradido team

@@ -178,12 +178,12 @@ If the validity of the link has already expired, you can have a new link sent to exports[`sendEmailVariants sendAccountMultiRegistrationEmail calls "sendEmailTranslated" result has the correct html as snapshot 1`] = ` " - + - - + + @@ -309,39 +309,39 @@ exports[`sendEmailVariants sendAccountMultiRegistrationEmail calls "sendEmailTra } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Try To Register Again With Your Email

-
+
+

Try To Register Again With Your Email

+

Hello Peter Lustig,

Your email address has just been used again to register an account with Gradido.
However, an account already exists for your email address.

-
-

Reset password

-
If you have forgotten your password, please click here.
reset -
Or copy the link into your browser window.
http://localhost/forgot-password -

Contact support

-
If you did not try to register again, please contact our support:
support@supportmail.com +
+

Reset password

+
If you have forgotten your password, please click here.
reset +
Or copy the link into your browser window.
http://localhost/forgot-password +

Contact support

+
If you did not try to register again, please contact our support:
support@supportmail.com
-
+

Kind regards,
your Gradido team

@@ -352,12 +352,12 @@ exports[`sendEmailVariants sendAccountMultiRegistrationEmail calls "sendEmailTra exports[`sendEmailVariants sendAddedContributionMessageEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -483,39 +483,39 @@ exports[`sendEmailVariants sendAddedContributionMessageEmail result has the corr } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Message about your common good contribution

-
+
+

Message about your common good contribution

+

Hello Peter Lustig,

You have received a message from Bibi Bloxberg regarding your common good contribution “My contribution.”.

-
-

Read and reply to message

-
+
+

Read and reply to message

+

„My message.“

To reply to the message, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.

-
To account -
Please do not reply to this email.
+
To account +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -526,12 +526,12 @@ exports[`sendEmailVariants sendAddedContributionMessageEmail result has the corr exports[`sendEmailVariants sendContributionChangedByModeratorEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -657,37 +657,37 @@ exports[`sendEmailVariants sendContributionChangedByModeratorEmail result has th } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Your common good contribution has been changed

-
+
+

Your common good contribution has been changed

+

Hello Peter Lustig,

your common good contribution 'My contribution.' has just been changed by Bibi Bloxberg and now reads as 'This is a better contribution memo.'

-
-

Contribution details

-
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account -
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 -
Please do not reply to this email.
+
+

Contribution details

+
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account +
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -698,12 +698,12 @@ exports[`sendEmailVariants sendContributionChangedByModeratorEmail result has th exports[`sendEmailVariants sendContributionConfirmedEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -829,37 +829,37 @@ exports[`sendEmailVariants sendContributionConfirmedEmail result has the correct } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Your contribution to the common good was confirmed

-
+
+

Your contribution to the common good was confirmed

+

Hello Peter Lustig,

Your common good contribution “My contribution.” has just been approved by Bibi Bloxberg. Your Gradido account has been credited with 23.54 GDD.

-
-

Contribution details

-
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account -
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 -
Please do not reply to this email.
+
+

Contribution details

+
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account +
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -870,12 +870,12 @@ exports[`sendEmailVariants sendContributionConfirmedEmail result has the correct exports[`sendEmailVariants sendContributionDeletedEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -1001,37 +1001,37 @@ exports[`sendEmailVariants sendContributionDeletedEmail result has the correct h } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Your common good contribution was deleted

-
+
+

Your common good contribution was deleted

+

Hello Peter Lustig,

Your common good contribution “My contribution.” was deleted by Bibi Bloxberg.

-
-

Contribution details

-
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account -
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 -
Please do not reply to this email.
+
+

Contribution details

+
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account +
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -1042,12 +1042,12 @@ exports[`sendEmailVariants sendContributionDeletedEmail result has the correct h exports[`sendEmailVariants sendContributionDeniedEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -1173,37 +1173,37 @@ exports[`sendEmailVariants sendContributionDeniedEmail result has the correct ht } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Your common good contribution was rejected

-
+
+

Your common good contribution was rejected

+

Hello Peter Lustig,

Your common good contribution “My contribution.” was rejected by Bibi Bloxberg.

-
-

Contribution details

-
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account -
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 -
Please do not reply to this email.
+
+

Contribution details

+
To see your common good contributions and related messages, go to the “Creation” menu in your Gradido account and click on the “My contributions” tab.
To account +
Or copy the link into your browser window.
https://gradido.net/contributions/own-contributions/1#contributionListItem-1 +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -1214,12 +1214,12 @@ exports[`sendEmailVariants sendContributionDeniedEmail result has the correct ht exports[`sendEmailVariants sendResetPasswordEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -1345,41 +1345,41 @@ exports[`sendEmailVariants sendResetPasswordEmail result has the correct html as } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Reset password

-
+
+

Reset password

+

Hello Peter Lustig,

You, or someone else, requested a password reset for this account.

-
-

Reset password

-
If it was you, please click here.
reset -
Or copy the link into your browser window.
http://localhost/reset-password/3762660021544901417 +
+

Reset password

+
If it was you, please click here.
reset +
Or copy the link into your browser window.
http://localhost/reset-password/3762660021544901417 -

Request new valid link

-
The link has a validity of 23 hours and 30 minutes. -If the validity of the link has already expired, you can have a new link sent to you here.
New link +

Request new valid link

+
The link has a validity of 23 hours and 30 minutes. +If the validity of the link has already expired, you can have a new link sent to you here.
New link
-
+

Kind regards,
your Gradido team

@@ -1390,12 +1390,12 @@ If the validity of the link has already expired, you can have a new link sent to exports[`sendEmailVariants sendTransactionLinkRedeemedEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -1521,37 +1521,37 @@ exports[`sendEmailVariants sendTransactionLinkRedeemedEmail result has the corre } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Bibi Bloxberg has redeemed your Gradido link

-
+
+

Bibi Bloxberg has redeemed your Gradido link

+

Hello Peter Lustig,

Bibi Bloxberg (bibi@bloxberg.de) has just redeemed your link.

-
-

Transaction details

-
Amount: 17.65 GDD
Message: You deserve it! 🙏🏼
You can find transaction details in your Gradido account. -
To account -
Please do not reply to this email.
+
+

Transaction details

+
Amount: 17.65 GDD
Message: You deserve it! 🙏🏼
You can find transaction details in your Gradido account. +
To account +
Please do not reply to this email.
-
+

Kind regards,
your Gradido team

@@ -1562,12 +1562,12 @@ exports[`sendEmailVariants sendTransactionLinkRedeemedEmail result has the corre exports[`sendEmailVariants sendTransactionReceivedEmail result has the correct html as snapshot 1`] = ` " - + - - + + @@ -1693,40 +1693,40 @@ exports[`sendEmailVariants sendTransactionReceivedEmail result has the correct h } - -
+ +
-
\\"Gradido
+
\"Gradido
-
-

Bibi Bloxberg has sent you 37.40 Gradido

-
+
+

Bibi Bloxberg has sent you 37.40 Gradido

+

Hello Peter Lustig,

-

You have just received 37.40 GDD from Bibi Bloxberg (bibi@bloxberg.de). +

You have just received 37.40 GDD from Bibi Bloxberg (bibi@bloxberg.de).

-
-

Message

-
-
Du bist schon lustiger ;)
+
+

Message

+
+
Du bist schon lustiger ;)
- To account -
+
To account +

Kind regards,
your Gradido team

diff --git a/core/src/emails/index.ts b/core/src/emails/index.ts new file mode 100644 index 000000000..e7b39331a --- /dev/null +++ b/core/src/emails/index.ts @@ -0,0 +1 @@ +export * from './sendEmailVariants' \ No newline at end of file diff --git a/backend/src/locales/de.json b/core/src/emails/locales/de.json similarity index 100% rename from backend/src/locales/de.json rename to core/src/emails/locales/de.json diff --git a/backend/src/locales/en.json b/core/src/emails/locales/en.json similarity index 100% rename from backend/src/locales/en.json rename to core/src/emails/locales/en.json diff --git a/core/src/emails/localization.test.ts b/core/src/emails/localization.test.ts new file mode 100644 index 000000000..77651c4e4 --- /dev/null +++ b/core/src/emails/localization.test.ts @@ -0,0 +1,7 @@ +import { i18n } from './localization' + +describe('localization', () => { + it('translate emails.accountMultiRegistration.contactSupport with Contact support', () => { + expect(i18n.__('emails.accountMultiRegistration.contactSupport')).toBe('Contact support') + }) +}) \ No newline at end of file diff --git a/core/src/emails/localization.ts b/core/src/emails/localization.ts new file mode 100644 index 000000000..488ae5411 --- /dev/null +++ b/core/src/emails/localization.ts @@ -0,0 +1,31 @@ +import en from './locales/en.json' +import de from './locales/de.json' +import { I18n } from 'i18n' + +function flatten(obj: any, prefix: string = ''): any { + const result: any = {} + for (const key in obj) { + if (typeof obj[key] === 'object' && obj[key] !== null) { + Object.assign(result, flatten(obj[key], prefix + key + '.')) + } else { + result[prefix + key] = obj[key] + } + } + return result +} + +export const i18n = new I18n({ + locales: ['en', 'de'], + defaultLocale: 'en', + staticCatalog: { en: flatten(en), de: flatten(de) }, + api: { + __: 't', // now req.__ becomes req.t + __n: 'tn', // and req.__n can be called as req.tn + }, + register: global, + mustacheConfig: { + tags: ['{', '}'], + disable: false, + }, +}) + diff --git a/backend/src/emails/sendEmailTranslated.test.ts b/core/src/emails/sendEmailTranslated.test.ts similarity index 83% rename from backend/src/emails/sendEmailTranslated.test.ts rename to core/src/emails/sendEmailTranslated.test.ts index 103296080..3f8b5680e 100644 --- a/backend/src/emails/sendEmailTranslated.test.ts +++ b/core/src/emails/sendEmailTranslated.test.ts @@ -1,12 +1,10 @@ import { createTransport } from 'nodemailer' - -import { i18n } from '@test/testSetup' - -import { CONFIG } from '@/config' - -import { getLogger } from 'config-schema/test/testSetup' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { CONFIG } from '../config' +import { i18n } from './localization' +import { getLogger } from '../../../config-schema/test/testSetup.bun' +import { LOG4JS_BASE_CATEGORY_NAME } from '../config/const' import { sendEmailTranslated } from './sendEmailTranslated' +import { mock, jest, describe, it, expect, beforeEach, afterAll } from 'bun:test' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.emails.sendEmailTranslated`) @@ -21,9 +19,8 @@ CONFIG.EMAIL_USERNAME = 'user' CONFIG.EMAIL_PASSWORD = 'pwd' CONFIG.EMAIL_TLS = true -jest.mock('nodemailer', () => { +mock.module('nodemailer', () => { return { - __esModule: true, createTransport: jest.fn(() => { return { sendMail: () => { @@ -36,6 +33,13 @@ jest.mock('nodemailer', () => { } }) +afterAll(() => { + jest.restoreAllMocks() +}) + +const spySetLocale = jest.spyOn(i18n, 'setLocale') +const spyTranslate = jest.spyOn(i18n, '__') + describe('sendEmailTranslated', () => { let result: Record | boolean | null @@ -48,7 +52,7 @@ describe('sendEmailTranslated', () => { }, template: 'accountMultiRegistration', locals: { - locale: 'en', + language: 'en', }, }) }) @@ -72,7 +76,7 @@ describe('sendEmailTranslated', () => { }, template: 'accountMultiRegistration', locals: { - locale: 'en', + language: 'en', }, }) }) @@ -105,13 +109,13 @@ describe('sendEmailTranslated', () => { }) }) }) - - it.skip('calls "i18n.setLocale" with "en"', () => { - expect(i18n.setLocale).toBeCalledWith('en') + + it('calls "i18n.setLocale" with "en"', async () => { + expect(spySetLocale).toBeCalledWith('en') }) - it.skip('calls "i18n.__" for translation', () => { - expect(i18n.__).toBeCalled() + it('calls "i18n.__" for translation', () => { + expect(spyTranslate).toBeCalled() }) }) @@ -127,7 +131,7 @@ describe('sendEmailTranslated', () => { }, template: 'accountMultiRegistration', locals: { - locale: 'en', + language: 'en', }, }) }) diff --git a/backend/src/emails/sendEmailTranslated.ts b/core/src/emails/sendEmailTranslated.ts similarity index 69% rename from backend/src/emails/sendEmailTranslated.ts rename to core/src/emails/sendEmailTranslated.ts index 5b95cd7ad..205ca07c6 100644 --- a/backend/src/emails/sendEmailTranslated.ts +++ b/core/src/emails/sendEmailTranslated.ts @@ -1,12 +1,16 @@ import path from 'path' - import Email from 'email-templates' -import i18n from 'i18n' +import { i18n } from './localization' import { createTransport } from 'nodemailer' - -import { CONFIG } from '@/config' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { CONFIG } from '../config' +import { LOG4JS_BASE_CATEGORY_NAME } from '../config/const' import { getLogger } from 'log4js' +import gradidoHeader from './templates/includes/gradido-header.jpeg' +import facebookIcon from './templates/includes/facebook-icon.png' +import telegramIcon from './templates/includes/telegram-icon.png' +import twitterIcon from './templates/includes/twitter-icon.png' +import youtubeIcon from './templates/includes/youtube-icon.png' +import chatboxIcon from './templates/includes/chatbox-icon.png' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.emails.sendEmailTranslated`) @@ -21,7 +25,7 @@ export const sendEmailTranslated = async ({ } template: string locals: Record -}): Promise | boolean | null> => { +}): Promise | boolean | null | Error> => { // TODO: test the calling order of 'i18n.setLocale' for example: language of logging 'en', language of email receiver 'es', reset language of current user 'de' if (!CONFIG.EMAIL) { @@ -31,7 +35,6 @@ export const sendEmailTranslated = async ({ // because language of receiver can differ from language of current user who triggers the sending // const rememberLocaleToRestore = i18n.getLocale() - i18n.setLocale('en') // for logging logger.info( `send Email: language=${locals.locale as string} to=${receiver.to.substring(0, 3)}...` + @@ -45,6 +48,7 @@ export const sendEmailTranslated = async ({ ) receiver.to = CONFIG.EMAIL_TEST_RECEIVER } + const transport = createTransport({ host: CONFIG.EMAIL_SMTP_HOST, port: CONFIG.EMAIL_SMTP_PORT, @@ -56,8 +60,7 @@ export const sendEmailTranslated = async ({ }, }) - i18n.setLocale(locals.locale as string) // for email - + i18n.setLocale(locals.language as string) // for email // TESTING: see 'README.md' const email = new Email({ message: { @@ -66,9 +69,7 @@ export const sendEmailTranslated = async ({ send: CONFIG.EMAIL, transport, preview: false, - // i18n, // is only needed if you don't install i18n }) - const resultSend = await email .send({ template: path.join(__dirname, 'templates', template), @@ -76,38 +77,39 @@ export const sendEmailTranslated = async ({ ...receiver, attachments: [ { - filename: 'gradido-header.jpeg', - path: path.join(__dirname, 'templates/includes/gradido-header.jpeg'), + // filename: 'gradido-header.jpeg', + content: gradidoHeader, cid: 'gradidoheader', }, { - filename: 'facebook-icon.png', - path: path.join(__dirname, 'templates/includes/facebook-icon.png'), + // filename: 'facebook-icon.png', + content: facebookIcon, cid: 'facebookicon', }, { - filename: 'telegram-icon.png', - path: path.join(__dirname, 'templates/includes/telegram-icon.png'), + // filename: 'telegram-icon.png', + content: telegramIcon, cid: 'telegramicon', }, { - filename: 'twitter-icon.png', - path: path.join(__dirname, 'templates/includes/twitter-icon.png'), + // filename: 'twitter-icon.png', + content: twitterIcon, cid: 'twittericon', }, { - filename: 'youtube-icon.png', - path: path.join(__dirname, 'templates/includes/youtube-icon.png'), + // filename: 'youtube-icon.png', + content: youtubeIcon, cid: 'youtubeicon', }, { - filename: 'chatbox-icon.png', - path: path.join(__dirname, 'templates/includes/chatbox-icon.png'), + // filename: 'chatbox-icon.png', + content: chatboxIcon, cid: 'chatboxicon', }, ], }, locals, // the 'locale' in here seems not to be used by 'email-template', because it doesn't work if the language isn't set before by 'i18n.setLocale' + // t: i18n.__.bind(i18n), }) .catch((error: unknown) => { logger.error('Error sending notification email', error) diff --git a/backend/src/emails/sendEmailVariants.test.ts b/core/src/emails/sendEmailVariants.test.ts similarity index 95% rename from backend/src/emails/sendEmailVariants.test.ts rename to core/src/emails/sendEmailVariants.test.ts index 74eb940ed..74743dbd9 100644 --- a/backend/src/emails/sendEmailVariants.test.ts +++ b/core/src/emails/sendEmailVariants.test.ts @@ -1,12 +1,5 @@ -import { ApolloServerTestClient } from 'apollo-server-testing' import { Decimal } from 'decimal.js-light' -import { DataSource } from 'typeorm' - -import { testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' -import { getLogger } from 'config-schema/test/testSetup' - -import { CONFIG } from '@/config' +import { CONFIG } from '../config' import * as sendEmailTranslatedApi from './sendEmailTranslated' import { @@ -26,6 +19,7 @@ const testMailServerHost = 'localhost' const testMailServerPort = 1025 const testMailTLS = false +CONFIG.EMAIL = true CONFIG.EMAIL_SENDER = 'info@gradido.net' CONFIG.EMAIL_SMTP_HOST = testMailServerHost CONFIG.EMAIL_SMTP_PORT = testMailServerPort @@ -46,22 +40,6 @@ jest.mock('nodemailer', () => { } }) -let con: DataSource -let testEnv: { - mutate: ApolloServerTestClient['mutate'] - query: ApolloServerTestClient['query'] - con: DataSource -} - -beforeAll(async () => { - testEnv = await testEnvironment(getLogger('apollo'), localization) - con = testEnv.con -}) - -afterAll(async () => { - await con.destroy() -}) - const sendEmailTranslatedSpy = jest.spyOn(sendEmailTranslatedApi, 'sendEmailTranslated') describe('sendEmailVariants', () => { @@ -81,7 +59,7 @@ describe('sendEmailVariants', () => { contributionMemo: 'My contribution.', contributionFrontendLink, message: 'My message.', - }) + }) }) describe('calls "sendEmailTranslated"', () => { @@ -91,24 +69,26 @@ describe('sendEmailVariants', () => { to: 'Peter Lustig ', }, template: 'addedContributionMessage', - locals: { + locals: expect.objectContaining({ firstName: 'Peter', lastName: 'Lustig', - locale: 'en', + language: 'en', senderFirstName: 'Bibi', senderLastName: 'Bloxberg', contributionMemo: 'My contribution.', contributionFrontendLink, message: 'My message.', supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, - }, + }), }) }) }) describe('result', () => { it('is the expected object', () => { - expect(result).toMatchObject({ + // bun testrunner bug, toMatchObject mess with 'result' + const resultClone = JSON.parse(JSON.stringify(result)) + expect(resultClone).toMatchObject({ originalMessage: expect.objectContaining({ to: 'Peter Lustig ', from: 'Gradido (emails.general.doNotAnswer) ', @@ -145,23 +125,26 @@ describe('sendEmailVariants', () => { to: 'Peter Lustig ', }, template: 'accountActivation', - locals: { + locals: expect.objectContaining({ firstName: 'Peter', lastName: 'Lustig', - locale: 'en', + language: 'en', activationLink: 'http://localhost/checkEmail/6627633878930542284', timeDurationObject: { hours: 23, minutes: 30 }, resendLink: CONFIG.EMAIL_LINK_FORGOTPASSWORD, supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, communityURL: CONFIG.COMMUNITY_URL, - }, + }), }) }) }) + describe('result', () => { it('is the expected object', () => { - expect(result).toMatchObject({ + // bun testrunner bug, toMatchObject mess with 'result' + const resultClone = JSON.parse(JSON.stringify(result)) + expect(resultClone).toMatchObject({ originalMessage: expect.objectContaining({ to: 'Peter Lustig ', from: 'Gradido (emails.general.doNotAnswer) ', @@ -179,6 +162,8 @@ describe('sendEmailVariants', () => { }) }) + /* + describe('sendAccountMultiRegistrationEmail', () => { beforeAll(async () => { result = await sendAccountMultiRegistrationEmail({ @@ -620,4 +605,5 @@ describe('sendEmailVariants', () => { }) }) }) + */ }) diff --git a/core/src/emails/sendEmailVariants.ts b/core/src/emails/sendEmailVariants.ts new file mode 100644 index 000000000..8a4b6f9af --- /dev/null +++ b/core/src/emails/sendEmailVariants.ts @@ -0,0 +1,179 @@ +import { Decimal } from 'decimal.js-light' + +import { CONFIG } from '../config' +import { decimalSeparatorByLanguage } from '../util/utilities' + +import { sendEmailTranslated } from './sendEmailTranslated' + +export interface EmailCommonData { + firstName: string + lastName: string + email: string + language: string +} + +export interface ContributionEmailCommonData { + senderFirstName: string + senderLastName: string + contributionMemo: string + contributionFrontendLink: string +} + +function getEmailCommonLocales(): Record { + return { + supportEmail: CONFIG.COMMUNITY_SUPPORT_MAIL, + resendLink: CONFIG.EMAIL_LINK_FORGOTPASSWORD, + communityURL: CONFIG.COMMUNITY_URL, + } +} + +export const sendAddedContributionMessageEmail = ( + data: EmailCommonData & ContributionEmailCommonData & { + message: string + }, +): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { + to: `${data.firstName} ${data.lastName} <${data.email}>`, + }, + template: 'addedContributionMessage', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendAccountActivationEmail = (data: EmailCommonData & { + activationLink: string + timeDurationObject: Record + logoUrl?: string | null +}): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'accountActivation', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendAccountMultiRegistrationEmail = (data: EmailCommonData): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'accountMultiRegistration', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendContributionConfirmedEmail = ( + data: EmailCommonData & ContributionEmailCommonData & { + contributionAmount: Decimal + }, +): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'contributionConfirmed', + locals: { + ...data, + ...getEmailCommonLocales(), + contributionAmount: decimalSeparatorByLanguage(data.contributionAmount, data.language), + }, + }) +} + +export const sendContributionChangedByModeratorEmail = ( + data: EmailCommonData & ContributionEmailCommonData & { + contributionMemoUpdated: string + }, +): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'contributionChangedByModerator', + locals: { + ...data, + ...getEmailCommonLocales(), + contributionMemoUpdated: data.contributionMemoUpdated, + }, + }) +} + +export const sendContributionDeletedEmail = ( + data: EmailCommonData & ContributionEmailCommonData, +): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'contributionDeleted', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendContributionDeniedEmail = ( + data: EmailCommonData & ContributionEmailCommonData, +): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'contributionDenied', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendResetPasswordEmail = (data: EmailCommonData & { + resetLink: string + timeDurationObject: Record +}): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'resetPassword', + locals: { + ...data, + ...getEmailCommonLocales(), + }, + }) +} + +export const sendTransactionLinkRedeemedEmail = (data: EmailCommonData & { + senderFirstName: string + senderLastName: string + senderEmail: string + transactionMemo: string + transactionAmount: Decimal +}): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'transactionLinkRedeemed', + locals: { + ...data, + transactionAmount: decimalSeparatorByLanguage(data.transactionAmount, data.language), + ...getEmailCommonLocales(), + }, + }) +} + +export const sendTransactionReceivedEmail = (data: EmailCommonData & { + senderFirstName: string + senderLastName: string + senderEmail: string + memo: string + transactionAmount: Decimal +}): Promise | boolean | null | Error> => { + return sendEmailTranslated({ + receiver: { to: `${data.firstName} ${data.lastName} <${data.email}>` }, + template: 'transactionReceived', + locals: { + ...data, + transactionAmount: decimalSeparatorByLanguage(data.transactionAmount, data.language), + ...getEmailCommonLocales(), + }, + }) +} diff --git a/backend/src/emails/templates/accountActivation/html.pug b/core/src/emails/templates/accountActivation/html.pug similarity index 100% rename from backend/src/emails/templates/accountActivation/html.pug rename to core/src/emails/templates/accountActivation/html.pug diff --git a/backend/src/emails/templates/accountActivation/subject.pug b/core/src/emails/templates/accountActivation/subject.pug similarity index 100% rename from backend/src/emails/templates/accountActivation/subject.pug rename to core/src/emails/templates/accountActivation/subject.pug diff --git a/backend/src/emails/templates/accountMultiRegistration/html.pug b/core/src/emails/templates/accountMultiRegistration/html.pug similarity index 100% rename from backend/src/emails/templates/accountMultiRegistration/html.pug rename to core/src/emails/templates/accountMultiRegistration/html.pug diff --git a/backend/src/emails/templates/accountMultiRegistration/subject.pug b/core/src/emails/templates/accountMultiRegistration/subject.pug similarity index 100% rename from backend/src/emails/templates/accountMultiRegistration/subject.pug rename to core/src/emails/templates/accountMultiRegistration/subject.pug diff --git a/backend/src/emails/templates/addedContributionMessage/html.pug b/core/src/emails/templates/addedContributionMessage/html.pug similarity index 100% rename from backend/src/emails/templates/addedContributionMessage/html.pug rename to core/src/emails/templates/addedContributionMessage/html.pug diff --git a/backend/src/emails/templates/addedContributionMessage/subject.pug b/core/src/emails/templates/addedContributionMessage/subject.pug similarity index 100% rename from backend/src/emails/templates/addedContributionMessage/subject.pug rename to core/src/emails/templates/addedContributionMessage/subject.pug diff --git a/backend/src/emails/templates/contributionChangedByModerator/html.pug b/core/src/emails/templates/contributionChangedByModerator/html.pug similarity index 100% rename from backend/src/emails/templates/contributionChangedByModerator/html.pug rename to core/src/emails/templates/contributionChangedByModerator/html.pug diff --git a/backend/src/emails/templates/contributionChangedByModerator/subject.pug b/core/src/emails/templates/contributionChangedByModerator/subject.pug similarity index 100% rename from backend/src/emails/templates/contributionChangedByModerator/subject.pug rename to core/src/emails/templates/contributionChangedByModerator/subject.pug diff --git a/backend/src/emails/templates/contributionConfirmed/html.pug b/core/src/emails/templates/contributionConfirmed/html.pug similarity index 100% rename from backend/src/emails/templates/contributionConfirmed/html.pug rename to core/src/emails/templates/contributionConfirmed/html.pug diff --git a/backend/src/emails/templates/contributionConfirmed/subject.pug b/core/src/emails/templates/contributionConfirmed/subject.pug similarity index 100% rename from backend/src/emails/templates/contributionConfirmed/subject.pug rename to core/src/emails/templates/contributionConfirmed/subject.pug diff --git a/backend/src/emails/templates/contributionDeleted/html.pug b/core/src/emails/templates/contributionDeleted/html.pug similarity index 100% rename from backend/src/emails/templates/contributionDeleted/html.pug rename to core/src/emails/templates/contributionDeleted/html.pug diff --git a/backend/src/emails/templates/contributionDeleted/subject.pug b/core/src/emails/templates/contributionDeleted/subject.pug similarity index 100% rename from backend/src/emails/templates/contributionDeleted/subject.pug rename to core/src/emails/templates/contributionDeleted/subject.pug diff --git a/backend/src/emails/templates/contributionDenied/html.pug b/core/src/emails/templates/contributionDenied/html.pug similarity index 100% rename from backend/src/emails/templates/contributionDenied/html.pug rename to core/src/emails/templates/contributionDenied/html.pug diff --git a/backend/src/emails/templates/contributionDenied/subject.pug b/core/src/emails/templates/contributionDenied/subject.pug similarity index 100% rename from backend/src/emails/templates/contributionDenied/subject.pug rename to core/src/emails/templates/contributionDenied/subject.pug diff --git a/backend/src/emails/templates/includes/Chatbox.svg b/core/src/emails/templates/includes/Chatbox.svg similarity index 100% rename from backend/src/emails/templates/includes/Chatbox.svg rename to core/src/emails/templates/includes/Chatbox.svg diff --git a/backend/src/emails/templates/includes/answear_button.svg b/core/src/emails/templates/includes/answear_button.svg similarity index 100% rename from backend/src/emails/templates/includes/answear_button.svg rename to core/src/emails/templates/includes/answear_button.svg diff --git a/backend/src/emails/templates/includes/chatbox-icon.png b/core/src/emails/templates/includes/chatbox-icon.png similarity index 100% rename from backend/src/emails/templates/includes/chatbox-icon.png rename to core/src/emails/templates/includes/chatbox-icon.png diff --git a/backend/src/emails/templates/includes/chatbox-icon.pug b/core/src/emails/templates/includes/chatbox-icon.pug similarity index 100% rename from backend/src/emails/templates/includes/chatbox-icon.pug rename to core/src/emails/templates/includes/chatbox-icon.pug diff --git a/backend/src/emails/templates/includes/contributionDetailsCTA.pug b/core/src/emails/templates/includes/contributionDetailsCTA.pug similarity index 100% rename from backend/src/emails/templates/includes/contributionDetailsCTA.pug rename to core/src/emails/templates/includes/contributionDetailsCTA.pug diff --git a/backend/src/emails/templates/includes/doNotReply.pug b/core/src/emails/templates/includes/doNotReply.pug similarity index 100% rename from backend/src/emails/templates/includes/doNotReply.pug rename to core/src/emails/templates/includes/doNotReply.pug diff --git a/backend/src/emails/templates/includes/email.css b/core/src/emails/templates/includes/email.css similarity index 100% rename from backend/src/emails/templates/includes/email.css rename to core/src/emails/templates/includes/email.css diff --git a/backend/src/emails/templates/includes/facebook-icon.png b/core/src/emails/templates/includes/facebook-icon.png similarity index 100% rename from backend/src/emails/templates/includes/facebook-icon.png rename to core/src/emails/templates/includes/facebook-icon.png diff --git a/backend/src/emails/templates/includes/footer.pug b/core/src/emails/templates/includes/footer.pug similarity index 100% rename from backend/src/emails/templates/includes/footer.pug rename to core/src/emails/templates/includes/footer.pug diff --git a/backend/src/emails/templates/includes/gradido-header.jpeg b/core/src/emails/templates/includes/gradido-header.jpeg similarity index 100% rename from backend/src/emails/templates/includes/gradido-header.jpeg rename to core/src/emails/templates/includes/gradido-header.jpeg diff --git a/backend/src/emails/templates/includes/greeting.pug b/core/src/emails/templates/includes/greeting.pug similarity index 100% rename from backend/src/emails/templates/includes/greeting.pug rename to core/src/emails/templates/includes/greeting.pug diff --git a/backend/src/emails/templates/includes/header.pug b/core/src/emails/templates/includes/header.pug similarity index 100% rename from backend/src/emails/templates/includes/header.pug rename to core/src/emails/templates/includes/header.pug diff --git a/backend/src/emails/templates/includes/requestNewLink.pug b/core/src/emails/templates/includes/requestNewLink.pug similarity index 100% rename from backend/src/emails/templates/includes/requestNewLink.pug rename to core/src/emails/templates/includes/requestNewLink.pug diff --git a/backend/src/emails/templates/includes/salutation.pug b/core/src/emails/templates/includes/salutation.pug similarity index 100% rename from backend/src/emails/templates/includes/salutation.pug rename to core/src/emails/templates/includes/salutation.pug diff --git a/backend/src/emails/templates/includes/telegram-icon.png b/core/src/emails/templates/includes/telegram-icon.png similarity index 100% rename from backend/src/emails/templates/includes/telegram-icon.png rename to core/src/emails/templates/includes/telegram-icon.png diff --git a/backend/src/emails/templates/includes/twitter-icon.png b/core/src/emails/templates/includes/twitter-icon.png similarity index 100% rename from backend/src/emails/templates/includes/twitter-icon.png rename to core/src/emails/templates/includes/twitter-icon.png diff --git a/backend/src/emails/templates/includes/webflow.css b/core/src/emails/templates/includes/webflow.css similarity index 100% rename from backend/src/emails/templates/includes/webflow.css rename to core/src/emails/templates/includes/webflow.css diff --git a/backend/src/emails/templates/includes/youtube-icon.png b/core/src/emails/templates/includes/youtube-icon.png similarity index 100% rename from backend/src/emails/templates/includes/youtube-icon.png rename to core/src/emails/templates/includes/youtube-icon.png diff --git a/backend/src/emails/templates/layout.pug b/core/src/emails/templates/layout.pug similarity index 100% rename from backend/src/emails/templates/layout.pug rename to core/src/emails/templates/layout.pug diff --git a/backend/src/emails/templates/resetPassword/html.pug b/core/src/emails/templates/resetPassword/html.pug similarity index 100% rename from backend/src/emails/templates/resetPassword/html.pug rename to core/src/emails/templates/resetPassword/html.pug diff --git a/backend/src/emails/templates/resetPassword/subject.pug b/core/src/emails/templates/resetPassword/subject.pug similarity index 100% rename from backend/src/emails/templates/resetPassword/subject.pug rename to core/src/emails/templates/resetPassword/subject.pug diff --git a/backend/src/emails/templates/transactionLinkRedeemed/html.pug b/core/src/emails/templates/transactionLinkRedeemed/html.pug similarity index 100% rename from backend/src/emails/templates/transactionLinkRedeemed/html.pug rename to core/src/emails/templates/transactionLinkRedeemed/html.pug diff --git a/backend/src/emails/templates/transactionLinkRedeemed/subject.pug b/core/src/emails/templates/transactionLinkRedeemed/subject.pug similarity index 100% rename from backend/src/emails/templates/transactionLinkRedeemed/subject.pug rename to core/src/emails/templates/transactionLinkRedeemed/subject.pug diff --git a/backend/src/emails/templates/transactionReceived/html.pug b/core/src/emails/templates/transactionReceived/html.pug similarity index 100% rename from backend/src/emails/templates/transactionReceived/html.pug rename to core/src/emails/templates/transactionReceived/html.pug diff --git a/backend/src/emails/templates/transactionReceived/subject.pug b/core/src/emails/templates/transactionReceived/subject.pug similarity index 100% rename from backend/src/emails/templates/transactionReceived/subject.pug rename to core/src/emails/templates/transactionReceived/subject.pug diff --git a/core/src/graphql/logic/storeLinkAsRedeemed.ts b/core/src/graphql/logic/storeLinkAsRedeemed.ts index cccc97d50..efc3589de 100644 --- a/core/src/graphql/logic/storeLinkAsRedeemed.ts +++ b/core/src/graphql/logic/storeLinkAsRedeemed.ts @@ -1,4 +1,8 @@ -import { TransactionLink as DbTransactionLink, User as DbUser } from "database"; +import { TransactionLink as DbTransactionLink, User as DbUser } from 'database' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '../../config/const' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.logic.storeLinkAsRedeemed`) export async function storeLinkAsRedeemed( dbTransactionLink: DbTransactionLink, @@ -11,7 +15,7 @@ export async function storeLinkAsRedeemed( await DbTransactionLink.save(dbTransactionLink) return true } catch (err) { - console.error('error in storeLinkAsRedeemed;', err) + logger.error('error: ', err) return false } } \ No newline at end of file diff --git a/core/src/index.ts b/core/src/index.ts index a10eb6caa..a429bdc3b 100644 --- a/core/src/index.ts +++ b/core/src/index.ts @@ -18,6 +18,7 @@ export * from './graphql/logic/settlePendingSenderTransaction' export * from './graphql/logic/storeForeignUser' export * from './graphql/model/Decay' export * from './graphql/model/EncryptedTransferArgs' +export * from './emails' export * from './util/calculateSenderBalance' export * from './util/utilities' export * from './validation/user' diff --git a/core/src/types/images.d.ts b/core/src/types/images.d.ts new file mode 100644 index 000000000..91c6fd6f9 --- /dev/null +++ b/core/src/types/images.d.ts @@ -0,0 +1,15 @@ +// biome-ignore lint/style/noDefaultExport: Asset modules use default export by convention +declare module '*.jpg' { + const value: string + export default value +} +declare module '*.jpeg' { + const value: string + export default value +} +declare module '*.png' { + const value: string + export default value +} + + \ No newline at end of file diff --git a/core/src/validation/user.test.ts b/core/src/validation/user.test.ts index cd3bd1925..fb9cf7b94 100644 --- a/core/src/validation/user.test.ts +++ b/core/src/validation/user.test.ts @@ -1,22 +1,31 @@ import { validateAlias } from './user' import { getLogger } from '../../../config-schema/test/testSetup.bun' -import { describe, it, expect, beforeEach, mock, jest } from 'bun:test' -import { aliasExists } from 'database' +import { describe, it, expect, mock, jest, afterAll, beforeEach } from 'bun:test' import { LOG4JS_BASE_CATEGORY_NAME } from '../config/const' +import { aliasExists, AbstractLoggingView, AppDatabase } from 'database' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.validation.user`) -mock.module('database', () => ({ - aliasExists: jest.fn(), -})) mock.module('shared/src/schema/user.schema', () => ({ aliasSchema: { parse: jest.fn(), }, })) -describe('validate alias', () => { - beforeEach(() => { +// bun mock module currently cannot be restored, so we must mock compatible with all tests! +mock.module('database', () => ({ + aliasExists: jest.fn(), + AbstractLoggingView, + AppDatabase, +})) + + +afterAll(() => { + mock.restore() +}) + +describe('validate alias', () => { + beforeEach(() => { jest.clearAllMocks() }) @@ -52,7 +61,7 @@ describe('validate alias', () => { describe('test against existing alias in database', () => { describe('alias exists in database', () => { it('throws and logs an error', () => { - (aliasExists as jest.Mock).mockResolvedValue(true) + (aliasExists as jest.Mock).mockReturnValue(true) expect(validateAlias('b-b')).rejects.toEqual(new Error('Given alias is already in use')) expect(logger.warn.mock.calls[0]).toEqual(['alias already in use', 'b-b']) }) @@ -60,7 +69,7 @@ describe('validate alias', () => { describe('valid alias', () => { it('resolves to true', async () => { - (aliasExists as jest.Mock).mockResolvedValue(false) + (aliasExists as jest.Mock).mockReturnValue(false) expect(validateAlias('bibi')).resolves.toEqual(true) }) }) diff --git a/core/tsconfig.json b/core/tsconfig.json index f4fef84fa..155a31a7b 100644 --- a/core/tsconfig.json +++ b/core/tsconfig.json @@ -5,6 +5,7 @@ // "incremental": true, /* Enable incremental compilation */ "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "resolveJsonModule": true, // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ @@ -69,6 +70,10 @@ "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, + "include": [ + "src/**/*.ts", + "src/**/*.json", + ], "references": [], /* Any project that is referenced must itself have a `references` array (which may be empty). */ - "exclude": ["**/*.test.ts", "**/*.spec.ts", "test/*", "**/bun.d.ts"], + "exclude": ["**/*.test.ts", "**/*.spec.ts", "test/*", "**/bun.d.ts", "esbuild.config.ts"], } diff --git a/core/turbo.json b/core/turbo.json new file mode 100644 index 000000000..067806d37 --- /dev/null +++ b/core/turbo.json @@ -0,0 +1,13 @@ +{ + "extends": ["//"], + "tasks": { + "locales": {}, + "locales:fix": {}, + "lint": { + "dependsOn": ["locales"] + }, + "lint:fix": { + "dependsOn": ["locales:fix"] + } + } +} \ No newline at end of file diff --git a/database/bunfig.toml b/database/bunfig.toml new file mode 100644 index 000000000..6e74bf7ca --- /dev/null +++ b/database/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["../config-schema/test/testSetup.bun.ts"] diff --git a/database/package.json b/database/package.json index 84504372c..b22f9d95f 100644 --- a/database/package.json +++ b/database/package.json @@ -1,6 +1,6 @@ { "name": "database", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido Database Tool to execute database migrations", "main": "./build/index.js", "types": "./src/index.ts", @@ -15,13 +15,13 @@ "license": "Apache-2.0", "private": true, "scripts": { - "build": "tsx ./esbuild.config.ts", + "build": "bun ./esbuild.config.ts", "typecheck": "tsc --noEmit", "lint": "biome check --error-on-warnings .", "lint:fix": "biome check --error-on-warnings . --write", "clearDB": "cross-env TZ=UTC tsx migration/index.ts clear", - "test": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test vitest --reporter verbose --no-file-parallelism run", - "test:debug": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test node --inspect-brk node_modules/.bin/jest --bail --runInBand --forceExit --detectOpenHandles", + "test": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test bun test", + "test:debug": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test bun test --inspect-brk", "up": "cross-env TZ=UTC tsx migration/index.ts up", "down": "cross-env TZ=UTC tsx migration/index.ts down", "reset": "cross-env TZ=UTC tsx migration/index.ts reset", @@ -33,22 +33,14 @@ }, "devDependencies": { "@biomejs/biome": "2.0.0", - "@swc-node/register": "^1.10.10", - "@swc/cli": "^0.7.3", - "@swc/core": "^1.11.24", - "@swc/helpers": "^0.5.17", "@types/faker": "^5.5.9", "@types/geojson": "^7946.0.13", - "@types/jest": "27.0.2", "@types/mysql": "^2.15.27", "@types/node": "^18.7.14", "await-semaphore": "^0.1.3", "crypto-random-bigint": "^2.1.1", - "jest": "27.2.4", - "ts-jest": "27.0.5", "ts-node": "^10.9.2", - "typescript": "^4.9.5", - "vitest": "^2.0.5" + "typescript": "^4.9.5" }, "dependencies": { "@types/uuid": "^8.3.4", @@ -59,7 +51,7 @@ "geojson": "^0.5.0", "log4js": "^6.9.1", "mysql": "^2.18.1", - "mysql2": "^2.3.0", + "mysql2": "^3.15.3", "reflect-metadata": "^0.1.13", "shared": "*", "source-map-support": "^0.5.21", diff --git a/database/src/entity/Community.ts b/database/src/entity/Community.ts index f6597306a..e21226d44 100644 --- a/database/src/entity/Community.ts +++ b/database/src/entity/Community.ts @@ -3,14 +3,14 @@ import { Column, CreateDateColumn, Entity, - Geometry, + type Geometry, JoinColumn, OneToMany, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm' -import { FederatedCommunity } from './FederatedCommunity' -import { User } from './User' +import { type FederatedCommunity as FederatedCommunityType } from './FederatedCommunity' +import { type User as UserType } from './User' import { GeometryTransformer } from './transformer/GeometryTransformer' @Entity('communities') @@ -95,16 +95,16 @@ export class Community extends BaseEntity { updatedAt: Date | null @OneToMany( - () => User, - (user) => user.community, + () => require('./User').User, + (user: UserType) => user.community, ) @JoinColumn({ name: 'community_uuid', referencedColumnName: 'communityUuid' }) - users: User[] + users: UserType[] @OneToMany( - () => FederatedCommunity, - (federatedCommunity) => federatedCommunity.community, + () => require('./FederatedCommunity').FederatedCommunity, + (federatedCommunity: FederatedCommunityType) => federatedCommunity.community, ) @JoinColumn({ name: 'public_key', referencedColumnName: 'publicKey' }) - federatedCommunities?: FederatedCommunity[] + federatedCommunities?: FederatedCommunityType[] } diff --git a/database/src/entity/Contribution.ts b/database/src/entity/Contribution.ts index 976385263..242eae06f 100644 --- a/database/src/entity/Contribution.ts +++ b/database/src/entity/Contribution.ts @@ -10,9 +10,9 @@ import { OneToOne, PrimaryGeneratedColumn, } from 'typeorm' -import { ContributionMessage } from './ContributionMessage' -import { Transaction } from './Transaction' -import { User } from './User' +import { type ContributionMessage as ContributionMessageType } from './ContributionMessage' +import { type Transaction as TransactionType } from './Transaction' +import { type User as UserType } from './User' import { DecimalTransformer } from './transformer/DecimalTransformer' @Entity('contributions') @@ -24,11 +24,11 @@ export class Contribution extends BaseEntity { userId: number @ManyToOne( - () => User, - (user) => user.contributions, + () => require('./User').User, + (user: UserType) => user.contributions, ) @JoinColumn({ name: 'user_id' }) - user: User + user: UserType @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP', name: 'created_at' }) createdAt: Date @@ -103,16 +103,16 @@ export class Contribution extends BaseEntity { deletedBy: number @OneToMany( - () => ContributionMessage, - (message) => message.contribution, + () => require('./ContributionMessage').ContributionMessage, + (message: ContributionMessageType) => message.contribution, ) @JoinColumn({ name: 'contribution_id' }) - messages?: ContributionMessage[] + messages?: ContributionMessageType[] @OneToOne( - () => Transaction, - (transaction) => transaction.contribution, + () => require('./Transaction').Transaction, + (transaction: TransactionType) => transaction.contribution, ) @JoinColumn({ name: 'transaction_id' }) - transaction?: Transaction | null + transaction?: TransactionType | null } diff --git a/database/src/entity/ContributionMessage.ts b/database/src/entity/ContributionMessage.ts index 1b76243e8..b6fde3815 100644 --- a/database/src/entity/ContributionMessage.ts +++ b/database/src/entity/ContributionMessage.ts @@ -10,8 +10,8 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm' -import { Contribution } from './Contribution' -import { User } from './User' +import { type Contribution as ContributionType } from './Contribution' +import { type User as UserType } from './User' @Entity('contribution_messages', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci', @@ -25,21 +25,21 @@ export class ContributionMessage extends BaseEntity { contributionId: number @ManyToOne( - () => Contribution, - (contribution) => contribution.messages, + () => require('./Contribution').Contribution, + (contribution: ContributionType) => contribution.messages, ) @JoinColumn({ name: 'contribution_id' }) - contribution: Contribution + contribution: ContributionType @Column({ name: 'user_id', type: 'bigint', unsigned: true, nullable: false }) userId: number @ManyToOne( - () => User, - (user) => user.messages, + () => require('./User').User, + (user: UserType) => user.messages, ) @JoinColumn({ name: 'user_id' }) - user: User + user: UserType @Column({ type: 'varchar', length: 2000, nullable: false, collation: 'utf8mb4_unicode_ci' }) message: string diff --git a/database/src/entity/DltTransaction.ts b/database/src/entity/DltTransaction.ts index 2df3fb92c..46cccd0f6 100644 --- a/database/src/entity/DltTransaction.ts +++ b/database/src/entity/DltTransaction.ts @@ -1,7 +1,7 @@ import { BaseEntity, Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm' -import { Transaction } from './Transaction' -import { TransactionLink } from './TransactionLink' -import { User } from './User' +import { type Transaction as TransactionType } from './Transaction' +import { type TransactionLink as TransactionLinkType } from './TransactionLink' +import { type User as UserType } from './User' @Entity('dlt_transactions', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class DltTransaction extends BaseEntity { @@ -49,23 +49,23 @@ export class DltTransaction extends BaseEntity { error: string | null @OneToOne( - () => Transaction, - (transaction) => transaction.dltTransaction, + () => require('./Transaction').Transaction, + (transaction: TransactionType) => transaction.dltTransaction, ) @JoinColumn({ name: 'transaction_id' }) - transaction?: Transaction | null + transaction?: TransactionType | null @OneToOne( - () => User, - (user) => user.dltTransaction, + () => require('./User').User, + (user: UserType) => user.dltTransaction, ) @JoinColumn({ name: 'user_id' }) - user?: User | null + user?: UserType | null @OneToOne( - () => TransactionLink, - (transactionLink) => transactionLink.dltTransaction, + () => require('./TransactionLink').TransactionLink, + (transactionLink: TransactionLinkType) => transactionLink.dltTransaction, ) @JoinColumn({ name: 'transaction_link_id' }) - transactionLink?: TransactionLink | null + transactionLink?: TransactionLinkType | null } diff --git a/database/src/entity/Event.ts b/database/src/entity/Event.ts index 9d17ffdeb..4adbe6e51 100644 --- a/database/src/entity/Event.ts +++ b/database/src/entity/Event.ts @@ -8,12 +8,12 @@ import { ManyToOne, PrimaryGeneratedColumn, } from 'typeorm' -import { Contribution } from './Contribution' -import { ContributionLink } from './ContributionLink' -import { ContributionMessage } from './ContributionMessage' -import { Transaction } from './Transaction' -import { TransactionLink } from './TransactionLink' -import { User } from './User' +import { type Contribution as ContributionType } from './Contribution' +import { type ContributionLink as ContributionLinkType } from './ContributionLink' +import { type ContributionMessage as ContributionMessageType } from './ContributionMessage' +import { type Transaction as TransactionType } from './Transaction' +import { type TransactionLink as TransactionLinkType } from './TransactionLink' +import { type User as UserType } from './User' import { DecimalTransformer } from './transformer/DecimalTransformer' @Entity('events') @@ -36,37 +36,37 @@ export class Event extends BaseEntity { @Column({ name: 'affected_user_id', type: 'bigint', unsigned: true, nullable: false }) affectedUserId: number - @ManyToOne(() => User) + @ManyToOne(() => require('./User').User) @JoinColumn({ name: 'affected_user_id', referencedColumnName: 'id' }) - affectedUser: User + affectedUser: UserType @Column({ name: 'acting_user_id', type: 'bigint', unsigned: true, nullable: false }) actingUserId: number - @ManyToOne(() => User) + @ManyToOne(() => require('./User').User) @JoinColumn({ name: 'acting_user_id', referencedColumnName: 'id' }) - actingUser: User + actingUser: UserType @Column({ name: 'involved_user_id', type: 'bigint', unsigned: true, nullable: true }) involvedUserId: number | null - @ManyToOne(() => User) + @ManyToOne(() => require('./User').User) @JoinColumn({ name: 'involved_user_id', referencedColumnName: 'id' }) - involvedUser: User | null + involvedUser: UserType | null @Column({ name: 'involved_transaction_id', type: 'bigint', unsigned: true, nullable: true }) involvedTransactionId: number | null - @ManyToOne(() => Transaction) + @ManyToOne(() => require('./Transaction').Transaction) @JoinColumn({ name: 'involved_transaction_id', referencedColumnName: 'id' }) - involvedTransaction: Transaction | null + involvedTransaction: TransactionType | null @Column({ name: 'involved_contribution_id', type: 'bigint', unsigned: true, nullable: true }) involvedContributionId: number | null - @ManyToOne(() => Contribution) + @ManyToOne(() => require('./Contribution').Contribution) @JoinColumn({ name: 'involved_contribution_id', referencedColumnName: 'id' }) - involvedContribution: Contribution | null + involvedContribution: ContributionType | null @Column({ name: 'involved_contribution_message_id', @@ -76,23 +76,23 @@ export class Event extends BaseEntity { }) involvedContributionMessageId: number | null - @ManyToOne(() => ContributionMessage) + @ManyToOne(() => require('./ContributionMessage').ContributionMessage) @JoinColumn({ name: 'involved_contribution_message_id', referencedColumnName: 'id' }) - involvedContributionMessage: ContributionMessage | null + involvedContributionMessage: ContributionMessageType | null @Column({ name: 'involved_transaction_link_id', type: 'bigint', unsigned: true, nullable: true }) involvedTransactionLinkId: number | null - @ManyToOne(() => TransactionLink) + @ManyToOne(() => require('./TransactionLink').TransactionLink) @JoinColumn({ name: 'involved_transaction_link_id', referencedColumnName: 'id' }) - involvedTransactionLink: TransactionLink | null + involvedTransactionLink: TransactionLinkType | null @Column({ name: 'involved_contribution_link_id', type: 'bigint', unsigned: true, nullable: true }) involvedContributionLinkId: number | null - @ManyToOne(() => ContributionLink) + @ManyToOne(() => require('./ContributionLink').ContributionLink) @JoinColumn({ name: 'involved_contribution_link_id', referencedColumnName: 'id' }) - involvedContributionLink: ContributionLink | null + involvedContributionLink: ContributionLinkType | null @Column({ type: 'decimal', diff --git a/database/src/entity/TransactionLink.ts b/database/src/entity/TransactionLink.ts index 326573c16..7fe755a7a 100644 --- a/database/src/entity/TransactionLink.ts +++ b/database/src/entity/TransactionLink.ts @@ -9,10 +9,10 @@ import { OneToOne, PrimaryGeneratedColumn, } from 'typeorm' -import { DltTransaction } from './DltTransaction' -import { Transaction } from './Transaction' +import { type DltTransaction as DltTransactionType } from './DltTransaction' +import { type Transaction as TransactionType } from './Transaction' import { DecimalTransformer } from './transformer/DecimalTransformer' -import { User } from './User' +import { type User as UserType } from './User' @Entity('transaction_links') export class TransactionLink extends BaseEntity { @@ -72,23 +72,23 @@ export class TransactionLink extends BaseEntity { redeemedBy: number | null @OneToOne( - () => DltTransaction, - (dlt) => dlt.transactionLinkId, + () => require('./DltTransaction').DltTransaction, + (dlt: DltTransactionType) => dlt.transactionLinkId, ) @JoinColumn({ name: 'id', referencedColumnName: 'transactionLinkId' }) - dltTransaction?: DltTransaction | null + dltTransaction?: DltTransactionType | null @OneToOne( - () => User, - (user) => user.transactionLink, + () => require('./User').User, + (user: UserType) => user.transactionLink, ) @JoinColumn({ name: 'userId' }) - user: User + user: UserType @OneToMany( - () => Transaction, - (transaction) => transaction.transactionLink, + () => require('./Transaction').Transaction, + (transaction: TransactionType) => transaction.transactionLink, ) @JoinColumn({ referencedColumnName: 'transaction_link_id' }) - transactions: Transaction[] + transactions: TransactionType[] } diff --git a/database/src/entity/User.ts b/database/src/entity/User.ts index 6a40e9858..20219e4f7 100644 --- a/database/src/entity/User.ts +++ b/database/src/entity/User.ts @@ -3,20 +3,20 @@ import { Column, DeleteDateColumn, Entity, - Geometry, + type Geometry, JoinColumn, ManyToOne, OneToMany, OneToOne, PrimaryGeneratedColumn, } from 'typeorm' -import { Community } from './Community' -import { Contribution } from './Contribution' -import { ContributionMessage } from './ContributionMessage' -import { DltTransaction } from './DltTransaction' -import { TransactionLink } from './TransactionLink' -import { UserContact } from './UserContact' -import { UserRole } from './UserRole' +import { type Community as CommunityType } from './Community' +import { type Contribution as ContributionType } from './Contribution' +import { type ContributionMessage as ContributionMessageType } from './ContributionMessage' +import { type DltTransaction as DltTransactionType } from './DltTransaction' +import { type TransactionLink as TransactionLinkType } from './TransactionLink' +import { type UserContact as UserContactType } from './UserContact' +import { type UserRole as UserRoleType } from './UserRole' import { GeometryTransformer } from './transformer/GeometryTransformer' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) @@ -46,11 +46,11 @@ export class User extends BaseEntity { communityUuid: string @ManyToOne( - () => Community, - (community) => community.users, + () => require('./Community').Community, + (community: CommunityType) => community.users, ) @JoinColumn({ name: 'community_uuid', referencedColumnName: 'communityUuid' }) - community: Community | null + community: CommunityType | null @Column({ name: 'alias', @@ -63,11 +63,11 @@ export class User extends BaseEntity { alias: string @OneToOne( - () => UserContact, - (emailContact: UserContact) => emailContact.user, + () => require('./UserContact').UserContact, + (emailContact: UserContactType) => emailContact.user, ) @JoinColumn({ name: 'email_id' }) - emailContact: UserContact + emailContact: UserContactType @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) emailId: number | null @@ -138,11 +138,11 @@ export class User extends BaseEntity { hideAmountGDT: boolean @OneToMany( - () => UserRole, - (userRole) => userRole.user, + () => require('./UserRole').UserRole, + (userRole: UserRoleType) => userRole.user, ) @JoinColumn({ name: 'user_id' }) - userRoles: UserRole[] + userRoles: UserRoleType[] @Column({ name: 'referrer_id', type: 'bigint', unsigned: true, nullable: true, default: null }) referrerId?: number | null @@ -196,37 +196,37 @@ export class User extends BaseEntity { humhubAllowed: boolean @OneToMany( - () => Contribution, - (contribution) => contribution.user, + () => require('./Contribution').Contribution, + (contribution: ContributionType) => contribution.user, ) @JoinColumn({ name: 'user_id' }) - contributions?: Contribution[] + contributions?: ContributionType[] @OneToMany( - () => ContributionMessage, - (message) => message.user, + () => require('./ContributionMessage').ContributionMessage, + (message: ContributionMessageType) => message.user, ) @JoinColumn({ name: 'user_id' }) - messages?: ContributionMessage[] + messages?: ContributionMessageType[] @OneToMany( - () => UserContact, - (userContact: UserContact) => userContact.user, + () => require('./UserContact').UserContact, + (userContact: UserContactType) => userContact.user, ) @JoinColumn({ name: 'user_id' }) - userContacts?: UserContact[] + userContacts?: UserContactType[] @OneToOne( - () => DltTransaction, - (dlt) => dlt.userId, + () => require('./DltTransaction').DltTransaction, + (dlt: DltTransactionType) => dlt.userId, ) @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) - dltTransaction?: DltTransaction | null + dltTransaction?: DltTransactionType | null @OneToOne( - () => TransactionLink, - (transactionLink) => transactionLink.userId, + () => require('./TransactionLink').TransactionLink, + (transactionLink: TransactionLinkType) => transactionLink.userId, ) @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) - transactionLink?: TransactionLink | null + transactionLink?: TransactionLinkType | null } diff --git a/database/src/entity/transformer/GeometryTransformer.ts b/database/src/entity/transformer/GeometryTransformer.ts index bc80d256b..b877f2c38 100644 --- a/database/src/entity/transformer/GeometryTransformer.ts +++ b/database/src/entity/transformer/GeometryTransformer.ts @@ -1,4 +1,4 @@ -import { Geometry } from 'geojson' +import { type Geometry } from 'geojson' import { ValueTransformer } from 'typeorm/decorator/options/ValueTransformer' import { Geometry as wkx_Geometry } from 'wkx' diff --git a/database/src/queries/communities.test.ts b/database/src/queries/communities.test.ts index b435c3649..1f5135994 100644 --- a/database/src/queries/communities.test.ts +++ b/database/src/queries/communities.test.ts @@ -1,7 +1,11 @@ import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity } from '..' import { AppDatabase } from '../AppDatabase' -import { getCommunityByPublicKeyOrFail, getHomeCommunity, getHomeCommunityWithFederatedCommunityOrFail, getReachableCommunities } from './communities' -import { describe, expect, it, beforeEach, beforeAll, afterAll } from 'vitest' +import { + getCommunityByPublicKeyOrFail, + getHomeCommunity, + getHomeCommunityWithFederatedCommunityOrFail, + getReachableCommunities +} from './communities' import { createCommunity, createVerifiedFederatedCommunity } from '../seeds/community' import { Ed25519PublicKey } from 'shared' @@ -50,12 +54,12 @@ describe('community.queries', () => { }) it('should throw if no home community exists', async () => { - expect(() => getHomeCommunityWithFederatedCommunityOrFail('1_0')).rejects.toThrow() + expect(getHomeCommunityWithFederatedCommunityOrFail('1_0')).rejects.toThrow() }) it('should throw if no federated community exists', async () => { await createCommunity(false) - expect(() => getHomeCommunityWithFederatedCommunityOrFail('1_0')).rejects.toThrow() + expect(getHomeCommunityWithFederatedCommunityOrFail('1_0')).rejects.toThrow() }) it('load community by public key returned from getHomeCommunityWithFederatedCommunityOrFail', async () => { diff --git a/database/src/queries/communityHandshakes.test.ts b/database/src/queries/communityHandshakes.test.ts index 372fb1293..c1b665bab 100644 --- a/database/src/queries/communityHandshakes.test.ts +++ b/database/src/queries/communityHandshakes.test.ts @@ -6,7 +6,6 @@ import { findPendingCommunityHandshake, CommunityHandshakeStateType } from '..' -import { describe, expect, it, beforeEach, beforeAll, afterAll } from 'vitest' import { createCommunity, createVerifiedFederatedCommunity } from '../seeds/community' import { Ed25519PublicKey } from 'shared' import { randomBytes } from 'node:crypto' @@ -59,7 +58,6 @@ describe('communityHandshakes', () => { communityHandshakeState!.status = CommunityHandshakeStateType.START_OPEN_CONNECTION_CALLBACK await communityHandshakeState!.save() const communityHandshakeState2 = await findPendingCommunityHandshake(publicKey, '1_0') - const states = await DbCommunityHandshakeState.find() expect(communityHandshakeState2).toBeDefined() expect(communityHandshakeState2).toMatchObject({ publicKey: publicKey.asBuffer(), diff --git a/database/src/queries/pendingTransactions.test.ts b/database/src/queries/pendingTransactions.test.ts index c59c312e4..a4765dcee 100644 --- a/database/src/queries/pendingTransactions.test.ts +++ b/database/src/queries/pendingTransactions.test.ts @@ -13,7 +13,6 @@ import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' import { peterLustig } from '../seeds/users/peter-lustig' import { bobBaumeister } from '../seeds/users/bob-baumeister' import { garrickOllivander } from '../seeds/users/garrick-ollivander' -import { describe, expect, it, beforeAll, afterAll } from 'vitest' import { createCommunity } from '../seeds/community' import { v4 as uuidv4 } from 'uuid' import Decimal from 'decimal.js-light' diff --git a/database/src/queries/user.test.ts b/database/src/queries/user.test.ts index b653a5349..6348c01d8 100644 --- a/database/src/queries/user.test.ts +++ b/database/src/queries/user.test.ts @@ -3,11 +3,10 @@ import { AppDatabase } from '../AppDatabase' import { aliasExists, findUserByIdentifier } from './user' import { userFactory } from '../seeds/factory/user' import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' -import { describe, expect, it, beforeAll, afterAll, beforeEach, } from 'vitest' import { createCommunity } from '../seeds/community' import { peterLustig } from '../seeds/users/peter-lustig' import { bobBaumeister } from '../seeds/users/bob-baumeister' -import { getLogger, printLogs, clearLogs } from '../../../config-schema/test/testSetup.vitest' +import { getLogger, printLogs, clearLogs } from '../../../config-schema/test/testSetup.bun' import { LOG4JS_QUERIES_CATEGORY_NAME } from '.' const db = AppDatabase.getInstance() diff --git a/database/tsconfig.json b/database/tsconfig.json index ec6769fa2..862e9bf94 100644 --- a/database/tsconfig.json +++ b/database/tsconfig.json @@ -72,8 +72,5 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, "references": [], /* Any project that is referenced must itself have a `references` array (which may be empty). */ - "ts-node": { - "swc": true - }, "exclude": ["**/*.test.ts", "**/*.spec.ts", "test/*"] } diff --git a/database/vitest.config.js b/database/vitest.config.js deleted file mode 100644 index b0e269a1a..000000000 --- a/database/vitest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - test: { - setupFiles: '../config-schema/test/testSetup.vitest.ts', - }, -}) \ No newline at end of file diff --git a/deployment/bare_metal/.env.dist b/deployment/bare_metal/.env.dist index e5c86f789..8341133c9 100644 --- a/deployment/bare_metal/.env.dist +++ b/deployment/bare_metal/.env.dist @@ -90,7 +90,7 @@ GDT_ACTIVE=false AUTO_POLL_INTERVAL=30000 # DLT-Connector (still in develop) -DLT_CONNECTOR=false +DLT_ACTIVE=false DLT_CONNECTOR_PORT=6010 DLT_NODE_SERVER_PORT=8340 DLT_NODE_SERVER_URL=$URL_PROTOCOL://$COMMUNITY_HOST/dlt diff --git a/deployment/bare_metal/start.sh b/deployment/bare_metal/start.sh index cb53206a5..80ef55d39 100755 --- a/deployment/bare_metal/start.sh +++ b/deployment/bare_metal/start.sh @@ -214,14 +214,13 @@ unset FEDERATION_APIVERSION unset FEDERATION_PORT log_step "====================================================================================================" +export DLT_NGINX_CONF="${DLT_NGINX_CONF:-# dlt disabled}" # prepare inspector and gradido dlt node nginx config blocks if enabled -if [ "$DLT_CONNECTOR" = true ] ; then +if [ "$DLT_ACTIVE" = true ] ; then log_step "prepare inspector and dlt gradido node nginx config block" envsubst '$DLT_NODE_SERVER_PORT' < $NGINX_CONFIG_DIR/gradido-dlt.conf.template >> $NGINX_CONFIG_DIR/gradido-dlt.conf export DLT_NGINX_CONF=$(< $NGINX_CONFIG_DIR/gradido-dlt.conf) rm $NGINX_CONFIG_DIR/gradido-dlt.conf -else - export DLT_NGINX_CONF="# dlt is disabled" fi # *** 2nd read gradido-federation.conf file in env variable to be replaced in 3rd step @@ -257,7 +256,7 @@ MODULES=( dht-node federation ) -if [ "$DLT_CONNECTOR" = true ] ; then +if [ "$DLT_ACTIVE" = true ] ; then MODULES+=("inspector") MODULES+=("dlt-connector") fi @@ -307,7 +306,7 @@ log_step 'build all modules' turbo build --env-mode=loose --concurrency=$(nproc) # build inspector and dlt-connector -if [ "$DLT_CONNECTOR" = true ]; then +if [ "$DLT_ACTIVE" = true ]; then log_step 'build inspector' cd $PROJECT_ROOT/inspector bun install @@ -340,7 +339,7 @@ pm2 start --name gradido-backend \ -l $GRADIDO_LOG_PATH/pm2.backend.$TODAY.log \ --log-date-format 'YYYY-MM-DD HH:mm:ss.SSS' -if [ "$DLT_CONNECTOR" = true ] ; then +if [ "$DLT_ACTIVE" = true ] ; then pm2 start --name dlt-connector \ "env TZ=UTC NODE_ENV=production bun ./build/index.js" \ --cwd $PROJECT_ROOT/dlt-connector \ diff --git a/dht-node/package.json b/dht-node/package.json index a4c578c12..cb29f28f5 100644 --- a/dht-node/package.json +++ b/dht-node/package.json @@ -1,6 +1,6 @@ { "name": "dht-node", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido dht-node module", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/", diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 8c3d06b39..cbe81b34b 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -229,6 +229,7 @@ volumes: node_modules_frontend: node_modules_backend: node_modules_federation: + node_modules_inspector: node_modules_database: node_modules_dlt_connector: turbo_cache: diff --git a/federation/Dockerfile b/federation/Dockerfile index c3a45bf3d..c754eced6 100644 --- a/federation/Dockerfile +++ b/federation/Dockerfile @@ -116,5 +116,7 @@ COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/federation/build/index.js ./ # add node_modules from production_node_modules COPY --chown=app:app --from=production-node-modules ${DOCKER_WORKDIR}/node_modules ./node_modules +COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/core/build/templates ./templates + # Run command CMD ["node", "index.js"] \ No newline at end of file diff --git a/federation/esbuild.config.ts b/federation/esbuild.config.ts index 2ef5f88e5..879d96cbd 100644 --- a/federation/esbuild.config.ts +++ b/federation/esbuild.config.ts @@ -8,8 +8,9 @@ build({ target: 'node18.20.7', bundle: true, keepNames: true, + entryNames: '[name]', // legalComments: 'inline', - external: ['sodium-native'], + external: ['sodium-native', 'email-templates'], plugins: [esbuildDecorators()], minify: true, sourcemap: true, diff --git a/federation/package.json b/federation/package.json index 7908ddf29..fcf1365ab 100644 --- a/federation/package.json +++ b/federation/package.json @@ -1,6 +1,6 @@ { "name": "federation", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido federation module providing Gradido-Hub-Federation and versioned API for inter community communication", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/federation", @@ -8,13 +8,14 @@ "license": "Apache-2.0", "private": false, "scripts": { - "build": "ts-node ./esbuild.config.ts", + "build": "ts-node ./esbuild.config.ts && mkdirp build/templates/ && ncp ../core/build/templates build/templates", "start": "cross-env TZ=UTC NODE_ENV=production node build/index.js", "start:bun": "cross-env TZ=UTC NODE_ENV=production bun build/index.js", "dev": "cross-env TZ=UTC nodemon -w src --ext ts,json,css -r tsconfig-paths/register src/index.ts", "dev:bun": "cross-env TZ=UTC bun --hot src/index.ts", "typecheck": "tsc --noEmit", "test": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_federation jest --runInBand --forceExit --detectOpenHandles", + "test:bun": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_federation bun test", "test:debug": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_federation node --inspect-brk node_modules/.bin/jest --bail --runInBand --forceExit --detectOpenHandles", "test:coverage": "cross-env TZ=UTC NODE_ENV=development DB_DATABASE=gradido_test_federation jest --coverage --runInBand --forceExit --detectOpenHandles", "lint": "biome check --error-on-warnings .", @@ -23,6 +24,7 @@ }, "dependencies": { "cross-env": "^7.0.3", + "email-templates": "^10.0.1", "sodium-native": "^3.4.1" }, "devDependencies": { @@ -60,6 +62,8 @@ "joi": "17.13.3", "lodash.clonedeep": "^4.5.0", "log4js": "^6.7.1", + "mkdirp": "^3.0.1", + "ncp": "^2.0.0", "nodemon": "^2.0.7", "prettier": "^3.5.3", "reflect-metadata": "^0.1.13", diff --git a/federation/src/graphql/api/1_0/resolver/AuthenticationResolver.ts b/federation/src/graphql/api/1_0/resolver/AuthenticationResolver.ts index d22c816ff..3bee91e3e 100644 --- a/federation/src/graphql/api/1_0/resolver/AuthenticationResolver.ts +++ b/federation/src/graphql/api/1_0/resolver/AuthenticationResolver.ts @@ -62,6 +62,7 @@ export class AuthenticationResolver { // no await to respond immediately and invoke callback-request asynchronously // important: startOpenConnectionCallback must catch all exceptions them self, or server will crash! + // biome-ignore lint/complexity/noVoid: start it intentionally async without waiting for result void startOpenConnectionCallback(args.handshakeID, argsPublicKey, fedComA) methodLogger.debug('openConnection() successfully initiated callback and returns true immediately...') return true @@ -96,6 +97,7 @@ export class AuthenticationResolver { `found fedComB and start authentication: ${fedComB.endPoint}${fedComB.apiVersion}`, ) // no await to respond immediately and invoke authenticate-request asynchronously + // biome-ignore lint/complexity/noVoid: start it intentionally async without waiting for result void startAuthentication(args.handshakeID, openConnectionCallbackJwtPayload.oneTimeCode, fedComB) // methodLogger.debug('openConnectionCallback() successfully initiated authentication and returns true immediately...') return true diff --git a/federation/src/server/cors.ts b/federation/src/server/cors.ts index 873d6a2eb..95663695d 100644 --- a/federation/src/server/cors.ts +++ b/federation/src/server/cors.ts @@ -1,9 +1,8 @@ -import cors from 'cors' +import corsLib from 'cors' const corsOptions = { origin: '*', exposedHeaders: ['token'], } -// biome-ignore lint/style/noDefaultExport: -export default cors(corsOptions) +export const cors = corsLib(corsOptions) diff --git a/federation/src/server/createServer.ts b/federation/src/server/createServer.ts index 015fbba48..d8cb0f473 100644 --- a/federation/src/server/createServer.ts +++ b/federation/src/server/createServer.ts @@ -4,7 +4,7 @@ import { ApolloServer } from 'apollo-server-express' import express, { Express } from 'express' // server -import cors from './cors' +import { cors } from './cors' // import serverContext from './context' import { plugins } from './plugins' diff --git a/federation/tsconfig.json b/federation/tsconfig.json index 86b102fa6..c42e39505 100644 --- a/federation/tsconfig.json +++ b/federation/tsconfig.json @@ -6,6 +6,7 @@ // "incremental": true, /* Enable incremental compilation */ "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + "resolveJsonModule": true, // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ @@ -62,7 +63,7 @@ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ "typeRoots": [ /* List of folders to include type definitions from. */ "node_modules/@types", - "../node_modules/@types" + "../node_modules/@types", ], // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ @@ -84,6 +85,9 @@ "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ }, + "include": [ + "../core/src/types", + ], "ts-node": { "swc": true } diff --git a/frontend/package.json b/frontend/package.json index f8826b0b1..ade408c16 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "2.7.0", + "version": "2.7.1", "private": true, "scripts": { "dev": "concurrently \"yarn watch-scss\" \"vite\"", diff --git a/frontend/src/components/ContentFooter.vue b/frontend/src/components/ContentFooter.vue index e749d0cd9..d6f120e49 100755 --- a/frontend/src/components/ContentFooter.vue +++ b/frontend/src/components/ContentFooter.vue @@ -43,6 +43,9 @@ {{ $t('navigation.support') }} + + {{ $t('footer.inspector') }} + @@ -54,6 +57,8 @@ import CONFIG from '@/config' export default { data() { return { + dltActive: CONFIG.DLT_ACTIVE, + communityUrl: CONFIG.COMMUNITY_URL, year: new Date().getFullYear(), version: CONFIG.APP_VERSION, hash: CONFIG.BUILD_COMMIT, diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index f75ef910f..d1d9966f8 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -38,6 +38,7 @@ if (process.env.FRONTEND_HOSTING === 'nodejs') { // version.FRONTEND_MODULE_PORT const features = { + DLT_ACTIVE: process.env.DLT_ACTIVE === 'true', GMS_ACTIVE: process.env.GMS_ACTIVE === 'true', HUMHUB_ACTIVE: process.env.HUMHUB_ACTIVE === 'true', AUTO_POLL_INTERVAL: Number.parseInt(process.env.AUTO_POLL_INTERVAL ?? 0), diff --git a/frontend/src/config/schema.js b/frontend/src/config/schema.js index c7f7817b8..745e24b74 100644 --- a/frontend/src/config/schema.js +++ b/frontend/src/config/schema.js @@ -9,6 +9,7 @@ import { COMMUNITY_URL, DEBUG, DECAY_START_TIME, + DLT_ACTIVE, GMS_ACTIVE, GRAPHQL_URI, HUMHUB_ACTIVE, @@ -30,6 +31,7 @@ module.exports = Joi.object({ COMMUNITY_URL, DEBUG, DECAY_START_TIME, + DLT_ACTIVE, GMS_ACTIVE, GRAPHQL_URI, HUMHUB_ACTIVE, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 4e9cdfdd5..e1429b8d5 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -158,6 +158,7 @@ "year": "© {year}" }, "imprint": "Impressum", + "inspector": "Inspektor (experimentell)", "privacy_policy": "Datenschutzerklärung", "short_hash": "({shortHash})", "whitepaper": "Whitepaper" diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 9e96a497b..f0c4fab94 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -158,6 +158,7 @@ "year": "© {year}" }, "imprint": "Legal notice", + "inspector": "Inspector (experimental)", "privacy_policy": "Privacy policy", "short_hash": "({shortHash})", "whitepaper": "Whitepaper" diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 905466540..1e7344cbb 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -140,6 +140,7 @@ "year": "© {year}" }, "imprint": "Aviso legal", + "inspector": "Inspector (experimental)", "privacy_policy": "Protección de Datos", "short_hash": "({shortHash})", "whitepaper": "Whitepaper" diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 8024d468e..4caa05686 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -145,6 +145,7 @@ "year": "© {year}" }, "imprint": "Notification légale", + "inspector": "Inspecteur (expérimental)", "privacy_policy": "Politique de confidentialité", "short_hash": "({shortHash})", "whitepaper": "Papier blanc" diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 98eb6d2ad..16568e294 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -140,6 +140,7 @@ "year": "© {year}" }, "imprint": "Colofon", + "inspector": "Inspecteur (experimenteel)", "privacy_policy": "Privacyverklaring", "short_hash": "({shortHash})", "whitepaper": "Witboek" diff --git a/frontend/vite.config.mjs b/frontend/vite.config.mjs index 4a0674b0f..d722601d0 100644 --- a/frontend/vite.config.mjs +++ b/frontend/vite.config.mjs @@ -114,6 +114,7 @@ export default defineConfig(async ({ command }) => { AUTO_POLL_INTERVAL: CONFIG.AUTO_POLL_INTERVAL, BUILD_COMMIT: CONFIG.BUILD_COMMIT, CROSS_TX_REDEEM_LINK_ACTIVE: CONFIG.CROSS_TX_REDEEM_LINK_ACTIVE, + DLT_ACTIVE: CONFIG.DLT_ACTIVE, GMS_ACTIVE: CONFIG.GMS_ACTIVE, HUMHUB_ACTIVE: CONFIG.HUMHUB_ACTIVE, DEFAULT_PUBLISHER_ID: null, diff --git a/package.json b/package.json index e022f9008..0c9be0feb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gradido", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido", "main": "index.js", "repository": "git@github.com:gradido/gradido.git", @@ -39,7 +39,7 @@ "devDependencies": { "@biomejs/biome": "2.0.0", "@types/minimatch": "6.0.0", - "bbump": "^1.0.2" + "bumpp": "^10.3.1" }, "engines": { "node": ">=18" diff --git a/shared/package.json b/shared/package.json index 73e4e6832..4131cd774 100644 --- a/shared/package.json +++ b/shared/package.json @@ -1,6 +1,6 @@ { "name": "shared", - "version": "2.7.0", + "version": "2.7.1", "description": "Gradido Shared Code, Low-Level Shared Code, without dependencies on other modules", "main": "./build/index.js", "types": "./src/index.ts", diff --git a/shared/src/helper/onShutdown.ts b/shared/src/helper/onShutdown.ts index a27c931a6..ea24bf2fc 100644 --- a/shared/src/helper/onShutdown.ts +++ b/shared/src/helper/onShutdown.ts @@ -1,4 +1,3 @@ -import { Logger } from 'log4js' import colors from 'yoctocolors-cjs' export enum ShutdownReason { @@ -44,8 +43,10 @@ export function onShutdown(shutdownHandler: (reason: ShutdownReason, error?: Err } export function printServerCrashAsciiArt(msg1: string, msg2: string, msg3: string) { + // biome-ignore-start lint/suspicious/noConsole: Server Crash Ascii Art is for console and stdout console.error(colors.redBright(` /\\_/\\ ${msg1}`)) console.error(colors.redBright(`( x.x ) ${msg2}`)) console.error(colors.redBright(` > < ${msg3}`)) console.error(colors.redBright('')) + // biome-ignore-end lint/suspicious/noConsole: Server Crash Ascii Art is for console and stdout } \ No newline at end of file