From 76d651f375cee1d822db2dbe3067823e972d767c Mon Sep 17 00:00:00 2001 From: praxter11 Date: Wed, 25 Oct 2023 16:03:49 +0530 Subject: [PATCH 1/7] feat(provider): added simple-texting sms provider --- .../images/providers/dark/simpletexting.png | Bin 0 -> 21083 bytes .../providers/dark/square/simpletexting.svg | 48 + .../images/providers/light/simpletexting.png | Bin 0 -> 42874 bytes .../providers/light/square/simpletexting.svg | 48 + .../src/consts/providers/channels/sms.ts | 9 + .../credentials/provider-credentials.ts | 10 + .../src/consts/providers/provider.enum.ts | 1 + packages/application-generic/package.json | 1 + .../src/factories/sms/handlers/index.ts | 1 + .../sms/handlers/simpletexting.handler.ts | 18 + .../src/factories/sms/sms.factory.ts | 2 + pnpm-lock.yaml | 1902 +++-------------- providers/simpletexting/.czrc | 3 + providers/simpletexting/.eslintrc.json | 3 + providers/simpletexting/.gitignore | 9 + providers/simpletexting/README.md | 14 + providers/simpletexting/jest.config.js | 8 + providers/simpletexting/package.json | 78 + providers/simpletexting/src/index.ts | 1 + .../src/lib/simpletexting.provider.spec.ts | 43 + .../src/lib/simpletexting.provider.ts | 44 + providers/simpletexting/tsconfig.json | 10 + providers/simpletexting/tsconfig.module.json | 9 + 23 files changed, 685 insertions(+), 1577 deletions(-) create mode 100644 apps/web/public/static/images/providers/dark/simpletexting.png create mode 100644 apps/web/public/static/images/providers/dark/square/simpletexting.svg create mode 100644 apps/web/public/static/images/providers/light/simpletexting.png create mode 100644 apps/web/public/static/images/providers/light/square/simpletexting.svg create mode 100644 packages/application-generic/src/factories/sms/handlers/simpletexting.handler.ts create mode 100644 providers/simpletexting/.czrc create mode 100644 providers/simpletexting/.eslintrc.json create mode 100644 providers/simpletexting/.gitignore create mode 100644 providers/simpletexting/README.md create mode 100644 providers/simpletexting/jest.config.js create mode 100644 providers/simpletexting/package.json create mode 100644 providers/simpletexting/src/index.ts create mode 100644 providers/simpletexting/src/lib/simpletexting.provider.spec.ts create mode 100644 providers/simpletexting/src/lib/simpletexting.provider.ts create mode 100644 providers/simpletexting/tsconfig.json create mode 100644 providers/simpletexting/tsconfig.module.json diff --git a/apps/web/public/static/images/providers/dark/simpletexting.png b/apps/web/public/static/images/providers/dark/simpletexting.png new file mode 100644 index 0000000000000000000000000000000000000000..a3de6c62d06fcdd055f99676b32f6550a8a09d46 GIT binary patch literal 21083 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 S4!}br89ZJ6T-G@yGywqr>bB7U literal 0 HcmV?d00001 diff --git a/apps/web/public/static/images/providers/dark/square/simpletexting.svg b/apps/web/public/static/images/providers/dark/square/simpletexting.svg new file mode 100644 index 00000000000..d94ccd098f4 --- /dev/null +++ b/apps/web/public/static/images/providers/dark/square/simpletexting.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/static/images/providers/light/simpletexting.png b/apps/web/public/static/images/providers/light/simpletexting.png new file mode 100644 index 0000000000000000000000000000000000000000..7541832e7a1b3dd8a06729d9c4a98154c3ae1420 GIT binary patch literal 42874 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/shared/src/consts/providers/channels/sms.ts b/libs/shared/src/consts/providers/channels/sms.ts index 7a500146b47..4acd8ef75b3 100644 --- a/libs/shared/src/consts/providers/channels/sms.ts +++ b/libs/shared/src/consts/providers/channels/sms.ts @@ -19,6 +19,7 @@ import { africasTalkingConfig, sendchampConfig, clickSendConfig, + simpleTextingConfig, } from '../credentials'; import { SmsProviderIdEnum } from '../provider.enum'; @@ -188,4 +189,12 @@ export const smsProviders: IProviderConfig[] = [ docReference: 'https://developers.clicksend.com/docs/rest/v3/?javascript--nodejs#send-sms', logoFileName: { light: 'clicksend.png', dark: 'clicksend.png' }, }, + { + id: SmsProviderIdEnum.Simpletexting, + displayName: `SimpleTexting`, + channel: ChannelTypeEnum.SMS, + credentials: simpleTextingConfig, + docReference: 'https://simpletexting.com/api/docs/v2/', + logoFileName: { light: 'simpletexting.png', dark: 'simpletexting.png' }, + }, ]; diff --git a/libs/shared/src/consts/providers/credentials/provider-credentials.ts b/libs/shared/src/consts/providers/credentials/provider-credentials.ts index 2ff03ec0f75..8512cce6f5b 100644 --- a/libs/shared/src/consts/providers/credentials/provider-credentials.ts +++ b/libs/shared/src/consts/providers/credentials/provider-credentials.ts @@ -767,3 +767,13 @@ export const clickSendConfig: IConfigCredentials[] = [ }, ...smsConfigBase, ]; + +export const simpleTextingConfig: IConfigCredentials[] = [ + { + key: CredentialsKeyEnum.ApiKey, + displayName: 'API Key', + type: 'text', + required: true, + }, + ...smsConfigBase, +]; diff --git a/libs/shared/src/consts/providers/provider.enum.ts b/libs/shared/src/consts/providers/provider.enum.ts index be4c1b732a3..572bf3c4521 100644 --- a/libs/shared/src/consts/providers/provider.enum.ts +++ b/libs/shared/src/consts/providers/provider.enum.ts @@ -73,6 +73,7 @@ export enum SmsProviderIdEnum { Novu = 'novu-sms', Sendchamp = 'sendchamp', Clicksend = 'clicksend', + Simpletexting = 'simpletexting', } export enum ChatProviderIdEnum { diff --git a/packages/application-generic/package.json b/packages/application-generic/package.json index 75b45628bda..4aff37d94ee 100644 --- a/packages/application-generic/package.json +++ b/packages/application-generic/package.json @@ -84,6 +84,7 @@ "@novu/sendchamp": "^0.20.0", "@novu/sendgrid": "^0.20.0", "@novu/sendinblue": "^0.20.0", + "@novu/simpletexting": "^0.20.0", "@novu/ses": "^0.20.0", "@novu/shared": "^0.20.0", "@novu/slack": "^0.20.0", diff --git a/packages/application-generic/src/factories/sms/handlers/index.ts b/packages/application-generic/src/factories/sms/handlers/index.ts index 5ee5bc78df4..96d85365098 100644 --- a/packages/application-generic/src/factories/sms/handlers/index.ts +++ b/packages/application-generic/src/factories/sms/handlers/index.ts @@ -16,4 +16,5 @@ export * from './sms-central.handler'; export * from './africas-talking.handler'; export * from './sendchamp.handler'; export * from './clicksend.handler'; +export * from './simpletexting.handler'; export * from './novu.handler'; diff --git a/packages/application-generic/src/factories/sms/handlers/simpletexting.handler.ts b/packages/application-generic/src/factories/sms/handlers/simpletexting.handler.ts new file mode 100644 index 00000000000..475d6014820 --- /dev/null +++ b/packages/application-generic/src/factories/sms/handlers/simpletexting.handler.ts @@ -0,0 +1,18 @@ +import { ChannelTypeEnum, ICredentials } from '@novu/shared'; +import { SimpletextingSmsProvider } from '@novu/simpletexting'; +import { BaseSmsHandler } from './base.handler'; + +export class SimpletextingSmsHandler extends BaseSmsHandler { + constructor() { + super('simpletexting', ChannelTypeEnum.SMS); + } + + buildProvider(credentials: ICredentials) { + const config = { + apiKey: credentials.apiKey, + accountPhone: credentials.from, + }; + + this.provider = new SimpletextingSmsProvider(config); + } +} diff --git a/packages/application-generic/src/factories/sms/sms.factory.ts b/packages/application-generic/src/factories/sms/sms.factory.ts index 5fe769c1988..a33f6911432 100644 --- a/packages/application-generic/src/factories/sms/sms.factory.ts +++ b/packages/application-generic/src/factories/sms/sms.factory.ts @@ -19,6 +19,7 @@ import { AfricasTalkingSmsHandler, SendchampSmsHandler, ClicksendSmsHandler, + SimpletextingSmsHandler, NovuSmsHandler, } from './handlers'; @@ -42,6 +43,7 @@ export class SmsFactory implements ISmsFactory { new AfricasTalkingSmsHandler(), new SendchampSmsHandler(), new ClicksendSmsHandler(), + new SimpletextingSmsHandler(), new NovuSmsHandler(), ]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e65b316e52..7361f2b5174 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2212,6 +2212,9 @@ importers: '@novu/shared': specifier: ^0.20.0 version: link:../../libs/shared + '@novu/simpletexting': + specifier: ^0.20.0 + version: link:../../providers/simpletexting '@novu/slack': specifier: ^0.20.0 version: link:../../providers/slack @@ -4977,6 +4980,49 @@ importers: specifier: ^4.9.5 version: 4.9.5 + providers/simpletexting: + dependencies: + '@novu/stateless': + specifier: 0.16.3 + version: 0.16.3 + axios: + specifier: ^1.5.1 + version: 1.5.1 + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: ~1.0.1 + version: 1.0.2(nyc@15.1.0) + '@types/jest': + specifier: ~27.5.2 + version: 27.5.2 + cspell: + specifier: ~6.19.2 + version: 6.19.2 + jest: + specifier: ~27.5.1 + version: 27.5.1(ts-node@10.9.1) + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + nyc: + specifier: ~15.1.0 + version: 15.1.0 + prettier: + specifier: ~2.8.0 + version: 2.8.7 + rimraf: + specifier: ~3.0.2 + version: 3.0.2 + ts-jest: + specifier: ~27.1.5 + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(jest@27.5.1)(typescript@4.9.5) + ts-node: + specifier: ~10.9.1 + version: 10.9.1(@types/node@14.18.42)(typescript@4.9.5) + typescript: + specifier: 4.9.5 + version: 4.9.5 + providers/slack: dependencies: '@novu/stateless': @@ -7103,11 +7149,6 @@ packages: '@babel/highlight': 7.22.13 chalk: 2.4.2 - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/compat-data@7.23.2: resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} engines: {node: '>=6.9.0'} @@ -7118,14 +7159,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.21.4 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.19.3) - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.16 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.19.3) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.22.19 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -7141,14 +7182,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.21.4 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.20.12) - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.16 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.20.12) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.22.19 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -7164,14 +7205,14 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.21.4 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.21.4) - '@babel/helpers': 7.21.0 - '@babel/parser': 7.22.16 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.21.4) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.22.19 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -7181,28 +7222,6 @@ packages: - supports-color dev: true - /@babel/core@7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.11) - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.16 - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.19 - convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} @@ -7225,14 +7244,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.21.3(@babel/core@7.22.11)(eslint@8.48.0): + /@babel/eslint-parser@7.21.3(@babel/core@7.23.2)(eslint@8.48.0): resolution: {integrity: sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.48.0 eslint-visitor-keys: 2.1.0 @@ -7243,30 +7262,11 @@ packages: resolution: {integrity: sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 - '@jridgewell/gen-mapping': 0.3.3 - jsesc: 2.5.2 - dev: true - - /@babel/generator@7.21.4: - resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 dev: true - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - /@babel/generator@7.23.0: resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} @@ -7280,14 +7280,14 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} @@ -7314,7 +7314,7 @@ packages: '@babel/core': 7.20.12 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.20.12) @@ -7332,7 +7332,7 @@ packages: '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.21.4) @@ -7341,24 +7341,6 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 - dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} engines: {node: '>=6.9.0'} @@ -7368,7 +7350,7 @@ packages: '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.22.15 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) @@ -7388,18 +7370,6 @@ packages: semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -7427,21 +7397,6 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.22.11): - resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2): resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==} peerDependencies: @@ -7460,13 +7415,6 @@ packages: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.22.19 - /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} @@ -7478,28 +7426,28 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.22.15: resolution: {integrity: sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-module-imports@7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 - /@babel/helper-module-transforms@7.22.20(@babel/core@7.19.3): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.19.3): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -7512,61 +7460,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.22.20(@babel/core@7.20.12): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.12 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-module-transforms@7.22.20(@babel/core@7.21.4): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-module-transforms@7.22.20(@babel/core@7.22.11): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - - /@babel/helper-module-transforms@7.22.20(@babel/core@7.23.2): - resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.20.12): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} @@ -7581,13 +7474,13 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.11): + /@babel/helper-module-transforms@7.23.0(@babel/core@7.21.4): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -7612,7 +7505,7 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} @@ -7632,7 +7525,7 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.20.12): @@ -7647,18 +7540,6 @@ packages: '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.22.11): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -7694,18 +7575,6 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.22.11): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.22.15 - '@babel/helper-optimise-call-expression': 7.22.5 - dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} @@ -7721,26 +7590,26 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} @@ -7763,30 +7632,9 @@ packages: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.22.5 - '@babel/template': 7.22.15 - '@babel/types': 7.22.19 - - /@babel/helpers@7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.19 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} - engines: {node: '>=6.9.0'} - dependencies: + '@babel/helper-function-name': 7.23.0 '@babel/template': 7.22.15 - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.19 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.23.0 /@babel/helpers@7.23.2: resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} @@ -7806,13 +7654,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.19 - /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -7830,16 +7671,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} @@ -7861,18 +7692,6 @@ packages: '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.20.12) dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.22.11) - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} engines: {node: '>=6.9.0'} @@ -7908,14 +7727,14 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -7931,32 +7750,32 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.22.11): + /@babel/plugin-proposal-decorators@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.22.11) + '@babel/plugin-syntax-decorators': 7.21.0(@babel/core@7.23.2) dev: true - /@babel/plugin-proposal-decorators@7.23.2(@babel/core@7.22.11): + /@babel/plugin-proposal-decorators@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.12): @@ -8014,15 +7833,15 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.12): @@ -8036,15 +7855,15 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.20.12): @@ -8053,7 +7872,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 + '@babel/compat-data': 7.23.2 '@babel/core': 7.20.12 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 @@ -8084,18 +7903,6 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} @@ -8118,14 +7925,14 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -8143,27 +7950,18 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.12) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.11): + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) - dev: true - - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) dev: true /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): @@ -8203,15 +8001,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -8229,12 +8018,12 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -8256,15 +8045,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -8283,16 +8063,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -8302,23 +8072,23 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.21.0(@babel/core@7.22.11): + /@babel/plugin-syntax-decorators@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.22.11): + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -8331,15 +8101,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -8357,15 +8118,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -8374,16 +8126,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} @@ -8404,16 +8146,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} @@ -8423,16 +8155,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} @@ -8451,15 +8173,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -8486,15 +8199,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -8513,16 +8217,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -8551,15 +8245,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -8586,15 +8271,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -8621,15 +8297,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -8656,15 +8323,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -8691,15 +8349,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -8726,15 +8375,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -8753,16 +8393,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -8792,16 +8422,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -8811,8 +8431,8 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.21.4): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8821,44 +8441,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.11): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.23.2): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -8882,16 +8471,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} @@ -8901,19 +8480,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.22.11): - resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.11) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==} engines: {node: '>=6.9.0'} @@ -8950,18 +8516,6 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.20.12) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} @@ -8983,16 +8537,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} @@ -9012,16 +8556,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} engines: {node: '>=6.9.0'} @@ -9031,17 +8565,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} @@ -9052,18 +8575,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} engines: {node: '>=6.9.0'} @@ -9085,7 +8596,7 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.20.12) @@ -9093,24 +8604,6 @@ packages: globals: 11.12.0 dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} engines: {node: '>=6.9.0'} @@ -9121,7 +8614,7 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) @@ -9139,17 +8632,6 @@ packages: '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} @@ -9170,16 +8652,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} engines: {node: '>=6.9.0'} @@ -9200,17 +8672,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} @@ -9231,16 +8692,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} @@ -9250,17 +8701,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} engines: {node: '>=6.9.0'} @@ -9282,17 +8722,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} @@ -9303,17 +8732,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} engines: {node: '>=6.9.0'} @@ -9324,26 +8742,15 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.22.11): + /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) - dev: true - - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) dev: true /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): @@ -9367,16 +8774,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} engines: {node: '>=6.9.0'} @@ -9394,19 +8791,7 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -9418,20 +8803,9 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.22.5 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} engines: {node: '>=6.9.0'} @@ -9452,16 +8826,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} @@ -9471,17 +8835,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} engines: {node: '>=6.9.0'} @@ -9502,16 +8855,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} @@ -9532,17 +8875,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} engines: {node: '>=6.9.0'} @@ -9553,18 +8885,6 @@ packages: '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: true - /@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==} engines: {node: '>=6.9.0'} @@ -9572,7 +8892,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.23.2) + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true @@ -9589,18 +8909,6 @@ packages: '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} engines: {node: '>=6.9.0'} @@ -9625,19 +8933,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} engines: {node: '>=6.9.0'} @@ -9661,17 +8956,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} @@ -9693,17 +8977,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} @@ -9724,16 +8997,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} @@ -9743,17 +9006,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} engines: {node: '>=6.9.0'} @@ -9764,17 +9016,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} engines: {node: '>=6.9.0'} @@ -9785,20 +9026,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} engines: {node: '>=6.9.0'} @@ -9823,17 +9050,6 @@ packages: '@babel/helper-replace-supers': 7.22.20(@babel/core@7.20.12) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} @@ -9844,17 +9060,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} engines: {node: '>=6.9.0'} @@ -9877,18 +9082,6 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.12) dev: true - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} engines: {node: '>=6.9.0'} @@ -9910,16 +9103,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} engines: {node: '>=6.9.0'} @@ -9929,17 +9112,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} @@ -9950,19 +9122,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2): resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} engines: {node: '>=6.9.0'} @@ -9985,16 +9144,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} @@ -10004,13 +9153,13 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.22.11): + /@babel/plugin-transform-react-constant-elements@7.21.3(@babel/core@7.23.2): resolution: {integrity: sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -10023,16 +9172,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} @@ -10053,16 +9192,6 @@ packages: '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -10104,21 +9233,7 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/types': 7.22.19 - dev: true - - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2): @@ -10132,7 +9247,7 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.23.2): @@ -10146,17 +9261,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} @@ -10179,17 +9283,6 @@ packages: regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} @@ -10210,16 +9303,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} @@ -10246,23 +9329,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.22.11): - resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.11) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.22.11) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.11) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-runtime@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==} engines: {node: '>=6.9.0'} @@ -10289,16 +9355,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} @@ -10319,17 +9375,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} @@ -10350,16 +9395,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} @@ -10379,16 +9414,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} @@ -10408,16 +9433,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} @@ -10437,20 +9452,7 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - dev: true - - /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.22.11): - resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.11) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.21.4) dev: true /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.23.2): @@ -10463,20 +9465,20 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.22.11): + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) dev: true /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.20.12): @@ -10489,16 +9491,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} @@ -10508,17 +9500,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} @@ -10540,17 +9521,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} @@ -10561,17 +9531,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.22.11) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} @@ -10596,7 +9555,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 + '@babel/compat-data': 7.23.2 '@babel/core': 7.20.12 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 @@ -10666,7 +9625,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.20.12) '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.20.12) '@babel/preset-modules': 0.1.5(@babel/core@7.20.12) - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.12) babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.12) babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.12) @@ -10676,97 +9635,6 @@ packages: - supports-color dev: true - /@babel/preset-env@7.23.2(@babel/core@7.22.11): - resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.22.11) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.11) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.11) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.11) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.11) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.11) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.22.11) - babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.22.11) - babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.22.11) - core-js-compat: 3.32.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-env@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==} engines: {node: '>=6.9.0'} @@ -10857,18 +9725,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-flow@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.11) - dev: true - /@babel/preset-flow@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} engines: {node: '>=6.9.0'} @@ -10894,17 +9750,6 @@ packages: esutils: 2.0.3 dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 - esutils: 2.0.3 - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: @@ -10930,21 +9775,6 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.23.2) dev: true - /@babel/preset-react@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.11) - dev: true - /@babel/preset-react@7.22.15(@babel/core@7.23.2): resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} engines: {node: '>=6.9.0'} @@ -10960,20 +9790,6 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.21.4(@babel/core@7.22.11): - resolution: {integrity: sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.22.11) - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.22.11) - dev: true - /@babel/preset-typescript@7.21.4(@babel/core@7.23.2): resolution: {integrity: sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==} engines: {node: '>=6.9.0'} @@ -10988,27 +9804,27 @@ packages: '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.23.2) dev: true - /@babel/preset-typescript@7.23.2(@babel/core@7.22.11): + /@babel/preset-typescript@7.23.2(@babel/core@7.23.2): resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.22.11) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) dev: true - /@babel/register@7.21.0(@babel/core@7.22.11): + /@babel/register@7.21.0(@babel/core@7.23.2): resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -11050,8 +9866,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true /@babel/template@7.22.15: @@ -11059,43 +9875,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - - /@babel/traverse@7.21.4: - resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/traverse@7.22.11: - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} @@ -11114,14 +9895,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.22.19: - resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} @@ -14028,7 +12801,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -14051,7 +12824,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -15134,7 +13907,7 @@ packages: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.9 + node-fetch: 2.7.0 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -16365,7 +15138,7 @@ packages: dependencies: chalk: 4.1.2 consola: 2.15.3 - node-fetch: 2.6.9 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -16458,20 +15231,20 @@ packages: verdaccio: optional: true dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.22.11) - '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.22.11) - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/preset-typescript': 7.23.2(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 '@nrwl/js': 16.10.0(@types/node@16.11.7)(nx@16.10.0)(typescript@4.9.5) '@nx/devkit': 16.10.0(nx@16.10.0) '@nx/workspace': 16.10.0 '@phenomnomnominal/tsquery': 5.0.1(typescript@4.9.5) - babel-plugin-const-enum: 1.2.0(@babel/core@7.22.11) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.2) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.11) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.2) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.5.1 @@ -16508,20 +15281,20 @@ packages: verdaccio: optional: true dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.22.11) - '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.22.11) - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/preset-typescript': 7.23.2(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 '@nrwl/js': 16.10.0(@types/node@16.11.7)(nx@16.10.0)(typescript@5.1.6) '@nx/devkit': 16.10.0(nx@16.10.0) '@nx/workspace': 16.10.0 '@phenomnomnominal/tsquery': 5.0.1(typescript@5.1.6) - babel-plugin-const-enum: 1.2.0(@babel/core@7.22.11) + babel-plugin-const-enum: 1.2.0(@babel/core@7.23.2) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.11) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.2) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.5.1 @@ -18833,7 +17606,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.2)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -18844,7 +17617,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -21502,7 +20275,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@storybook/addons': 7.4.2(react-dom@17.0.2)(react@17.0.2) '@storybook/channels': 7.4.2 '@storybook/client-api': 7.4.2 @@ -21522,7 +20295,7 @@ packages: '@swc/core': 1.3.49 '@types/node': 16.11.7 '@types/semver': 7.3.13 - babel-loader: 9.1.2(@babel/core@7.22.11)(webpack@5.78.0) + babel-loader: 9.1.2(@babel/core@7.23.2)(webpack@5.78.0) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -21570,7 +20343,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@storybook/addons': 7.4.2(react-dom@17.0.2)(react@17.0.2) '@storybook/channels': 7.4.2 '@storybook/client-api': 7.4.2 @@ -21590,7 +20363,7 @@ packages: '@swc/core': 1.3.49 '@types/node': 16.11.7 '@types/semver': 7.3.13 - babel-loader: 9.1.2(@babel/core@7.22.11)(webpack@5.78.0) + babel-loader: 9.1.2(@babel/core@7.23.2)(webpack@5.78.0) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -21653,9 +20426,9 @@ packages: resolution: {integrity: sha512-WleObtC7OU2lT+pI2vTdXZPFMKDGbg3bkUJ+PG8+yqGg53ea5ZkwKWg9qHpXuiMkYDztqhbA8kYrny1GqFuVdg==} hasBin: true dependencies: - '@babel/core': 7.22.11 - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/types': 7.22.19 + '@babel/core': 7.23.2 + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/types': 7.23.0 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.4.2 '@storybook/core-common': 7.4.2 @@ -21722,9 +20495,9 @@ packages: /@storybook/codemod@7.4.2: resolution: {integrity: sha512-wU+SLHG/PpLptI0aWEhPxwFPcX7uYe+Id21DKNPg/HvYaLG3N+/DPDef+lm3Vaov9w4OD74iuQ3knT67SSkvmw==} dependencies: - '@babel/core': 7.22.11 - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/types': 7.22.19 + '@babel/core': 7.23.2 + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/types': 7.23.0 '@storybook/csf': 0.1.1 '@storybook/csf-tools': 7.4.2 '@storybook/node-logger': 7.4.2 @@ -21932,9 +20705,9 @@ packages: /@storybook/csf-tools@7.4.2: resolution: {integrity: sha512-5AvF2YRcYHIqQqskb3R8JvsmSWnNwkP0CGmP8Zq7zIfK/C+npKb/onv5YQlbSgh+2UrVxVdIDLc9AepBeXC3uQ==} dependencies: - '@babel/generator': 7.22.10 - '@babel/parser': 7.22.16 - '@babel/traverse': 7.22.11 + '@babel/generator': 7.23.0 + '@babel/parser': 7.23.0 + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 '@storybook/csf': 0.1.1 '@storybook/types': 7.4.2 @@ -22481,7 +21254,7 @@ packages: resolution: {integrity: sha512-OOJ2TeS3Zzc6spHbdH+JXml0q4IHuYt9axmXAv1/pkhqHjA5072pyUacmlYNQeihpQOOsKLiCQUQlvtMy9fTnQ==} dependencies: '@storybook/channels': 7.4.2 - '@types/babel__core': 7.20.0 + '@types/babel__core': 7.20.3 '@types/express': 4.17.17 file-system-cache: 2.3.0 @@ -22489,7 +21262,7 @@ packages: resolution: {integrity: sha512-ZcMSaqFNx1E+G00nRDUi8kKL7gxJVlnCvbKLNj3V85guy4DkIYAZr31yDqze07gDWbjvKoHIp3tKpgE+2i8upQ==} dependencies: '@storybook/channels': 7.5.1 - '@types/babel__core': 7.20.0 + '@types/babel__core': 7.20.3 '@types/express': 4.17.17 file-system-cache: 2.3.0 dev: true @@ -22579,7 +21352,7 @@ packages: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -22600,10 +21373,10 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.22.11) - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/preset-react': 7.22.15(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-constant-elements': 7.21.3(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -22945,37 +21718,37 @@ packages: /@types/babel__core@7.20.0: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 + dev: true /@types/babel__core@7.20.3: resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@babel/types': 7.23.0 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 - dev: true /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 /@types/babel__traverse@7.18.3: resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@types/bcrypt@3.0.1: resolution: {integrity: sha512-SwBrq5wb6jXP0o3O3jStdPWbKpimTImfdFD/OZE3uW+jhGpds/l5wMX9lfYOTDOa5Bod2QmOgo9ln+tMp2XP/w==} @@ -24503,8 +23276,8 @@ packages: '@babel/helper-module-imports': 7.22.15 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) '@babel/template': 7.22.15 - '@babel/traverse': 7.21.4 - '@babel/types': 7.22.19 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 '@vue/babel-helper-vue-transform-on': 1.0.2 camelcase: 6.3.0 html-tags: 3.3.1 @@ -24517,7 +23290,7 @@ packages: /@vue/compiler-core@3.2.47: resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/shared': 3.2.47 estree-walker: 2.0.2 source-map: 0.6.1 @@ -24547,7 +23320,7 @@ packages: /@vue/compiler-sfc@3.2.47: resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.2.47 '@vue/compiler-dom': 3.2.47 '@vue/compiler-ssr': 3.2.47 @@ -24619,7 +23392,7 @@ packages: /@vue/reactivity-transform@3.2.47: resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.2.47 '@vue/shared': 3.2.47 estree-walker: 2.0.2 @@ -26126,18 +24899,28 @@ packages: transitivePeerDependencies: - debug + /axios@1.5.1: + resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: deep-equal: 2.2.0 dev: true - /babel-core@7.0.0-bridge.0(@babel/core@7.22.11): + /babel-core@7.0.0-bridge.0(@babel/core@7.23.2): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 dev: true /babel-jest@27.5.1(@babel/core@7.21.4): @@ -26159,18 +24942,18 @@ packages: - supports-color dev: true - /babel-jest@27.5.1(@babel/core@7.22.11): + /babel-jest@27.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.22.11) + babel-preset-jest: 27.5.1(@babel/core@7.23.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -26178,17 +24961,17 @@ packages: - supports-color dev: true - /babel-jest@29.5.0(@babel/core@7.22.11): + /babel-jest@29.5.0(@babel/core@7.23.2): resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/transform': 29.5.0 - '@types/babel__core': 7.20.0 + '@types/babel__core': 7.20.3 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.22.11) + babel-preset-jest: 29.5.0(@babel/core@7.23.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -26254,14 +25037,14 @@ packages: webpack: 5.76.1(esbuild@0.17.8) dev: true - /babel-loader@9.1.2(@babel/core@7.22.11)(webpack@5.78.0): + /babel-loader@9.1.2(@babel/core@7.23.2)(webpack@5.78.0): resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 find-cache-dir: 3.3.2 schema-utils: 4.0.0 webpack: 5.78.0(@swc/core@1.3.49)(esbuild@0.18.20)(webpack-cli@5.1.4) @@ -26271,15 +25054,15 @@ packages: resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} dev: true - /babel-plugin-const-enum@1.2.0(@babel/core@7.22.11): + /babel-plugin-const-enum@1.2.0(@babel/core@7.23.2): resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.11) - '@babel/traverse': 7.22.11 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 transitivePeerDependencies: - supports-color dev: true @@ -26307,8 +25090,8 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.22.19 - '@types/babel__core': 7.20.0 + '@babel/types': 7.23.0 + '@types/babel__core': 7.20.3 '@types/babel__traverse': 7.18.3 dev: true @@ -26318,7 +25101,7 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 - '@types/babel__core': 7.20.0 + '@types/babel__core': 7.20.3 '@types/babel__traverse': 7.18.3 dev: true @@ -26355,7 +25138,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 + '@babel/compat-data': 7.23.2 '@babel/core': 7.20.12 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.12) semver: 6.3.1 @@ -26363,19 +25146,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.22.11): - resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2): resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==} peerDependencies: @@ -26400,18 +25170,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.22.11): - resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) - core-js-compat: 3.32.2 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2): resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==} peerDependencies: @@ -26434,17 +25192,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.22.11): - resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.22.11) - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2): resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==} peerDependencies: @@ -26469,7 +25216,7 @@ packages: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} dev: true - /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.22.11): + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.2): resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} peerDependencies: '@babel/core': ^7 @@ -26478,7 +25225,7 @@ packages: '@babel/traverse': optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -26502,24 +25249,24 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.11): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) dev: true /babel-preset-jest@27.5.1(@babel/core@7.21.4): @@ -26533,45 +25280,45 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) dev: true - /babel-preset-jest@27.5.1(@babel/core@7.22.11): + /babel-preset-jest@27.5.1(@babel/core@7.23.2): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) dev: true - /babel-preset-jest@29.5.0(@babel/core@7.22.11): + /babel-preset-jest@29.5.0(@babel/core@7.23.2): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) dev: true /babel-preset-react-app@10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.22.11) - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/preset-react': 7.22.15(@babel/core@7.22.11) - '@babel/preset-typescript': 7.21.4(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.2(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-react': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.21.4(@babel/core@7.23.2) '@babel/runtime': 7.23.2 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 @@ -30609,8 +29356,8 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.22.11 - '@babel/eslint-parser': 7.21.3(@babel/core@7.22.11)(eslint@8.48.0) + '@babel/core': 7.23.2 + '@babel/eslint-parser': 7.21.3(@babel/core@7.23.2)(eslint@8.48.0) '@rushstack/eslint-patch': 1.2.0 '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.48.0)(typescript@4.9.5) '@typescript-eslint/parser': 5.58.0(eslint@8.48.0)(typescript@4.9.5) @@ -30925,7 +29672,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 - semver: 6.3.0 + semver: 6.3.1 dev: true /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.38.0)(prettier@2.8.7): @@ -31345,8 +30092,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.22.11 - '@babel/types': 7.22.19 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 c8: 7.13.0 transitivePeerDependencies: - supports-color @@ -34991,7 +33738,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -35003,8 +33750,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.11 - '@babel/parser': 7.22.16 + '@babel/core': 7.23.2 + '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -35261,10 +34008,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.22.11) + babel-jest: 27.5.1(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -35305,11 +34052,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 14.18.42 - babel-jest: 29.5.0(@babel/core@7.22.11) + babel-jest: 29.5.0(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -35345,11 +34092,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 16.11.7 - babel-jest: 29.5.0(@babel/core@7.22.11) + babel-jest: 29.5.0(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -35385,11 +34132,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0(@babel/core@7.22.11) + babel-jest: 29.5.0(@babel/core@7.23.2) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -35953,16 +34700,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.22.11 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.11) - '@babel/traverse': 7.22.11 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -35983,18 +34730,18 @@ packages: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.11 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.11) - '@babel/traverse': 7.22.11 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 '@jest/expect-utils': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.3 '@types/prettier': 2.7.2 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.11 @@ -36314,17 +35061,17 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.22.11 - '@babel/parser': 7.22.16 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) - '@babel/preset-flow': 7.22.15(@babel/core@7.22.11) - '@babel/preset-typescript': 7.23.2(@babel/core@7.22.11) - '@babel/register': 7.21.0(@babel/core@7.22.11) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2) + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) + '@babel/preset-flow': 7.22.15(@babel/core@7.23.2) + '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) + '@babel/register': 7.21.0(@babel/core@7.23.2) + babel-core: 7.0.0-bridge.0(@babel/core@7.23.2) chalk: 4.1.2 flow-parser: 0.216.1 graceful-fs: 4.2.11 @@ -36344,7 +35091,7 @@ packages: hasBin: true requiresBuild: true dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@jsdoc/salty': 0.2.5 '@types/markdown-it': 12.2.3 bluebird: 3.7.2 @@ -39288,6 +38035,7 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: false /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -39447,7 +38195,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: hosted-git-info: 5.2.1 - is-core-module: 2.12.0 + is-core-module: 2.13.0 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -39457,7 +38205,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.12.0 + is-core-module: 2.13.0 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -43280,8 +42028,8 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.22.11 - '@babel/generator': 7.22.10 + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 '@babel/runtime': 7.21.0 ast-types: 0.14.2 commander: 2.20.3 @@ -44677,7 +43425,7 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -44831,7 +43579,7 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.21.4 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 @@ -49803,10 +48551,10 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) - '@babel/core': 7.22.11 - '@babel/preset-env': 7.23.2(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/preset-env': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 diff --git a/providers/simpletexting/.czrc b/providers/simpletexting/.czrc new file mode 100644 index 00000000000..d1bcc209ca1 --- /dev/null +++ b/providers/simpletexting/.czrc @@ -0,0 +1,3 @@ +{ + "path": "cz-conventional-changelog" +} diff --git a/providers/simpletexting/.eslintrc.json b/providers/simpletexting/.eslintrc.json new file mode 100644 index 00000000000..ec40100be69 --- /dev/null +++ b/providers/simpletexting/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc.js" +} diff --git a/providers/simpletexting/.gitignore b/providers/simpletexting/.gitignore new file mode 100644 index 00000000000..963d5292865 --- /dev/null +++ b/providers/simpletexting/.gitignore @@ -0,0 +1,9 @@ +.idea/* +.nyc_output +build +node_modules +test +src/**.js +coverage +*.log +package-lock.json diff --git a/providers/simpletexting/README.md b/providers/simpletexting/README.md new file mode 100644 index 00000000000..3364e516058 --- /dev/null +++ b/providers/simpletexting/README.md @@ -0,0 +1,14 @@ +# Novu Simpletexting Provider + +A Simpletexting sms provider library for [@novu/node](https://github.com/novuhq/novu) + +## Usage + +```javascript +import { SimpletextingSmsProvider } from '@novu/simpletexting'; + +const provider = new SimpletextingSmsProvider({ + apiKey: process.env.SIMPLETEXTING_API_KEY, + from: process.env.SENDER_PHONE + }); +``` diff --git a/providers/simpletexting/jest.config.js b/providers/simpletexting/jest.config.js new file mode 100644 index 00000000000..61faa20934a --- /dev/null +++ b/providers/simpletexting/jest.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + moduleNameMapper: { + axios: 'axios/dist/node/axios.cjs', + }, +}; diff --git a/providers/simpletexting/package.json b/providers/simpletexting/package.json new file mode 100644 index 00000000000..6020d3edd46 --- /dev/null +++ b/providers/simpletexting/package.json @@ -0,0 +1,78 @@ +{ + "name": "@novu/simpletexting", + "version": "0.20.0", + "description": "A simpletexting wrapper for novu", + "main": "build/main/index.js", + "typings": "build/main/index.d.ts", + "module": "build/module/index.js", + "private": false, + "repository": "https://github.com/novuhq/novu", + "license": "MIT", + "keywords": [], + "scripts": { + "prebuild": "rimraf build", + "build": "run-p build:*", + "build:main": "tsc -p tsconfig.json", + "build:module": "tsc -p tsconfig.module.json", + "fix": "run-s fix:*", + "fix:prettier": "prettier \"src/**/*.ts\" --write", + "fix:lint": "eslint src --ext .ts --fix", + "test": "run-s test:*", + "lint": "eslint src --ext .ts", + "test:unit": "jest src", + "watch:build": "tsc -p tsconfig.json -w", + "watch:test": "jest src --watch", + "reset-hard": "git clean -dfx && git reset --hard && yarn", + "prepare-release": "run-s reset-hard test" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@novu/stateless": "0.16.3", + "axios": "^1.5.1" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "~1.0.1", + "@types/jest": "~27.5.2", + "cspell": "~6.19.2", + "jest": "~27.5.1", + "npm-run-all": "^4.1.5", + "nyc": "~15.1.0", + "prettier": "~2.8.0", + "rimraf": "~3.0.2", + "ts-jest": "~27.1.5", + "ts-node": "~10.9.1", + "typescript": "4.9.5" + }, + "files": [ + "build/main", + "build/module", + "!**/*.spec.*", + "!**/*.json", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "ava": { + "failFast": true, + "timeout": "60s", + "typescript": { + "rewritePaths": { + "src/": "build/main/" + } + }, + "files": [ + "!build/module/**" + ] + }, + "prettier": { + "singleQuote": true + }, + "nyc": { + "extends": "@istanbuljs/nyc-config-typescript", + "exclude": [ + "**/*.spec.js" + ] + } +} diff --git a/providers/simpletexting/src/index.ts b/providers/simpletexting/src/index.ts new file mode 100644 index 00000000000..aa49ad66744 --- /dev/null +++ b/providers/simpletexting/src/index.ts @@ -0,0 +1 @@ +export * from './lib/simpletexting.provider'; diff --git a/providers/simpletexting/src/lib/simpletexting.provider.spec.ts b/providers/simpletexting/src/lib/simpletexting.provider.spec.ts new file mode 100644 index 00000000000..f57e35598a2 --- /dev/null +++ b/providers/simpletexting/src/lib/simpletexting.provider.spec.ts @@ -0,0 +1,43 @@ +import { SimpletextingSmsProvider } from './simpletexting.provider'; +import axios from 'axios'; + +jest.mock('axios'); +const mockedAxios = axios as jest.Mocked; + +test('should trigger SimpletextingSmsProvider library correctly', async () => { + const provider = new SimpletextingSmsProvider({ + apiKey: '', + accountPhone: '', + }); + + mockedAxios.post.mockResolvedValue({ + data: { + id: '12345-67a8', + }, + }); + + const response = await provider.sendMessage({ + to: '+12345678902', + content: 'test message', + }); + + expect(mockedAxios.post).toHaveBeenCalled(); + + expect(mockedAxios.post).toHaveBeenCalledWith( + 'https://api-app2.simpletexting.com/v2/api/messages', + { + contactPhone: '+12345678902', + accountPhone: '', + mode: 'SINGLE_SMS_STRICTLY', + text: 'test message', + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer `, + }, + } + ); + + expect(response).toHaveProperty('id'); +}); diff --git a/providers/simpletexting/src/lib/simpletexting.provider.ts b/providers/simpletexting/src/lib/simpletexting.provider.ts new file mode 100644 index 00000000000..41a0c80e665 --- /dev/null +++ b/providers/simpletexting/src/lib/simpletexting.provider.ts @@ -0,0 +1,44 @@ +import { + ChannelTypeEnum, + ISendMessageSuccessResponse, + ISmsOptions, + ISmsProvider, +} from '@novu/stateless'; +import axios from 'axios'; + +export class SimpletextingSmsProvider implements ISmsProvider { + id = 'simpletexting'; + channelType = ChannelTypeEnum.SMS as ChannelTypeEnum.SMS; + + constructor( + private config: { + apiKey: string; + accountPhone: string; + } + ) {} + + async sendMessage( + options: ISmsOptions + ): Promise { + const response = await axios.post( + 'https://api-app2.simpletexting.com/v2/api/messages', + { + contactPhone: options.to, + accountPhone: this.config.accountPhone, + mode: 'SINGLE_SMS_STRICTLY', + text: options.content, + }, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${this.config.apiKey}`, + }, + } + ); + + return { + id: response.data.id, + date: new Date().toISOString(), + }; + } +} diff --git a/providers/simpletexting/tsconfig.json b/providers/simpletexting/tsconfig.json new file mode 100644 index 00000000000..5b8120fea36 --- /dev/null +++ b/providers/simpletexting/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "build/main", + "rootDir": "src", + "types": ["node", "jest"] + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules/**"] +} diff --git a/providers/simpletexting/tsconfig.module.json b/providers/simpletexting/tsconfig.module.json new file mode 100644 index 00000000000..79be3a5c40b --- /dev/null +++ b/providers/simpletexting/tsconfig.module.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "target": "esnext", + "outDir": "build/module", + "module": "esnext" + }, + "exclude": ["node_modules/**"] +} From ea2a0f4711db90b4d554434b6e4d06fbafdec245 Mon Sep 17 00:00:00 2001 From: praxter11 Date: Sun, 29 Oct 2023 22:15:40 +0530 Subject: [PATCH 2/7] fix: merge conflicts --- .cspell.json | 8 +- README.md | 4 +- SECURITY.md | 53 +- apps/api/README.md | 82 +- apps/api/e2e/idempotency.e2e.ts | 307 +++++++ apps/api/package.json | 14 +- apps/api/src/.env.development | 2 + apps/api/src/.env.production | 2 + apps/api/src/.env.test | 3 +- apps/api/src/app.module.ts | 8 +- .../e2e/get-grouped-blueprints.e2e.ts | 13 +- .../api/src/app/change/e2e/get-changes.e2e.ts | 12 +- .../src/app/change/e2e/promote-changes.e2e.ts | 54 +- .../app/events/e2e/send-message-push.e2e.ts | 4 +- .../src/app/events/e2e/trigger-event.e2e.ts | 69 +- .../app/integrations/dtos/credentials.dto.ts | 30 + .../e2e/create-integration.e2e.ts | 10 +- .../e2e/deactivate-integration.e2e.ts | 14 +- .../e2e/get-active-integration.e2e.ts | 8 +- .../e2e/get-decrypted-integrations.e2e.ts | 7 - .../integrations/e2e/get-integration.e2e.ts | 7 - .../e2e/remove-integration.e2e.ts | 7 - .../e2e/set-itegration-as-primary.e2e.ts | 7 - .../e2e/update-integration.e2e.ts | 7 - .../create-integration.usecase.ts | 37 +- .../deactivate-integration.command.ts | 11 - .../deactivate-integration.usecase.ts | 40 - .../disable-novu-integration.command.ts | 13 - .../disable-novu-integration.usecase.ts | 32 - .../src/app/integrations/usecases/index.ts | 4 - .../remove-integration.usecase.ts | 23 +- .../set-integration-as-primary.usecase.ts | 20 +- .../update-integration.usecase.ts | 33 +- .../organization/dtos/member-response.dto.ts | 78 ++ .../dtos/organization-response.dto.ts | 56 ++ .../organization/organization.controller.ts | 62 +- .../app/organization/organization.module.ts | 5 +- .../get-members/get-members.usecase.ts | 4 +- .../framework/idempotency.interceptor.ts | 247 ++++++ .../shared/helpers/content.service.spec.ts | 6 +- apps/api/src/app/shared/shared.module.ts | 2 - .../src/app/testing/dtos/idempotency.dto.ts | 3 + .../api/src/app/testing/testing.controller.ts | 30 +- ...date-subscriber-preference-response.dto.ts | 108 ++- .../e2e/get-subscriber-preference.e2e.ts | 5 + .../e2e/create-notification-templates.e2e.ts | 10 +- apps/api/src/bootstrap.ts | 3 +- apps/api/src/types/env.d.ts | 1 + apps/inbound-mail/package.json | 8 +- apps/web/Dockerfile | 3 +- .../cypress/tests/integration-store.spec.ts | 225 ----- .../tests/integrations-list-modal.spec.ts | 1 - .../tests/integrations-list-page.spec.ts | 1 - apps/web/package.json | 16 +- .../images/providers/dark/bandwidth.png | Bin 0 -> 52502 bytes .../images/providers/dark/generic-sms.svg | 1 + .../images/providers/dark/messagebird.png | Bin 0 -> 17841 bytes .../static/images/providers/dark/pushpad.svg | 1 + .../images/providers/dark/simpletexting.png | Bin 21083 -> 15414 bytes .../providers/dark/square/generic-sms.svg | 1 + .../images/providers/dark/square/pushpad.svg | 1 + .../images/providers/light/bandwidth.png | Bin 0 -> 52502 bytes .../images/providers/light/generic-sms.svg | 1 + .../images/providers/light/messagebird.png | Bin 0 -> 17841 bytes .../static/images/providers/light/pushpad.svg | 1 + .../images/providers/light/simpletexting.png | Bin 42874 -> 38062 bytes .../providers/light/square/generic-sms.svg | 1 + .../images/providers/light/square/pushpad.svg | 1 + .../src/components/conditions/Conditions.tsx | 24 +- .../ExecutionDetailsConditionItem.cy.tsx | 4 +- .../ExecutionDetailsConditions.cy.tsx | 8 +- apps/web/src/config/index.ts | 9 - .../integrations/useGetPrimaryIntegration.ts | 9 +- apps/web/src/hooks/useFeatureFlags.ts | 18 +- .../integrations/IntegrationsListPage.tsx | 7 +- .../integrations/IntegrationsStoreModal.tsx | 306 ------- .../integrations/IntegrationsStorePage.tsx | 128 --- .../multi-provider/sort-providers.ts | 2 + .../useSelectPrimaryIntegrationModal.tsx | 7 +- .../src/pages/integrations/useProviders.ts | 48 +- .../pages/quick-start/steps/GetStarted.tsx | 22 +- .../components/LackIntegrationAlert.tsx | 22 +- .../templates/components/ListProviders.tsx | 18 +- .../templates/components/ProvidersPage.tsx | 24 +- .../email-editor/EmailContentCard.tsx | 11 +- .../src/pages/templates/editor/Preview.tsx | 11 +- .../pages/templates/filter/FilterModal.tsx | 28 +- .../src/pages/templates/filter/Filters.cy.tsx | 23 +- .../src/pages/templates/filter/Filters.tsx | 18 +- .../templates/filter/OnlineFiltersForms.tsx | 9 +- .../workflow/node-types/WorkflowNode.tsx | 23 +- apps/webhook/package.json | 12 +- apps/widget/package.json | 14 +- .../NotificationCenterWidget.tsx | 6 + apps/worker/README.md | 2 +- apps/worker/package.json | 12 +- apps/worker/src/.env.test | 2 - apps/worker/src/app/shared/shared.module.ts | 2 - .../message-matcher.usecase.spec.ts | 147 ++-- .../message-matcher.usecase.ts | 12 +- apps/ws/package.json | 10 +- docker/kubernetes/helm/values.yaml | 5 + .../kubernetes/kustomize/api-deployment.yaml | 2 +- .../kustomize/embed-deployment.yaml | 2 +- .../kubernetes/kustomize/web-deployment.yaml | 2 +- .../kustomize/widget-deployment.yaml | 2 +- .../kustomize/worker-deployment.yaml | 2 +- .../kubernetes/kustomize/ws-deployment.yaml | 2 +- docker/local/deployment/docker-compose.yml | 12 +- lerna.json | 2 +- libs/dal/package.json | 4 +- .../integration/integration.schema.ts | 6 + .../notification-template.entity.ts | 24 +- .../organization/organization.entity.ts | 5 + libs/design-system/package.json | 11 +- libs/design-system/src/sidebar/Sidebar.tsx | 2 +- libs/embed/package.json | 4 +- libs/embed/src/embed.ts | 5 + libs/shared/package.json | 2 +- .../src/consts/providers/channels/push.ts | 10 +- .../src/consts/providers/channels/sms.ts | 28 + .../credentials/provider-credentials.ts | 129 +++ .../src/consts/providers/provider.enum.ts | 11 + .../integration/credential.interface.ts | 7 + .../subscriber-preference.interface.ts | 2 + .../shared/src/types/builder/builder.types.ts | 55 +- libs/shared/src/types/feature-flags/index.ts | 1 - libs/testing/package.json | 6 +- novu.code-workspace | 4 + packages/application-generic/package.json | 106 +-- .../src/custom-providers/index.ts | 15 - .../src/factories/push/handlers/index.ts | 1 + .../push/handlers/pushpad.handler.ts | 20 + .../src/factories/push/push.factory.ts | 2 + .../sms/handlers/bandwidth.handler.ts | 19 + .../sms/handlers/generic-sms.handler.ts | 25 + .../src/factories/sms/handlers/index.ts | 3 + .../sms/handlers/messagebird.handler.ts | 14 + .../src/factories/sms/sms.factory.ts | 6 + .../src/services/cache/cache-service.spec.ts | 10 + .../src/services/cache/cache.service.ts | 16 + .../get-decrypted-integrations.usecase.ts | 22 +- .../get-feature-flag/get-feature-flag.test.ts | 48 -- ...provider-configuration-enabled.use-case.ts | 27 - .../src/usecases/get-feature-flag/index.ts | 1 - ...-subscriber-template-preference.usecase.ts | 2 + .../select-integration.spec.ts | 12 +- .../select-integration.usecase.ts | 36 +- .../application-generic/src/utils/filter.ts | 21 +- packages/cli/README.MD | 2 +- packages/cli/package.json | 4 +- packages/client/package.json | 4 +- packages/headless/package.json | 8 +- packages/nest/package.json | 4 +- packages/node/README.md | 6 +- packages/node/package.json | 4 +- .../src/lib/integrations/integrations.spec.ts | 30 +- .../notification-center-angular/package.json | 4 +- .../notification-center-angular/package.json | 4 +- packages/notification-center-vue/package.json | 4 +- packages/notification-center/package.json | 8 +- packages/notification-center/src/i18n/lang.ts | 5 +- .../src/i18n/languages/ka.ts | 15 + packages/stateless/package.json | 2 +- pnpm-lock.yaml | 791 ++++++++++++------ providers/africas-talking/package.json | 4 +- providers/apns/package.json | 4 +- providers/bandwidth/.czrc | 3 + providers/bandwidth/.eslintrc.json | 3 + providers/bandwidth/.gitignore | 9 + providers/bandwidth/README.md | 15 + providers/bandwidth/jest.config.js | 5 + providers/bandwidth/package.json | 78 ++ providers/bandwidth/src/index.ts | 1 + .../src/lib/bandwidth.provider.spec.ts | 36 + .../bandwidth/src/lib/bandwidth.provider.ts | 48 ++ providers/bandwidth/tsconfig.json | 10 + providers/bandwidth/tsconfig.module.json | 9 + providers/burst-sms/package.json | 4 +- providers/clickatell/package.json | 4 +- providers/clicksend/package.json | 2 +- providers/discord/package.json | 4 +- providers/email-webhook/package.json | 2 +- providers/emailjs/package.json | 4 +- providers/expo/package.json | 4 +- providers/fcm/package.json | 4 +- providers/fcm/src/lib/fcm.provider.spec.ts | 3 + providers/fcm/src/lib/fcm.provider.ts | 7 +- providers/firetext/package.json | 4 +- providers/forty-six-elks/package.json | 4 +- providers/generic-sms/.czrc | 3 + providers/generic-sms/.eslintrc.json | 3 + providers/generic-sms/.gitignore | 9 + providers/generic-sms/README.md | 43 + providers/generic-sms/jest.config.js | 8 + providers/generic-sms/package.json | 78 ++ providers/generic-sms/src/index.ts | 1 + .../src/lib/generic-sms.provider.spec.ts | 41 + .../src/lib/generic-sms.provider.ts | 89 ++ providers/generic-sms/tsconfig.json | 10 + providers/generic-sms/tsconfig.module.json | 9 + providers/gupshup/package.json | 6 +- providers/infobip/package.json | 4 +- providers/kannel/package.json | 4 +- providers/mailersend/package.json | 4 +- .../src/lib/mailersend.provider.spec.ts | 9 +- .../mailersend/src/lib/mailersend.provider.ts | 4 +- providers/mailgun/package.json | 4 +- providers/mailjet/package.json | 4 +- providers/mailtrap/package.json | 4 +- providers/mandrill/package.json | 4 +- providers/maqsam/package.json | 4 +- providers/mattermost/package.json | 4 +- providers/messagebird/.czrc | 3 + providers/messagebird/.eslintrc.json | 3 + providers/messagebird/.gitignore | 9 + providers/messagebird/README.md | 13 + providers/messagebird/jest.config.js | 5 + providers/messagebird/package.json | 78 ++ providers/messagebird/src/index.ts | 1 + .../src/lib/messagebird.provider.spec.ts | 40 + .../src/lib/messagebird.provider.ts | 47 ++ providers/messagebird/tsconfig.json | 10 + providers/messagebird/tsconfig.module.json | 9 + providers/ms-teams/package.json | 2 +- providers/netcore/package.json | 4 +- providers/nexmo/package.json | 4 +- providers/nodemailer/package.json | 4 +- providers/one-signal/package.json | 4 +- providers/outlook365/package.json | 4 +- providers/plivo/package.json | 4 +- providers/plunk/package.json | 4 +- providers/postmark/package.json | 4 +- providers/push-webhook/package.json | 4 +- providers/pushpad/.czrc | 3 + providers/pushpad/.eslintrc.json | 3 + providers/pushpad/.gitignore | 9 + providers/pushpad/README.md | 14 + providers/pushpad/jest.config.js | 5 + providers/pushpad/package.json | 81 ++ providers/pushpad/src/index.ts | 1 + .../pushpad/src/lib/pushpad.provider.spec.ts | 38 + providers/pushpad/src/lib/pushpad.provider.ts | 55 ++ providers/pushpad/tsconfig.json | 10 + providers/pushpad/tsconfig.module.json | 9 + providers/resend/package.json | 4 +- providers/ryver/package.json | 4 +- providers/sendchamp/package.json | 4 +- providers/sendgrid/package.json | 4 +- providers/sendinblue/package.json | 4 +- providers/ses/package.json | 4 +- providers/simpletexting/package.json | 2 +- providers/slack/package.json | 4 +- providers/sms-central/package.json | 2 +- providers/sms77/package.json | 6 +- providers/sns/package.json | 4 +- providers/sparkpost/package.json | 4 +- providers/telnyx/package.json | 4 +- providers/termii/package.json | 6 +- providers/twilio/package.json | 4 +- 260 files changed, 3470 insertions(+), 2167 deletions(-) create mode 100644 apps/api/e2e/idempotency.e2e.ts delete mode 100644 apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.command.ts delete mode 100644 apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.usecase.ts delete mode 100644 apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.command.ts delete mode 100644 apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.usecase.ts create mode 100644 apps/api/src/app/organization/dtos/member-response.dto.ts create mode 100644 apps/api/src/app/organization/dtos/organization-response.dto.ts create mode 100644 apps/api/src/app/shared/framework/idempotency.interceptor.ts create mode 100644 apps/api/src/app/testing/dtos/idempotency.dto.ts delete mode 100644 apps/web/cypress/tests/integration-store.spec.ts create mode 100644 apps/web/public/static/images/providers/dark/bandwidth.png create mode 100644 apps/web/public/static/images/providers/dark/generic-sms.svg create mode 100644 apps/web/public/static/images/providers/dark/messagebird.png create mode 100644 apps/web/public/static/images/providers/dark/pushpad.svg create mode 100644 apps/web/public/static/images/providers/dark/square/generic-sms.svg create mode 100644 apps/web/public/static/images/providers/dark/square/pushpad.svg create mode 100644 apps/web/public/static/images/providers/light/bandwidth.png create mode 100644 apps/web/public/static/images/providers/light/generic-sms.svg create mode 100644 apps/web/public/static/images/providers/light/messagebird.png create mode 100644 apps/web/public/static/images/providers/light/pushpad.svg create mode 100644 apps/web/public/static/images/providers/light/square/generic-sms.svg create mode 100644 apps/web/public/static/images/providers/light/square/pushpad.svg delete mode 100644 apps/web/src/pages/integrations/IntegrationsStoreModal.tsx delete mode 100644 apps/web/src/pages/integrations/IntegrationsStorePage.tsx create mode 100644 packages/application-generic/src/factories/push/handlers/pushpad.handler.ts create mode 100644 packages/application-generic/src/factories/sms/handlers/bandwidth.handler.ts create mode 100644 packages/application-generic/src/factories/sms/handlers/generic-sms.handler.ts create mode 100644 packages/application-generic/src/factories/sms/handlers/messagebird.handler.ts delete mode 100644 packages/application-generic/src/usecases/get-feature-flag/get-is-multi-provider-configuration-enabled.use-case.ts create mode 100644 packages/notification-center/src/i18n/languages/ka.ts create mode 100644 providers/bandwidth/.czrc create mode 100644 providers/bandwidth/.eslintrc.json create mode 100644 providers/bandwidth/.gitignore create mode 100644 providers/bandwidth/README.md create mode 100644 providers/bandwidth/jest.config.js create mode 100644 providers/bandwidth/package.json create mode 100644 providers/bandwidth/src/index.ts create mode 100644 providers/bandwidth/src/lib/bandwidth.provider.spec.ts create mode 100644 providers/bandwidth/src/lib/bandwidth.provider.ts create mode 100644 providers/bandwidth/tsconfig.json create mode 100644 providers/bandwidth/tsconfig.module.json create mode 100644 providers/generic-sms/.czrc create mode 100644 providers/generic-sms/.eslintrc.json create mode 100644 providers/generic-sms/.gitignore create mode 100644 providers/generic-sms/README.md create mode 100644 providers/generic-sms/jest.config.js create mode 100644 providers/generic-sms/package.json create mode 100644 providers/generic-sms/src/index.ts create mode 100644 providers/generic-sms/src/lib/generic-sms.provider.spec.ts create mode 100644 providers/generic-sms/src/lib/generic-sms.provider.ts create mode 100644 providers/generic-sms/tsconfig.json create mode 100644 providers/generic-sms/tsconfig.module.json create mode 100644 providers/messagebird/.czrc create mode 100644 providers/messagebird/.eslintrc.json create mode 100644 providers/messagebird/.gitignore create mode 100644 providers/messagebird/README.md create mode 100644 providers/messagebird/jest.config.js create mode 100644 providers/messagebird/package.json create mode 100644 providers/messagebird/src/index.ts create mode 100644 providers/messagebird/src/lib/messagebird.provider.spec.ts create mode 100644 providers/messagebird/src/lib/messagebird.provider.ts create mode 100644 providers/messagebird/tsconfig.json create mode 100644 providers/messagebird/tsconfig.module.json create mode 100644 providers/pushpad/.czrc create mode 100644 providers/pushpad/.eslintrc.json create mode 100644 providers/pushpad/.gitignore create mode 100644 providers/pushpad/README.md create mode 100644 providers/pushpad/jest.config.js create mode 100644 providers/pushpad/package.json create mode 100644 providers/pushpad/src/index.ts create mode 100644 providers/pushpad/src/lib/pushpad.provider.spec.ts create mode 100644 providers/pushpad/src/lib/pushpad.provider.ts create mode 100644 providers/pushpad/tsconfig.json create mode 100644 providers/pushpad/tsconfig.module.json diff --git a/.cspell.json b/.cspell.json index acc1b24ab5f..088020717da 100644 --- a/.cspell.json +++ b/.cspell.json @@ -220,6 +220,7 @@ "plivo", "Plivo", "prettierignore", + "Pushpad", "Pushwoosh", "sandboxed", "sendgrid", @@ -514,7 +515,12 @@ "Kamil", "Myśliwiec", "nestframework", - "ryver" + "ryver", + "idempotency", + "IDEMPOTENCY", + "Idempotency", + "messagebird", + "Datetime" ], "flagWords": [], "patterns": [ diff --git a/README.md b/README.md index 84edb476116..386d502c200 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Your contribution, no matter its size, holds immense value. We eagerly await to · Roadmap · - Twitter + X · Notifications Directory

@@ -141,7 +141,7 @@ await novu.trigger('', { ## Embeddable Notification Center -Using the Novu API and admin panel, you can easily add a real-time notification center to your web app without building it yourself. You can use our React / Vue / Angular component or an iframe embed. +Using the Novu API and admin panel, you can easily add a real-time notification center to your web app without building it yourself. You can use our [React](https://docs.novu.co/notification-center/client/react/get-started) / [Vue](https://docs.novu.co/notification-center/client/vue) / [Angular](https://docs.novu.co/notification-center/client/angular) components or an [iframe embed](https://docs.novu.co/notification-center/client/iframe).
notification-center-912bb96e009fb3a69bafec23bcde00b0 diff --git a/SECURITY.md b/SECURITY.md index b8340555d38..9b94c6ade88 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,14 +1,18 @@ # Security -Contact: security@novu.co +**Contact:** security@novu.co -Based on [https://supabase.com/.well-known/security.txt](https://supabase.com/.well-known/security.txt) +Safeguarding our Novu systems is a top concern for us. Nevertheless, despite our best efforts to fortify them, vulnerabilities may still be present. -We place a high priority on the security of our systems at Novu. However, no matter how hard we try to make our systems secure, vulnerabilities can still exist. +If you come across a vulnerability, please inform us promptly so we can promptly resolve it. We kindly request your assistance in enhancing the security of both our clients and our systems. -In the event that you discover a vulnerability, please let us know so we can address it as soon as possible. We would like to ask you to help us better protect our clients and our systems. +## Reporting a Vulnerability -## Out of scope vulnerabilities: +**In Scope Vulnerabilities:** + +- Any security issues that might put at risk the confidentiality, integrity, or accessibility of our systems or data. + +**Out of Scope Vulnerabilities:** - Clickjacking on pages with no sensitive actions. @@ -18,41 +22,42 @@ In the event that you discover a vulnerability, please let us know so we can add - Any activity that could lead to the disruption of our service (DoS). -- Content spoofing and text injection issues without showing an attack vector/without being able to modify HTML/CSS. +- Content spoofing and text injection issues without showing an attack vector or the ability to modify HTML/CSS. -- Email spoofing +- Email spoofing. -- Missing DNSSEC, CAA, CSP headers +- Missing DNSSEC, CAA, CSP headers. -- Lack of Secure or HTTP only flag on non-sensitive cookies +- Lack of Secure or HTTP-only flags on non-sensitive cookies. -- Deadlinks +- Deadlinks. -## Please do the following: +**Reporting Instructions:** -- E-mail your findings to [security@novu.co](mailto:security@novu.co). +1. Email your findings to **security@novu.co**. -- Do not run automated scanners on our infrastructure or dashboard. If you wish to do this, contact us and we will set up a sandbox for you. +2. Automated scanning tools should not be used on our infrastructure or dashboard. If you have a need for this, please reach out to us, and we'll assist you in setting up a secure sandbox environment. -- Do not take advantage of the vulnerability or problem you have discovered, for example by downloading more data than necessary to demonstrate the vulnerability or deleting or modifying other people's data, +3. Please do not exploit the vulnerability or issue you've found, such as downloading excessive data or tampering with others' data. -- Do not reveal the problem to others until it has been resolved, +4. Please keep the issue confidential until we've fixed it. -- Do not use attacks on physical security, social engineering, distributed denial of service, spam or applications of third parties, +5. Do not use attacks on physical security, social engineering, distributed denial of service, spam, or third-party applications. -- Do provide sufficient information to reproduce the problem, so we will be able to resolve it as quickly as possible. Usually, the IP address or the URL of the affected system and a description of the vulnerability will be sufficient, but complex vulnerabilities may require further explanation. +6. Please share enough details for us to understand and fix the issue as fast as we can. Typically, providing the IP address or the URL of the affected system along with a description of the problem should be enough, though more intricate issues might need additional clarification. -## What we promise: +## What *We* Promise -- We will respond to your report within 3 business days with our evaluation of the report and an expected resolution date, +1. We'll get back to you within 3 business days with our assessment of the report and an estimated date when we expect to resolve it. -- If you have followed the instructions above, we will not take any legal action against you in regard to the report, +2. We will not take any legal action against you related to the report, if you have adhered to the reporting instructions above. -- We will handle your report with strict confidentiality, and not pass on your personal details to third parties without your permission, +3. We'll treat your report with utmost confidentiality and won't share your personal information with third parties without your consent. -- We will keep you informed of the progress towards resolving the problem, +4. We'll be keeping you updated of the progress toward fixing the issue. -- In the public information concerning the problem reported, we will give your name as the discoverer of the problem (unless you desire otherwise), and +5. We'll credit you as the discoverer of the issue (unless you request otherwise), in public disclosures of the reported issue. -- We strive to resolve all problems as quickly as possible, and we would like to play an active role in the ultimate publication on the problem after it is resolved. +6. We aim to resolve all issues promptly and are eager to actively contribute to the ultimate publication on the problem, once the problem has been resolved. +We truly value your contributions in strengthening our security. diff --git a/apps/api/README.md b/apps/api/README.md index fa0d5361aed..f7f931edb5c 100644 --- a/apps/api/README.md +++ b/apps/api/README.md @@ -1,78 +1,38 @@ -

- Nest Logo -

+ -[travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=main -[travis-url]: https://travis-ci.org/nestjs/nest -[linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux -[linux-url]: https://travis-ci.org/nestjs/nest -

A progressive Node.js framework for building efficient and scalable server-side applications, heavily inspired by Angular.

-

-NPM Version -Package License -NPM Downloads -Travis -Linux -Coverage -Gitter -Backers on Open Collective -Sponsors on Open Collective - - -

- +# @novu/api -## Description +A RESTful API for accessing the Novu platform, built using [NestJS](https://nestjs.com/). -[Nest](https://github.com/nestjs/nest) framework [TypeScript](https://www.typescriptlang.org/) starter repository. +## OpenAPI (formerly Swagger) -## Installation +The Novu API utilizes the [`@nestjs/swagger`](https://github.com/nestjs/swagger) package to generate up-to-date OpenAPI specifications. -```bash -$ npm install -``` +A web interface to browse the available endpoints is available at [api.novu.co/api](https://api.novu.co/api). An OpenAPI specification can be retrieved at [api.novu.co/api-json](https://api.novu.co/api-json). -## Running the app - -```bash -# development -$ npm run start +## Running the API -# watch mode -$ npm run start:dev +See the docs for [Run in Local Machine](https://docs.novu.co/community/run-in-local-machin) to get setup. Then run: -# incremental rebuild (webpack) -$ npm run webpack -$ npm run start:hmr - -# production mode -$ npm run start:prod +```bash +# Run the API in watch mode +$ npm run start:api ``` ## Test +### Unit Tests ```bash # unit tests $ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov ``` -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](LICENSE). +### E2E tests +See the docs for [Running on Local Machine - API Tests](https://docs.novu.co/community/run-in-local-machine#api). diff --git a/apps/api/e2e/idempotency.e2e.ts b/apps/api/e2e/idempotency.e2e.ts new file mode 100644 index 00000000000..ced5688bcec --- /dev/null +++ b/apps/api/e2e/idempotency.e2e.ts @@ -0,0 +1,307 @@ +import { UserSession } from '@novu/testing'; +import { CacheService } from '@novu/application-generic'; +import { expect } from 'chai'; +describe('Idempotency Test', async () => { + let session: UserSession; + const path = '/v1/testing/idempotency'; + const HEADER_KEYS = { + IDEMPOTENCY_KEY: 'idempotency-key', + RETRY_AFTER: 'retry-after', + IDEMPOTENCY_REPLAY: 'idempotency-replay', + LINK: 'link', + }; + const DOCS_LINK = 'docs.novu.co/idempotency'; + + let cacheService: CacheService | null = null; + + describe('when enabled', () => { + before(async () => { + session = new UserSession(); + await session.initialize(); + cacheService = session.testServer?.getService(CacheService); + process.env.IS_API_IDEMPOTENCY_ENABLED = 'true'; + }); + + it('should return cached same response for duplicate requests', async () => { + const key = `1`; + const { body, headers } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + const { body: bodyDupe, headers: headerDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(body.data.number).to.equal(bodyDupe.data.number); + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_REPLAY]).to.eq('true'); + }); + it('should return cached and use correct cache key when apiKey is used', async () => { + const key = `2`; + const { body, headers } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + const cacheKey = `test-${session.organization._id}-${key}`; + session.testServer?.getHttpServer(); + // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain + const cacheVal = JSON.stringify(JSON.parse(await cacheService?.get(cacheKey)!).data); + expect(JSON.stringify(body)).to.eq(cacheVal); + const { body: bodyDupe, headers: headerDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(body.data.number).to.equal(bodyDupe.data.number); + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_REPLAY]).to.eq('true'); + }); + it('should return cached and use correct cache key when authToken and apiKey combination is used', async () => { + const key = `3`; + const { body, headers } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', session.token) + .send({ data: 201 }) + .expect(201); + const cacheKey = `test-${session.organization._id}-${key}`; + session.testServer?.getHttpServer(); + // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain + const cacheVal = JSON.stringify(JSON.parse(await cacheService?.get(cacheKey)!).data); + expect(JSON.stringify(body)).to.eq(cacheVal); + const { body: bodyDupe, headers: headerDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(body.data.number).to.equal(bodyDupe.data.number); + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_REPLAY]).to.eq('true'); + }); + it('should return conflict when concurrent requests are made', async () => { + const key = `4`; + const [{ headers, body, status }, { headers: headerDupe, body: bodyDupe, status: statusDupe }] = + await Promise.all([ + session.testAgent.post(path).set(HEADER_KEYS.IDEMPOTENCY_KEY, key).send({ data: 250 }), + session.testAgent.post(path).set(HEADER_KEYS.IDEMPOTENCY_KEY, key).send({ data: 250 }), + ]); + const oneSuccess = status === 201 || statusDupe === 201; + const oneConflict = status === 409 || statusDupe === 409; + const conflictBody = status === 201 ? bodyDupe : body; + const retryHeader = headers[HEADER_KEYS.RETRY_AFTER] || headerDupe[HEADER_KEYS.RETRY_AFTER]; + expect(oneSuccess).to.be.true; + expect(oneConflict).to.be.true; + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.LINK]).to.eq(DOCS_LINK); + expect(retryHeader).to.eq(`1`); + expect(JSON.stringify(conflictBody)).to.eq( + JSON.stringify({ + message: `Request with key "${key}" is currently being processed. Please retry after 1 second`, + error: 'Conflict', + statusCode: 409, + }) + ); + }); + it('should return conflict when different body is sent for same key', async () => { + const key = '5'; + const { headers, body, status } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 250 }); + const { + headers: headerDupe, + body: bodyDupe, + status: statusDupe, + } = await session.testAgent.post(path).set(HEADER_KEYS.IDEMPOTENCY_KEY, key).send({ data: 251 }); + + const oneSuccess = status === 201 || statusDupe === 201; + const oneConflict = status === 422 || statusDupe === 422; + const conflictBody = status === 201 ? bodyDupe : body; + expect(oneSuccess).to.be.true; + expect(oneConflict).to.be.true; + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.LINK]).to.eq(DOCS_LINK); + expect(JSON.stringify(conflictBody)).to.eq( + JSON.stringify({ + message: `Request with key "${key}" is being reused for a different body`, + error: 'Unprocessable Entity', + statusCode: 422, + }) + ); + }); + it('should return non cached response for unique requests', async () => { + const key = '6'; + const key1 = '7'; + const { body, headers } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + + const { body: bodyDupe, headers: headerDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key1) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(typeof bodyDupe.data.number === 'number').to.be.true; + expect(body.data.number).not.to.equal(bodyDupe.data.number); + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key1); + }); + it('should return non cached response for GET requests', async () => { + const key = '8'; + const { body, headers } = await session.testAgent + .get(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({}) + .expect(200); + + const { body: bodyDupe } = await session.testAgent + .get(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({}) + .expect(200); + expect(typeof body.data.number === 'number').to.be.true; + expect(typeof bodyDupe.data.number === 'number').to.be.true; + expect(body.data.number).not.to.equal(bodyDupe.data.number); + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(undefined); + }); + it('should return cached error response for duplicate requests', async () => { + const key = '9'; + const { body, headers } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 422 }) + .expect(422); + + const { body: bodyDupe, headers: headerDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 422 }) + .expect(422); + expect(JSON.stringify(body)).to.equal(JSON.stringify(bodyDupe)); + + expect(headers[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + expect(headerDupe[HEADER_KEYS.IDEMPOTENCY_KEY]).to.eq(key); + }); + it('should return 400 when key bigger than allowed limit', async () => { + const key = Array.from({ length: 256 }) + .fill(0) + .map((i) => i) + .join(''); + const { body } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 250 }) + .expect(400); + expect(JSON.stringify(body)).to.eq( + JSON.stringify({ + message: `idempotencyKey "${key}" has exceeded the maximum allowed length of 255 characters`, + error: 'Bad Request', + statusCode: 400, + }) + ); + }); + }); + + describe('when disabled', () => { + before(async () => { + session = new UserSession(); + await session.initialize(); + process.env.IS_API_IDEMPOTENCY_ENABLED = 'false'; + }); + + it('should not return cached same response for duplicate requests', async () => { + const key = '10'; + const { body } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + + const { body: bodyDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(body.data.number).not.to.equal(bodyDupe.data.number); + }); + it('should return non cached response for unique requests', async () => { + const key = '11'; + const key1 = '12'; + const { body } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: 201 }) + .expect(201); + + const { body: bodyDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key1) + .send({ data: 201 }) + .expect(201); + expect(typeof body.data.number === 'number').to.be.true; + expect(typeof bodyDupe.data.number === 'number').to.be.true; + expect(body.data.number).not.to.equal(bodyDupe.data.number); + }); + it('should return non cached response for GET requests', async () => { + const key = '13'; + const { body } = await session.testAgent.get(path).set(HEADER_KEYS.IDEMPOTENCY_KEY, key).send({}).expect(200); + + const { body: bodyDupe } = await session.testAgent + .get(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({}) + .expect(200); + expect(typeof body.data.number === 'number').to.be.true; + expect(typeof bodyDupe.data.number === 'number').to.be.true; + expect(body.data.number).not.to.equal(bodyDupe.data.number); + }); + it('should not return cached error response for duplicate requests', async () => { + const key = '14'; + const { body } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: '500' }) + .expect(500); + + const { body: bodyDupe } = await session.testAgent + .post(path) + .set(HEADER_KEYS.IDEMPOTENCY_KEY, key) + .set('authorization', `ApiKey ${session.apiKey}`) + .send({ data: '500' }) + .expect(500); + expect(JSON.stringify(body)).not.to.equal(JSON.stringify(bodyDupe)); + }); + }); +}); diff --git a/apps/api/package.json b/apps/api/package.json index 312579eb9b9..b1caa9f7f7d 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "@novu/api", - "version": "0.20.0", + "version": "0.21.0", "description": "description", "author": "", "private": "true", @@ -38,12 +38,12 @@ "@nestjs/platform-express": "^10.2.2", "@nestjs/swagger": "^7.1.8", "@nestjs/terminus": "^10.0.1", - "@novu/application-generic": "^0.20.0", - "@novu/dal": "^0.20.0", - "@novu/node": "^0.20.0", - "@novu/shared": "^0.20.0", - "@novu/stateless": "^0.20.0", - "@novu/testing": "^0.20.0", + "@novu/application-generic": "^0.21.0", + "@novu/dal": "^0.21.0", + "@novu/node": "^0.21.0", + "@novu/shared": "^0.21.0", + "@novu/stateless": "^0.21.0", + "@novu/testing": "^0.21.0", "@sendgrid/mail": "^7.6.0", "@sentry/hub": "^7.40.0", "@sentry/node": "^7.40.0", diff --git a/apps/api/src/.env.development b/apps/api/src/.env.development index 8af859ce673..410ba4c291a 100644 --- a/apps/api/src/.env.development +++ b/apps/api/src/.env.development @@ -64,3 +64,5 @@ NOVU_SMS_INTEGRATION_SENDER= INTERCOM_IDENTITY_VERIFICATION_SECRET_KEY= LAUNCH_DARKLY_SDK_KEY= + +IS_API_IDEMPOTENCY_ENABLED=false diff --git a/apps/api/src/.env.production b/apps/api/src/.env.production index 988ff2d4d9a..cb1a23d72a7 100644 --- a/apps/api/src/.env.production +++ b/apps/api/src/.env.production @@ -53,3 +53,5 @@ NOVU_SMS_INTEGRATION_SENDER= INTERCOM_IDENTITY_VERIFICATION_SECRET_KEY= LAUNCH_DARKLY_SDK_KEY= + +IS_API_IDEMPOTENCY_ENABLED=false diff --git a/apps/api/src/.env.test b/apps/api/src/.env.test index 5b43216c298..070251b2084 100644 --- a/apps/api/src/.env.test +++ b/apps/api/src/.env.test @@ -74,7 +74,6 @@ VERCEL_REDIRECT_URI=http://localhost:4200/auth/login VERCEL_BASE_URL=https://api.vercel.com FF_IS_TOPIC_NOTIFICATION_ENABLED=true -IS_MULTI_PROVIDER_CONFIGURATION_ENABLED=true STORE_NOTIFICATION_CONTENT=true @@ -90,3 +89,5 @@ MAX_NOVU_INTEGRATION_SMS_REQUESTS=20 NOVU_SMS_INTEGRATION_ACCOUNT_SID=test NOVU_SMS_INTEGRATION_TOKEN=test NOVU_SMS_INTEGRATION_SENDER=1234567890 + +IS_API_IDEMPOTENCY_ENABLED=true diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 00418026038..05373ac753e 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -31,6 +31,7 @@ import { TopicsModule } from './app/topics/topics.module'; import { InboundParseModule } from './app/inbound-parse/inbound-parse.module'; import { BlueprintModule } from './app/blueprint/blueprint.module'; import { TenantModule } from './app/tenant/tenant.module'; +import { IdempotencyInterceptor } from './app/shared/framework/idempotency.interceptor'; const enterpriseImports = (): Array | ForwardReference> => { const modules: Array | ForwardReference> = []; @@ -78,7 +79,12 @@ const enterpriseModules = enterpriseImports(); const modules = baseModules.concat(enterpriseModules); -const providers: Provider[] = []; +const providers: Provider[] = [ + { + provide: APP_INTERCEPTOR, + useClass: IdempotencyInterceptor, + }, +]; if (process.env.SENTRY_DSN) { modules.push(RavenModule); diff --git a/apps/api/src/app/blueprint/e2e/get-grouped-blueprints.e2e.ts b/apps/api/src/app/blueprint/e2e/get-grouped-blueprints.e2e.ts index cf619d79b55..67e4a5893f3 100644 --- a/apps/api/src/app/blueprint/e2e/get-grouped-blueprints.e2e.ts +++ b/apps/api/src/app/blueprint/e2e/get-grouped-blueprints.e2e.ts @@ -3,7 +3,14 @@ import * as sinon from 'sinon'; import { UserSession } from '@novu/testing'; import { NotificationTemplateRepository, EnvironmentRepository } from '@novu/dal'; -import { EmailBlockTypeEnum, FilterPartTypeEnum, INotificationTemplate, StepTypeEnum } from '@novu/shared'; +import { + EmailBlockTypeEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, + FilterPartTypeEnum, + INotificationTemplate, + StepTypeEnum, +} from '@novu/shared'; import { buildGroupedBlueprintsKey, CacheService, @@ -177,13 +184,13 @@ export async function createTemplateFromBlueprint({ { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, diff --git a/apps/api/src/app/change/e2e/get-changes.e2e.ts b/apps/api/src/app/change/e2e/get-changes.e2e.ts index 5ac9ea173fa..7406192ba12 100644 --- a/apps/api/src/app/change/e2e/get-changes.e2e.ts +++ b/apps/api/src/app/change/e2e/get-changes.e2e.ts @@ -1,6 +1,12 @@ import { expect } from 'chai'; import { ChangeRepository } from '@novu/dal'; -import { EmailBlockTypeEnum, StepTypeEnum, FilterPartTypeEnum } from '@novu/shared'; +import { + EmailBlockTypeEnum, + StepTypeEnum, + FilterPartTypeEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, +} from '@novu/shared'; import { UserSession } from '@novu/testing'; import { CreateWorkflowRequestDto, UpdateWorkflowRequestDto } from '../../workflows/dto'; @@ -32,13 +38,13 @@ describe('Get changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, diff --git a/apps/api/src/app/change/e2e/promote-changes.e2e.ts b/apps/api/src/app/change/e2e/promote-changes.e2e.ts index 05ac9b983ca..0c7f5b029b8 100644 --- a/apps/api/src/app/change/e2e/promote-changes.e2e.ts +++ b/apps/api/src/app/change/e2e/promote-changes.e2e.ts @@ -13,6 +13,8 @@ import { ChangeEntityTypeEnum, ChannelCTATypeEnum, EmailBlockTypeEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, StepTypeEnum, FilterPartTypeEnum, TemplateVariableTypeEnum, @@ -69,13 +71,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -96,7 +98,7 @@ describe('Promote changes', () => { _parentId: notificationTemplateId, }); - expect(prodVersion._notificationGroupId).to.eq(prodGroup._id); + expect(prodVersion?._notificationGroupId).to.eq(prodGroup._id); }); it('should promote step variables default values', async () => { @@ -204,13 +206,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -242,7 +244,7 @@ describe('Promote changes', () => { _parentId: notificationTemplateId, } as any); - expect(prodVersion.steps.length).to.eq(0); + expect(prodVersion?.steps.length).to.eq(0); }); it('update active flag on notification template', async () => { @@ -274,7 +276,7 @@ describe('Promote changes', () => { _parentId: notificationTemplateId, }); - expect(prodVersion.active).to.eq(true); + expect(prodVersion?.active).to.eq(true); }); it('update existing message', async () => { @@ -295,13 +297,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -352,7 +354,7 @@ describe('Promote changes', () => { _parentId: step._templateId, }); - expect(prodVersion.name).to.eq('test'); + expect(prodVersion?.name).to.eq('test'); }); it('add one more message', async () => { @@ -373,13 +375,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -431,13 +433,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'secondName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -479,13 +481,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -521,13 +523,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -632,13 +634,13 @@ describe('Promote changes', () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -659,7 +661,7 @@ describe('Promote changes', () => { _parentId: notificationTemplateId, }); - expect(prodVersion.isBlueprint).to.equal(true); + expect(prodVersion?.isBlueprint).to.equal(true); }); it('should merge creation, and status changes to one change', async () => { @@ -724,9 +726,15 @@ describe('Promote changes', () => { }); }); - async function getProductionEnvironment() { - return await environmentRepository.findOne({ + async function getProductionEnvironment(): Promise { + const production = await environmentRepository.findOne({ _parentId: session.environment._id, }); + + if (!production) { + throw new Error('No production environment'); + } + + return production; } }); diff --git a/apps/api/src/app/events/e2e/send-message-push.e2e.ts b/apps/api/src/app/events/e2e/send-message-push.e2e.ts index e9cafbbea4b..18e5b0869b7 100644 --- a/apps/api/src/app/events/e2e/send-message-push.e2e.ts +++ b/apps/api/src/app/events/e2e/send-message-push.e2e.ts @@ -12,6 +12,8 @@ import { UserSession } from '@novu/testing'; const axiosInstance = axios.create(); +const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; + describe('Trigger event - Send Push Notification - /v1/events/trigger (POST)', () => { let session: UserSession; let template: NotificationTemplateEntity; @@ -39,7 +41,7 @@ describe('Trigger event - Send Push Notification - /v1/events/trigger (POST)', ( }); after(() => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'false'; + process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); describe('Multiple providers active', () => { diff --git a/apps/api/src/app/events/e2e/trigger-event.e2e.ts b/apps/api/src/app/events/e2e/trigger-event.e2e.ts index c36242ed765..66474841a14 100644 --- a/apps/api/src/app/events/e2e/trigger-event.e2e.ts +++ b/apps/api/src/app/events/e2e/trigger-event.e2e.ts @@ -19,13 +19,15 @@ import { UserSession, SubscribersService } from '@novu/testing'; import { ChannelTypeEnum, EmailBlockTypeEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, + FilterPartTypeEnum, StepTypeEnum, IEmailBlock, ISubscribersDefine, TemplateVariableTypeEnum, EmailProviderIdEnum, SmsProviderIdEnum, - FilterPartTypeEnum, DigestUnitEnum, DelayTypeEnum, PreviousStepTypeEnum, @@ -43,8 +45,6 @@ const axiosInstance = axios.create(); const eventTriggerPath = '/v1/events/trigger'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - const promiseTimeout = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)); describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { @@ -62,6 +62,7 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { describe(`Trigger Event - ${eventTriggerPath} (POST)`, function () { beforeEach(async () => { + process.env.LAUNCH_DARKLY_SDK_KEY = ''; session = new UserSession(); await session.initialize(); template = await session.createTemplate(); @@ -92,11 +93,11 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PAYLOAD, - operator: 'IS_DEFINED', + operator: FieldOperatorEnum.IS_DEFINED, field: 'exclude', value: '', }, @@ -172,11 +173,11 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PAYLOAD, - operator: 'IS_DEFINED', + operator: FieldOperatorEnum.IS_DEFINED, field: 'exclude', value: '', }, @@ -252,11 +253,11 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PAYLOAD, - operator: 'IS_DEFINED', + operator: FieldOperatorEnum.IS_DEFINED, field: 'exclude', value: '', }, @@ -333,11 +334,11 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PAYLOAD, - operator: 'IS_DEFINED', + operator: FieldOperatorEnum.IS_DEFINED, field: 'exclude', value: '', }, @@ -399,7 +400,7 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { _environmentId: session.environment._id, conditions: [ { - children: [{ field: 'identifier', value: 'test', operator: 'EQUAL', on: 'tenant' }], + children: [{ field: 'identifier', value: 'test', operator: FieldOperatorEnum.EQUAL, on: 'tenant' }], }, ], active: true, @@ -438,10 +439,10 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { _environmentId: session.environment._id, conditions: [ { - value: 'OR', + value: FieldLogicalOperatorEnum.OR, children: [ - { field: 'identifier', value: 'test3', operator: 'EQUAL', on: 'tenant' }, - { field: 'identifier', value: 'test2', operator: 'EQUAL', on: 'tenant' }, + { field: 'identifier', value: 'test3', operator: FieldOperatorEnum.EQUAL, on: 'tenant' }, + { field: 'identifier', value: 'test2', operator: FieldOperatorEnum.EQUAL, on: 'tenant' }, ], }, ], @@ -498,7 +499,7 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { _environmentId: session.environment._id, conditions: [ { - children: [{ field: 'identifier', value: 'test1', operator: 'EQUAL', on: 'tenant' }], + children: [{ field: 'identifier', value: 'test1', operator: FieldOperatorEnum.EQUAL, on: 'tenant' }], }, ], active: true, @@ -1703,13 +1704,13 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { field: 'run', value: 'true', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, on: FilterPartTypeEnum.PAYLOAD, }, ], @@ -1736,13 +1737,13 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { field: 'subscriberId', value: subscriber.subscriberId, - operator: 'NOT_EQUAL', + operator: FieldOperatorEnum.NOT_EQUAL, on: FilterPartTypeEnum.SUBSCRIBER, }, ], @@ -1801,12 +1802,12 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { field: 'isOnline', value: 'true', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, on: FilterPartTypeEnum.WEBHOOK, webhookUrl: 'www.user.com/webhook', }, @@ -1903,12 +1904,12 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { field: 'isOnline', value: 'true', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, on: FilterPartTypeEnum.WEBHOOK, webhookUrl: 'www.user.com/webhook', }, @@ -1968,12 +1969,12 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { field: 'isOnline', value: 'true', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, on: FilterPartTypeEnum.WEBHOOK, webhookUrl: 'www.user.com/webhook', }, @@ -2230,7 +2231,7 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PREVIOUS_STEP, @@ -2322,7 +2323,7 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PREVIOUS_STEP, @@ -2389,18 +2390,6 @@ describe(`Trigger event - ${eventTriggerPath} (POST)`, function () { expect(messagesAfter.length).to.equal(1); }); }); - }); - describe.skip('Trigger Event - [IS_MULTI_PROVIDER_CONFIGURATION_ENABLED=true]', function () { - beforeEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - process.env.LAUNCH_DARKLY_SDK_KEY = ''; - session = new UserSession(); - await session.initialize(); - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - }); it('should trigger message with override integration identifier', async function () { const newSubscriberId = SubscriberRepository.createObjectId(); diff --git a/apps/api/src/app/integrations/dtos/credentials.dto.ts b/apps/api/src/app/integrations/dtos/credentials.dto.ts index 5701d25fbc2..eaed4cdc65f 100644 --- a/apps/api/src/app/integrations/dtos/credentials.dto.ts +++ b/apps/api/src/app/integrations/dtos/credentials.dto.ts @@ -136,4 +136,34 @@ export class CredentialsDto implements ICredentials { @IsString() @IsOptional() ipPoolName?: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + apiKeyRequestHeader?: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + secretKeyRequestHeader?: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + idPath?: string; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + datePath?: string; + + @ApiPropertyOptional() + @IsBoolean() + @IsOptional() + authenticateByToken?: boolean; + + @ApiPropertyOptional() + @IsString() + @IsOptional() + authenticationTokenKey?: string; } diff --git a/apps/api/src/app/integrations/e2e/create-integration.e2e.ts b/apps/api/src/app/integrations/e2e/create-integration.e2e.ts index 2700017dc1e..6fb6813fffa 100644 --- a/apps/api/src/app/integrations/e2e/create-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/create-integration.e2e.ts @@ -4,14 +4,13 @@ import { ChannelTypeEnum, ChatProviderIdEnum, EmailProviderIdEnum, + FieldOperatorEnum, InAppProviderIdEnum, PushProviderIdEnum, SmsProviderIdEnum, } from '@novu/shared'; import { expect } from 'chai'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Create Integration - /integration (POST)', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); @@ -20,11 +19,6 @@ describe('Create Integration - /integration (POST)', function () { beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('should get the email integration successfully', async function () { @@ -113,7 +107,7 @@ describe('Create Integration - /integration (POST)', function () { check: false, conditions: [ { - children: [{ field: 'identifier', value: 'test', operator: 'EQUAL', on: 'tenant' }], + children: [{ field: 'identifier', value: 'test', operator: FieldOperatorEnum.EQUAL, on: 'tenant' }], }, ], }; diff --git a/apps/api/src/app/integrations/e2e/deactivate-integration.e2e.ts b/apps/api/src/app/integrations/e2e/deactivate-integration.e2e.ts index 26219fc9725..605ade881a8 100644 --- a/apps/api/src/app/integrations/e2e/deactivate-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/deactivate-integration.e2e.ts @@ -1,29 +1,17 @@ import { IntegrationRepository } from '@novu/dal'; import { UserSession } from '@novu/testing'; import { expect } from 'chai'; -import * as sinon from 'sinon'; -import { GetIsMultiProviderConfigurationEnabled } from '@novu/application-generic'; describe('Deactivate Integration', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); - let stub: sinon.SinonStub; beforeEach(async () => { session = new UserSession(); - const service = session.testServer?.getService(GetIsMultiProviderConfigurationEnabled); - stub = sinon.stub(service, 'execute'); - stub.callsFake(() => { - return true; - }); await session.initialize(); }); - afterEach(() => { - stub.restore(); - }); - - it('should not deactivated old providers when feature flag is active', async function () { + it('should not deactivate old providers when a new provider is created', async function () { const payload = { providerId: 'mailgun', channel: 'email', diff --git a/apps/api/src/app/integrations/e2e/get-active-integration.e2e.ts b/apps/api/src/app/integrations/e2e/get-active-integration.e2e.ts index fd57cb55dd2..26c5ffafb56 100644 --- a/apps/api/src/app/integrations/e2e/get-active-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/get-active-integration.e2e.ts @@ -4,22 +4,16 @@ import { ChannelTypeEnum, EmailProviderIdEnum, SmsProviderIdEnum } from '@novu/s import { IntegrationService } from '@novu/testing'; import { IntegrationEntity } from '@novu/dal'; -describe('Get Active Integrations [IS_MULTI_PROVIDER_CONFIGURATION_ENABLED=true] - /integrations/active (GET)', function () { +describe('Get Active Integrations - Multi-Provider Configuration - /integrations/active (GET)', function () { let session: UserSession; const integrationService = new IntegrationService(); - const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; process.env.LAUNCH_DARKLY_SDK_KEY = ''; }); - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - }); - it('should get active integrations', async function () { await integrationService.createIntegration({ environmentId: session.environment._id, diff --git a/apps/api/src/app/integrations/e2e/get-decrypted-integrations.e2e.ts b/apps/api/src/app/integrations/e2e/get-decrypted-integrations.e2e.ts index 9810c383cd9..32aa7c4e916 100644 --- a/apps/api/src/app/integrations/e2e/get-decrypted-integrations.e2e.ts +++ b/apps/api/src/app/integrations/e2e/get-decrypted-integrations.e2e.ts @@ -3,8 +3,6 @@ import { expect } from 'chai'; import { ChannelTypeEnum, EmailProviderIdEnum } from '@novu/shared'; import { IntegrationRepository } from '@novu/dal'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Get Decrypted Integrations - /integrations (GET)', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); @@ -12,11 +10,6 @@ describe('Get Decrypted Integrations - /integrations (GET)', function () { beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('should get active decrypted integration', async function () { diff --git a/apps/api/src/app/integrations/e2e/get-integration.e2e.ts b/apps/api/src/app/integrations/e2e/get-integration.e2e.ts index 46786a848b1..a5594e9e24a 100644 --- a/apps/api/src/app/integrations/e2e/get-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/get-integration.e2e.ts @@ -3,19 +3,12 @@ import { expect } from 'chai'; import { ChannelTypeEnum, EmailProviderIdEnum, SmsProviderIdEnum } from '@novu/shared'; import { IntegrationEntity } from '@novu/dal'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Get Integrations - /integrations (GET)', function () { let session: UserSession; beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('should retrieve all the integrations of all environments from an organization from the prefilled test data', async () => { diff --git a/apps/api/src/app/integrations/e2e/remove-integration.e2e.ts b/apps/api/src/app/integrations/e2e/remove-integration.e2e.ts index 383df2a5fd5..797c5ee4e26 100644 --- a/apps/api/src/app/integrations/e2e/remove-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/remove-integration.e2e.ts @@ -10,8 +10,6 @@ import { } from '@novu/shared'; import { HttpStatus } from '@nestjs/common'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Delete Integration - /integration/:integrationId (DELETE)', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); @@ -19,11 +17,6 @@ describe('Delete Integration - /integration/:integrationId (DELETE)', function ( beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('should throw not found exception when integration is not found', async function () { diff --git a/apps/api/src/app/integrations/e2e/set-itegration-as-primary.e2e.ts b/apps/api/src/app/integrations/e2e/set-itegration-as-primary.e2e.ts index 05460670eea..4c2826347a6 100644 --- a/apps/api/src/app/integrations/e2e/set-itegration-as-primary.e2e.ts +++ b/apps/api/src/app/integrations/e2e/set-itegration-as-primary.e2e.ts @@ -9,8 +9,6 @@ import { PushProviderIdEnum, } from '@novu/shared'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Set Integration As Primary - /integrations/:integrationId/set-primary (POST)', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); @@ -18,11 +16,6 @@ describe('Set Integration As Primary - /integrations/:integrationId/set-primary beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('when integration id is not valid should throw bad request exception', async () => { diff --git a/apps/api/src/app/integrations/e2e/update-integration.e2e.ts b/apps/api/src/app/integrations/e2e/update-integration.e2e.ts index 96a176d296d..398193e68f1 100644 --- a/apps/api/src/app/integrations/e2e/update-integration.e2e.ts +++ b/apps/api/src/app/integrations/e2e/update-integration.e2e.ts @@ -10,8 +10,6 @@ import { PushProviderIdEnum, } from '@novu/shared'; -const ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - describe('Update Integration - /integrations/:integrationId (PUT)', function () { let session: UserSession; const integrationRepository = new IntegrationRepository(); @@ -20,11 +18,6 @@ describe('Update Integration - /integrations/:integrationId (PUT)', function () beforeEach(async () => { session = new UserSession(); await session.initialize(); - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = 'true'; - }); - - afterEach(async () => { - process.env.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED = ORIGINAL_IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; }); it('should throw not found exception when integration is not found', async function () { diff --git a/apps/api/src/app/integrations/usecases/create-integration/create-integration.usecase.ts b/apps/api/src/app/integrations/usecases/create-integration/create-integration.usecase.ts index 342a550998a..c7ae5a61749 100644 --- a/apps/api/src/app/integrations/usecases/create-integration/create-integration.usecase.ts +++ b/apps/api/src/app/integrations/usecases/create-integration/create-integration.usecase.ts @@ -15,13 +15,10 @@ import { encryptCredentials, buildIntegrationKey, InvalidateCacheService, - GetIsMultiProviderConfigurationEnabled, - FeatureFlagCommand, } from '@novu/application-generic'; import { CreateIntegrationCommand } from './create-integration.command'; import { ApiException } from '../../../shared/exceptions/api.exception'; -import { DeactivateSimilarChannelIntegrations } from '../deactivate-integration/deactivate-integration.usecase'; import { CheckIntegrationCommand } from '../check-integration/check-integration.command'; import { CheckIntegration } from '../check-integration/check-integration.usecase'; @@ -32,9 +29,7 @@ export class CreateIntegration { constructor( private invalidateCache: InvalidateCacheService, private integrationRepository: IntegrationRepository, - private deactivateSimilarChannelIntegrations: DeactivateSimilarChannelIntegrations, - private analyticsService: AnalyticsService, - private getIsMultiProviderConfigurationEnabled: GetIsMultiProviderConfigurationEnabled + private analyticsService: AnalyticsService ) {} private async calculatePriorityAndPrimary(command: CreateIntegrationCommand) { @@ -71,26 +66,12 @@ export class CreateIntegration { } async execute(command: CreateIntegrationCommand): Promise { - const isMultiProviderConfigurationEnabled = await this.getIsMultiProviderConfigurationEnabled.execute( - FeatureFlagCommand.create({ - userId: command.userId, - organizationId: command.organizationId, - environmentId: command.environmentId, - }) - ); - const existingIntegration = await this.integrationRepository.findOne({ _environmentId: command.environmentId, providerId: command.providerId, channel: command.channel, }); - if (!isMultiProviderConfigurationEnabled && existingIntegration) { - throw new BadRequestException( - 'Duplicate key - One environment may not have two providers of the same channel type' - ); - } - if ( existingIntegration && command.providerId === InAppProviderIdEnum.Novu && @@ -169,7 +150,7 @@ export class CreateIntegration { const isActiveAndChannelSupportsPrimary = command.active && CHANNELS_WITH_PRIMARY.includes(command.channel); - if (isMultiProviderConfigurationEnabled && isActiveAndChannelSupportsPrimary) { + if (isActiveAndChannelSupportsPrimary) { const { primary, priority } = await this.calculatePriorityAndPrimary(command); query.primary = primary; @@ -178,20 +159,6 @@ export class CreateIntegration { const integrationEntity = await this.integrationRepository.create(query); - if ( - !isMultiProviderConfigurationEnabled && - command.active && - ![ChannelTypeEnum.CHAT, ChannelTypeEnum.PUSH].includes(command.channel) - ) { - await this.deactivateSimilarChannelIntegrations.execute({ - environmentId: command.environmentId, - organizationId: command.organizationId, - integrationId: integrationEntity._id, - channel: command.channel, - userId: command.userId, - }); - } - return integrationEntity; } catch (e) { if (e instanceof DalException) { diff --git a/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.command.ts b/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.command.ts deleted file mode 100644 index fb0439c05dc..00000000000 --- a/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.command.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsDefined } from 'class-validator'; -import { ChannelTypeEnum } from '@novu/shared'; -import { EnvironmentWithUserCommand } from '../../../shared/commands/project.command'; - -export class DeactivateSimilarChannelIntegrationsCommand extends EnvironmentWithUserCommand { - @IsDefined() - integrationId: string; - - @IsDefined() - channel: ChannelTypeEnum; -} diff --git a/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.usecase.ts b/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.usecase.ts deleted file mode 100644 index 826b56a0c1a..00000000000 --- a/apps/api/src/app/integrations/usecases/deactivate-integration/deactivate-integration.usecase.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { IntegrationRepository } from '@novu/dal'; -import { FeatureFlagCommand, GetIsMultiProviderConfigurationEnabled } from '@novu/application-generic'; - -import { DeactivateSimilarChannelIntegrationsCommand } from './deactivate-integration.command'; - -@Injectable() -export class DeactivateSimilarChannelIntegrations { - constructor( - private integrationRepository: IntegrationRepository, - private getIsMultiProviderConfigurationEnabled: GetIsMultiProviderConfigurationEnabled - ) {} - async execute(command: DeactivateSimilarChannelIntegrationsCommand): Promise { - const shouldKeepIntegrationsActive = await this.getIsMultiProviderConfigurationEnabled.execute( - FeatureFlagCommand.create({ - environmentId: command.environmentId, - organizationId: command.organizationId, - userId: command.userId, - }) - ); - - if (shouldKeepIntegrationsActive) { - return; - } - - const otherExistedIntegration = await this.integrationRepository.find({ - _id: { $ne: command.integrationId }, - _environmentId: command.environmentId, - channel: command.channel, - active: true, - }); - - if (otherExistedIntegration.length) { - await this.integrationRepository.update( - { _environmentId: command.environmentId, _id: { $in: otherExistedIntegration.map((i) => i._id) } }, - { $set: { active: false } } - ); - } - } -} diff --git a/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.command.ts b/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.command.ts deleted file mode 100644 index 910278ffa31..00000000000 --- a/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.command.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ChannelTypeEnum } from '@novu/shared'; -import { IsDefined, IsEnum, IsString } from 'class-validator'; -import { EnvironmentWithUserCommand } from '../../../shared/commands/project.command'; - -export class DisableNovuIntegrationCommand extends EnvironmentWithUserCommand { - @IsDefined() - @IsEnum(ChannelTypeEnum) - channel: ChannelTypeEnum; - - @IsDefined() - @IsString() - providerId: string; -} diff --git a/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.usecase.ts b/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.usecase.ts deleted file mode 100644 index 7aaf7a346c4..00000000000 --- a/apps/api/src/app/integrations/usecases/disable-novu-integration/disable-novu-integration.usecase.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { IntegrationRepository } from '@novu/dal'; - -import { DisableNovuIntegrationCommand } from './disable-novu-integration.command'; -import { ChannelTypeEnum, EmailProviderIdEnum, ProvidersIdEnum, SmsProviderIdEnum } from '@novu/shared'; - -@Injectable() -export class DisableNovuIntegration { - private channelProviderIdMap = new Map(); - - constructor(private integrationRepository: IntegrationRepository) { - this.channelProviderIdMap.set(ChannelTypeEnum.EMAIL, EmailProviderIdEnum.Novu); - this.channelProviderIdMap.set(ChannelTypeEnum.SMS, SmsProviderIdEnum.Novu); - } - - async execute(command: DisableNovuIntegrationCommand): Promise { - const novuProviderId = this.channelProviderIdMap.get(command.channel); - - if (!novuProviderId) { - return; - } - - if (command.providerId === novuProviderId) { - return; - } - - await this.integrationRepository.update( - { _environmentId: command.environmentId, providerId: novuProviderId, channel: command.channel }, - { $set: { active: false, primary: false, priority: 0 } } - ); - } -} diff --git a/apps/api/src/app/integrations/usecases/index.ts b/apps/api/src/app/integrations/usecases/index.ts index 3a236504c10..e93e2fecdf3 100644 --- a/apps/api/src/app/integrations/usecases/index.ts +++ b/apps/api/src/app/integrations/usecases/index.ts @@ -10,14 +10,12 @@ import { CreateIntegration } from './create-integration/create-integration.useca import { GetIntegrations } from './get-integrations/get-integrations.usecase'; import { UpdateIntegration } from './update-integration/update-integration.usecase'; import { RemoveIntegration } from './remove-integration/remove-integration.usecase'; -import { DeactivateSimilarChannelIntegrations } from './deactivate-integration/deactivate-integration.usecase'; import { GetActiveIntegrations } from './get-active-integration/get-active-integration.usecase'; import { CheckIntegration } from './check-integration/check-integration.usecase'; import { CheckIntegrationEMail } from './check-integration/check-integration-email.usecase'; import { GetInAppActivated } from './get-in-app-activated/get-in-app-activated.usecase'; import { SetIntegrationAsPrimary } from './set-integration-as-primary/set-integration-as-primary.usecase'; import { CreateNovuIntegrations } from './create-novu-integrations/create-novu-integrations.usecase'; -import { DisableNovuIntegration } from './disable-novu-integration/disable-novu-integration.usecase'; export const USE_CASES = [ GetInAppActivated, @@ -30,11 +28,9 @@ export const USE_CASES = [ GetDecryptedIntegrations, UpdateIntegration, RemoveIntegration, - DeactivateSimilarChannelIntegrations, CheckIntegration, CheckIntegrationEMail, CalculateLimitNovuIntegration, SetIntegrationAsPrimary, CreateNovuIntegrations, - DisableNovuIntegration, ]; diff --git a/apps/api/src/app/integrations/usecases/remove-integration/remove-integration.usecase.ts b/apps/api/src/app/integrations/usecases/remove-integration/remove-integration.usecase.ts index 38c152ec264..6084be4cbb2 100644 --- a/apps/api/src/app/integrations/usecases/remove-integration/remove-integration.usecase.ts +++ b/apps/api/src/app/integrations/usecases/remove-integration/remove-integration.usecase.ts @@ -1,12 +1,7 @@ import { Injectable, NotFoundException, Scope } from '@nestjs/common'; import { IntegrationRepository, DalException } from '@novu/dal'; import { CHANNELS_WITH_PRIMARY } from '@novu/shared'; -import { - buildIntegrationKey, - FeatureFlagCommand, - GetIsMultiProviderConfigurationEnabled, - InvalidateCacheService, -} from '@novu/application-generic'; +import { buildIntegrationKey, InvalidateCacheService } from '@novu/application-generic'; import { RemoveIntegrationCommand } from './remove-integration.command'; import { ApiException } from '../../../shared/exceptions/api.exception'; @@ -15,11 +10,7 @@ import { ApiException } from '../../../shared/exceptions/api.exception'; scope: Scope.REQUEST, }) export class RemoveIntegration { - constructor( - private invalidateCache: InvalidateCacheService, - private integrationRepository: IntegrationRepository, - private getIsMultiProviderConfigurationEnabled: GetIsMultiProviderConfigurationEnabled - ) {} + constructor(private invalidateCache: InvalidateCacheService, private integrationRepository: IntegrationRepository) {} async execute(command: RemoveIntegrationCommand) { try { @@ -42,16 +33,8 @@ export class RemoveIntegration { _organizationId: existingIntegration._organizationId, }); - const isMultiProviderConfigurationEnabled = await this.getIsMultiProviderConfigurationEnabled.execute( - FeatureFlagCommand.create({ - userId: command.userId, - organizationId: command.organizationId, - environmentId: command.environmentId, - }) - ); - const isChannelSupportsPrimary = CHANNELS_WITH_PRIMARY.includes(existingIntegration.channel); - if (isMultiProviderConfigurationEnabled && isChannelSupportsPrimary) { + if (isChannelSupportsPrimary) { await this.integrationRepository.recalculatePriorityForAllActive({ _organizationId: existingIntegration._organizationId, _environmentId: existingIntegration._environmentId, diff --git a/apps/api/src/app/integrations/usecases/set-integration-as-primary/set-integration-as-primary.usecase.ts b/apps/api/src/app/integrations/usecases/set-integration-as-primary/set-integration-as-primary.usecase.ts index 88dd39d424f..316435be89c 100644 --- a/apps/api/src/app/integrations/usecases/set-integration-as-primary/set-integration-as-primary.usecase.ts +++ b/apps/api/src/app/integrations/usecases/set-integration-as-primary/set-integration-as-primary.usecase.ts @@ -1,13 +1,7 @@ import { Injectable, NotFoundException, Logger, BadRequestException } from '@nestjs/common'; import { IntegrationEntity, IntegrationRepository } from '@novu/dal'; import { CHANNELS_WITH_PRIMARY } from '@novu/shared'; -import { - AnalyticsService, - buildIntegrationKey, - FeatureFlagCommand, - GetIsMultiProviderConfigurationEnabled, - InvalidateCacheService, -} from '@novu/application-generic'; +import { AnalyticsService, buildIntegrationKey, InvalidateCacheService } from '@novu/application-generic'; import { SetIntegrationAsPrimaryCommand } from './set-integration-as-primary.command'; @@ -16,8 +10,7 @@ export class SetIntegrationAsPrimary { constructor( private invalidateCache: InvalidateCacheService, private integrationRepository: IntegrationRepository, - private analyticsService: AnalyticsService, - private getIsMultiProviderConfigurationEnabled: GetIsMultiProviderConfigurationEnabled + private analyticsService: AnalyticsService ) {} private async updatePrimaryFlag({ existingIntegration }: { existingIntegration: IntegrationEntity }) { @@ -68,14 +61,7 @@ export class SetIntegrationAsPrimary { } const { _organizationId, _environmentId, channel, providerId } = existingIntegration; - const isMultiProviderConfigurationEnabled = await this.getIsMultiProviderConfigurationEnabled.execute( - FeatureFlagCommand.create({ - userId: command.userId, - organizationId: _organizationId, - environmentId: _environmentId, - }) - ); - if (!isMultiProviderConfigurationEnabled || existingIntegration.primary) { + if (existingIntegration.primary) { return existingIntegration; } diff --git a/apps/api/src/app/integrations/usecases/update-integration/update-integration.usecase.ts b/apps/api/src/app/integrations/usecases/update-integration/update-integration.usecase.ts index 52c36906818..c36738cba9e 100644 --- a/apps/api/src/app/integrations/usecases/update-integration/update-integration.usecase.ts +++ b/apps/api/src/app/integrations/usecases/update-integration/update-integration.usecase.ts @@ -5,13 +5,10 @@ import { encryptCredentials, buildIntegrationKey, InvalidateCacheService, - GetIsMultiProviderConfigurationEnabled, - FeatureFlagCommand, } from '@novu/application-generic'; -import { ChannelTypeEnum, CHANNELS_WITH_PRIMARY } from '@novu/shared'; +import { CHANNELS_WITH_PRIMARY } from '@novu/shared'; import { UpdateIntegrationCommand } from './update-integration.command'; -import { DeactivateSimilarChannelIntegrations } from '../deactivate-integration/deactivate-integration.usecase'; import { CheckIntegration } from '../check-integration/check-integration.usecase'; import { CheckIntegrationCommand } from '../check-integration/check-integration.command'; @@ -22,9 +19,7 @@ export class UpdateIntegration { constructor( private invalidateCache: InvalidateCacheService, private integrationRepository: IntegrationRepository, - private deactivateSimilarChannelIntegrations: DeactivateSimilarChannelIntegrations, - private analyticsService: AnalyticsService, - private getIsMultiProviderConfigurationEnabled: GetIsMultiProviderConfigurationEnabled + private analyticsService: AnalyticsService ) {} private async calculatePriorityAndPrimaryForActive({ @@ -180,18 +175,10 @@ export class UpdateIntegration { throw new BadRequestException('No properties found for update'); } - const isMultiProviderConfigurationEnabled = await this.getIsMultiProviderConfigurationEnabled.execute( - FeatureFlagCommand.create({ - userId: command.userId, - organizationId: command.organizationId, - environmentId: command.userEnvironmentId, - }) - ); - const haveConditions = updatePayload.conditions && updatePayload.conditions?.length > 0; const isChannelSupportsPrimary = CHANNELS_WITH_PRIMARY.includes(existingIntegration.channel); - if (isMultiProviderConfigurationEnabled && isActiveChanged && isChannelSupportsPrimary) { + if (isActiveChanged && isChannelSupportsPrimary) { const { primary, priority } = await this.calculatePriorityAndPrimary({ existingIntegration, active: !!command.active, @@ -225,20 +212,6 @@ export class UpdateIntegration { }); } - if ( - !isMultiProviderConfigurationEnabled && - command.active && - ![ChannelTypeEnum.CHAT, ChannelTypeEnum.PUSH].includes(existingIntegration.channel) - ) { - await this.deactivateSimilarChannelIntegrations.execute({ - environmentId, - organizationId: command.organizationId, - integrationId: command.integrationId, - channel: existingIntegration.channel, - userId: command.userId, - }); - } - const updatedIntegration = await this.integrationRepository.findOne({ _id: command.integrationId, _environmentId: environmentId, diff --git a/apps/api/src/app/organization/dtos/member-response.dto.ts b/apps/api/src/app/organization/dtos/member-response.dto.ts new file mode 100644 index 00000000000..1aebd1ec48e --- /dev/null +++ b/apps/api/src/app/organization/dtos/member-response.dto.ts @@ -0,0 +1,78 @@ +import { MemberRoleEnum, MemberStatusEnum } from '@novu/shared'; +import { IsArray, IsDate, IsObject, IsString, IsEnum } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class MemberUserDto { + @ApiProperty() + @IsString() + _id: string; + + @ApiProperty() + @IsString() + firstName: string; + + @ApiProperty() + @IsString() + lastName: string; + + @ApiProperty() + @IsString() + email: string; +} + +export class MemberInviteDTO { + @ApiProperty() + @IsString() + email: string; + + @ApiProperty() + @IsString() + token: string; + + @ApiProperty() + @IsDate() + invitationDate: Date; + + @ApiPropertyOptional() + @IsDate() + answerDate?: Date; + + @ApiProperty() + @IsString() + _inviterId: string; +} + +export class MemberResponseDto { + @ApiProperty() + @IsString() + _id: string; + + @ApiProperty() + @IsString() + _userId: string; + + @ApiPropertyOptional() + @IsObject() + user?: MemberUserDto; + + @ApiPropertyOptional({ + enum: MemberRoleEnum, + isArray: true, + }) + @IsEnum(MemberRoleEnum) + roles?: MemberRoleEnum; + + @ApiPropertyOptional() + @IsObject() + invite?: MemberInviteDTO; + + @ApiPropertyOptional({ + enum: { ...MemberStatusEnum }, + }) + @IsEnum(MemberStatusEnum) + memberStatus?: MemberStatusEnum; + + @ApiProperty() + @IsString() + _organizationId: string; +} diff --git a/apps/api/src/app/organization/dtos/organization-response.dto.ts b/apps/api/src/app/organization/dtos/organization-response.dto.ts new file mode 100644 index 00000000000..46f9c81becc --- /dev/null +++ b/apps/api/src/app/organization/dtos/organization-response.dto.ts @@ -0,0 +1,56 @@ +import { PartnerTypeEnum, DirectionEnum } from '@novu/dal'; +import { IsObject, IsArray, IsString, IsEnum } from 'class-validator'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { UpdateBrandingDetailsDto } from './update-branding-details.dto'; + +export class IPartnerConfigurationResponseDto { + @ApiPropertyOptional() + @IsArray() + @IsString({ each: true }) + projectIds?: string[]; + + @ApiProperty() + @IsString() + accessToken: string; + + @ApiProperty() + @IsString() + configurationId: string; + + @ApiPropertyOptional() + @IsString() + teamId: string; + + @ApiProperty({ + enum: { ...PartnerTypeEnum }, + description: 'Partner Type Enum', + }) + @IsEnum(PartnerTypeEnum) + partnerType: PartnerTypeEnum; +} + +export class OrganizationBrandingResponseDto extends UpdateBrandingDetailsDto { + @ApiPropertyOptional({ + enum: { ...DirectionEnum }, + }) + @IsString() + direction?: DirectionEnum; +} + +export class OrganizationResponseDto { + @ApiProperty() + @IsString() + name: string; + + @ApiPropertyOptional() + @IsString() + logo?: string; + + @ApiProperty() + @IsObject() + branding: OrganizationBrandingResponseDto; + + @ApiPropertyOptional() + @IsObject() + partnerConfigurations: IPartnerConfigurationResponseDto[]; +} diff --git a/apps/api/src/app/organization/organization.controller.ts b/apps/api/src/app/organization/organization.controller.ts index aa739fe9468..9a92742186f 100644 --- a/apps/api/src/app/organization/organization.controller.ts +++ b/apps/api/src/app/organization/organization.controller.ts @@ -13,7 +13,7 @@ import { } from '@nestjs/common'; import { OrganizationEntity } from '@novu/dal'; import { IJwtPayload, MemberRoleEnum } from '@novu/shared'; -import { ApiExcludeController, ApiTags } from '@nestjs/swagger'; +import { ApiTags, ApiOperation, ApiParam } from '@nestjs/swagger'; import { Roles } from '../auth/framework/roles.decorator'; import { UserSession } from '../shared/framework/user.decorator'; import { CreateOrganizationDto } from './dtos/create-organization.dto'; @@ -39,12 +39,14 @@ import { RenameOrganization } from './usecases/rename-organization/rename-organi import { RenameOrganizationDto } from './dtos/rename-organization.dto'; import { UpdateBrandingDetailsDto } from './dtos/update-branding-details.dto'; import { UpdateMemberRolesDto } from './dtos/update-member-roles.dto'; - +import { ExternalApiAccessible } from '../auth/framework/external-api.decorator'; +import { ApiResponse } from '../shared/framework/response.decorator'; +import { OrganizationBrandingResponseDto, OrganizationResponseDto } from './dtos/organization-response.dto'; +import { MemberResponseDto } from './dtos/member-response.dto'; @Controller('/organizations') @UseInterceptors(ClassSerializerInterceptor) @UseGuards(JwtAuthGuard) @ApiTags('Organizations') -@ApiExcludeController() export class OrganizationController { constructor( private createOrganizationUsecase: CreateOrganization, @@ -58,6 +60,11 @@ export class OrganizationController { ) {} @Post('/') + @ExternalApiAccessible() + @ApiResponse(OrganizationResponseDto, 201) + @ApiOperation({ + summary: 'Create an organization', + }) async createOrganization( @UserSession() user: IJwtPayload, @Body() body: CreateOrganizationDto @@ -72,6 +79,11 @@ export class OrganizationController { } @Get('/') + @ExternalApiAccessible() + @ApiResponse(OrganizationResponseDto, 200, true) + @ApiOperation({ + summary: 'Fetch all organizations', + }) async getOrganizations(@UserSession() user: IJwtPayload): Promise { const command = GetOrganizationsCommand.create({ userId: user._id, @@ -81,6 +93,11 @@ export class OrganizationController { } @Get('/me') + @ExternalApiAccessible() + @ApiResponse(OrganizationResponseDto) + @ApiOperation({ + summary: 'Fetch current organization details', + }) async getMyOrganization(@UserSession() user: IJwtPayload): Promise { const command = GetMyOrganizationCommand.create({ userId: user._id, @@ -91,7 +108,13 @@ export class OrganizationController { } @Delete('/members/:memberId') + @ExternalApiAccessible() @Roles(MemberRoleEnum.ADMIN) + @ApiResponse(MemberResponseDto) + @ApiOperation({ + summary: 'Remove a member from organization using memberId', + }) + @ApiParam({ name: 'memberId', type: String, required: true }) async removeMember(@UserSession() user: IJwtPayload, @Param('memberId') memberId: string) { return await this.removeMemberUsecase.execute( RemoveMemberCommand.create({ @@ -103,7 +126,13 @@ export class OrganizationController { } @Put('/members/:memberId/roles') + @ExternalApiAccessible() @Roles(MemberRoleEnum.ADMIN) + @ApiResponse(MemberResponseDto) + @ApiOperation({ + summary: 'Update a member role to admin', + }) + @ApiParam({ name: 'memberId', type: String, required: true }) async updateMemberRoles( @UserSession() user: IJwtPayload, @Param('memberId') memberId: string, @@ -120,6 +149,11 @@ export class OrganizationController { } @Get('/members') + @ExternalApiAccessible() + @ApiResponse(MemberResponseDto, 200, true) + @ApiOperation({ + summary: 'Fetch all members of current organizations', + }) async getMember(@UserSession() user: IJwtPayload) { return await this.getMembers.execute( GetMembersCommand.create({ @@ -130,19 +164,12 @@ export class OrganizationController { ); } - @Post('/members/invite') - @Roles(MemberRoleEnum.ADMIN) - async inviteMember(@UserSession() user: IJwtPayload) { - return await this.getMembers.execute( - GetMembersCommand.create({ - user, - userId: user._id, - organizationId: user.organizationId, - }) - ); - } - @Put('/branding') + @ExternalApiAccessible() + @ApiResponse(OrganizationBrandingResponseDto) + @ApiOperation({ + summary: 'Update organization branding details', + }) async updateBrandingDetails(@UserSession() user: IJwtPayload, @Body() body: UpdateBrandingDetailsDto) { return await this.updateBrandingDetailsUsecase.execute( UpdateBrandingDetailsCommand.create({ @@ -158,7 +185,12 @@ export class OrganizationController { } @Patch('/') + @ExternalApiAccessible() @Roles(MemberRoleEnum.ADMIN) + @ApiResponse(RenameOrganizationDto) + @ApiOperation({ + summary: 'Rename organization name', + }) async renameOrganization(@UserSession() user: IJwtPayload, @Body() body: RenameOrganizationDto) { return await this.renameOrganizationUsecase.execute( RenameOrganizationCommand.create({ diff --git a/apps/api/src/app/organization/organization.module.ts b/apps/api/src/app/organization/organization.module.ts index 5cc77ed1573..9e058638c81 100644 --- a/apps/api/src/app/organization/organization.module.ts +++ b/apps/api/src/app/organization/organization.module.ts @@ -1,4 +1,4 @@ -import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; +import { MiddlewareConsumer, Module, NestModule, RequestMethod, forwardRef } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { EnvironmentsModule } from '../environments/environments.module'; import { IntegrationModule } from '../integrations/integrations.module'; @@ -6,9 +6,10 @@ import { SharedModule } from '../shared/shared.module'; import { UserModule } from '../user/user.module'; import { OrganizationController } from './organization.controller'; import { USE_CASES } from './usecases'; +import { AuthModule } from '../auth/auth.module'; @Module({ - imports: [SharedModule, UserModule, EnvironmentsModule, IntegrationModule], + imports: [SharedModule, UserModule, EnvironmentsModule, IntegrationModule, forwardRef(() => AuthModule)], controllers: [OrganizationController], providers: [...USE_CASES], exports: [...USE_CASES], diff --git a/apps/api/src/app/organization/usecases/membership/get-members/get-members.usecase.ts b/apps/api/src/app/organization/usecases/membership/get-members/get-members.usecase.ts index f60a885af8e..b51ffc67604 100644 --- a/apps/api/src/app/organization/usecases/membership/get-members/get-members.usecase.ts +++ b/apps/api/src/app/organization/usecases/membership/get-members/get-members.usecase.ts @@ -1,5 +1,5 @@ import { Injectable, Scope } from '@nestjs/common'; -import { OrganizationRepository, MemberRepository } from '@novu/dal'; +import { MemberRepository } from '@novu/dal'; import { MemberRoleEnum, MemberStatusEnum } from '@novu/shared'; import { GetMembersCommand } from './get-members.command'; @@ -7,7 +7,7 @@ import { GetMembersCommand } from './get-members.command'; scope: Scope.REQUEST, }) export class GetMembers { - constructor(private organizationRepository: OrganizationRepository, private membersRepository: MemberRepository) {} + constructor(private membersRepository: MemberRepository) {} async execute(command: GetMembersCommand) { return (await this.membersRepository.getOrganizationMembers(command.organizationId)) diff --git a/apps/api/src/app/shared/framework/idempotency.interceptor.ts b/apps/api/src/app/shared/framework/idempotency.interceptor.ts new file mode 100644 index 00000000000..566824c0cd0 --- /dev/null +++ b/apps/api/src/app/shared/framework/idempotency.interceptor.ts @@ -0,0 +1,247 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, + Logger, + HttpException, + InternalServerErrorException, + ServiceUnavailableException, + UnprocessableEntityException, + BadRequestException, + ConflictException, +} from '@nestjs/common'; +import { CacheService } from '@novu/application-generic'; +import { Observable, of, throwError } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; +import { createHash } from 'crypto'; +import * as jwt from 'jsonwebtoken'; +import { IJwtPayload } from '@novu/shared'; + +const LOG_CONTEXT = 'IdempotencyInterceptor'; +const IDEMPOTENCY_CACHE_TTL = 60 * 60 * 24; //24h +const IDEMPOTENCY_PROGRESS_TTL = 60 * 5; //5min + +const HEADER_KEYS = { + IDEMPOTENCY_KEY: 'Idempotency-Key', + RETRY_AFTER: 'Retry-After', + IDEMPOTENCY_REPLAY: 'Idempotency-Replay', + LINK: 'Link', +}; + +const DOCS_LINK = 'docs.novu.co/idempotency'; + +enum ReqStatusEnum { + PROGRESS = 'in-progress', + SUCCESS = 'success', + ERROR = 'error', +} + +@Injectable() +export class IdempotencyInterceptor implements NestInterceptor { + constructor(private readonly cacheService: CacheService) {} + + async intercept(context: ExecutionContext, next: CallHandler): Promise> { + const request = context.switchToHttp().getRequest(); + const idempotencyKey = this.getIdempotencyKey(context); + const isEnabled = process.env.IS_API_IDEMPOTENCY_ENABLED == 'true'; + if (!isEnabled || !idempotencyKey || !['post', 'patch'].includes(request.method.toLowerCase())) { + return next.handle(); + } + if (idempotencyKey?.length > 255) { + return throwError( + () => + new BadRequestException( + `idempotencyKey "${idempotencyKey}" has exceeded the maximum allowed length of 255 characters` + ) + ); + } + const cacheKey = this.getCacheKey(context); + + try { + const bodyHash = this.hashRequestBody(request.body); + //if 1st time we are seeing the request, marks the request as in-progress if not, does nothing + const isNewReq = await this.setCache( + cacheKey, + { status: ReqStatusEnum.PROGRESS, bodyHash }, + IDEMPOTENCY_PROGRESS_TTL, + true + ); + // Check if the idempotency key is in the cache + if (isNewReq) { + return await this.handleNewRequest(context, next, bodyHash); + } else { + return await this.handlerDuplicateRequest(context, bodyHash); + } + } catch (err) { + Logger.warn( + `An error occurred while making idempotency check, key:${idempotencyKey}. error: ${err.message}`, + LOG_CONTEXT + ); + if (err instanceof HttpException) { + return throwError(() => err); + } + } + + //something unexpected happened, both cached response and handler did not execute as expected + return throwError(() => new ServiceUnavailableException()); + } + + private getIdempotencyKey(context: ExecutionContext): string | undefined { + const request = context.switchToHttp().getRequest(); + + return request.headers[HEADER_KEYS.IDEMPOTENCY_KEY.toLocaleLowerCase()]; + } + + private getReqUser(context: ExecutionContext): IJwtPayload | null { + const req = context.switchToHttp().getRequest(); + if (req?.user?.organizationId) { + return req.user; + } + if (req.headers?.authorization?.length) { + const token = req.headers.authorization.split(' ')[1]; + if (token) { + return jwt.decode(token); + } + } + + return null; + } + + private getCacheKey(context: ExecutionContext): string { + const { organizationId } = this.getReqUser(context) || {}; + const env = process.env.NODE_ENV; + + return `${env}-${organizationId}-${this.getIdempotencyKey(context)}`; + } + + async setCache( + key: string, + val: { status: ReqStatusEnum; bodyHash: string; data?: any; statusCode?: number }, + ttl: number, + ifNotExists?: boolean + ): Promise { + try { + if (ifNotExists) { + return await this.cacheService.setIfNotExist(key, JSON.stringify(val), { ttl }); + } + await this.cacheService.set(key, JSON.stringify(val), { ttl }); + } catch (err) { + Logger.warn(`An error occurred while setting idempotency cache, key:${key} error: ${err.message}`, LOG_CONTEXT); + } + + return null; + } + + private buildError(error: any): HttpException { + const statusCode = error.status || error.response?.statusCode || 500; + if (statusCode == 500 && !error.response) { + //some unhandled exception occurred + return new InternalServerErrorException(); + } + + return new HttpException(error.response || error.message, statusCode, error.response?.options); + } + + private setHeaders(response: any, headers: Record) { + Object.keys(headers).map((key) => { + if (headers[key]) { + response.set(key, headers[key]); + } + }); + } + + private hashRequestBody(body: object): string { + const hash = createHash('blake2s256'); + hash.update(Buffer.from(JSON.stringify(body))); + + return hash.digest('hex'); + } + + private async handlerDuplicateRequest(context: ExecutionContext, bodyHash: string): Promise> { + const cacheKey = this.getCacheKey(context); + const idempotencyKey = this.getIdempotencyKey(context)!; + const data = await this.cacheService.get(cacheKey); + this.setHeaders(context.switchToHttp().getResponse(), { [HEADER_KEYS.IDEMPOTENCY_KEY]: idempotencyKey }); + const parsed = JSON.parse(data); + if (parsed.status === ReqStatusEnum.PROGRESS) { + // api call is in progress, so client need to handle this case + Logger.error(`previous api call in progress rejecting the request. key:${idempotencyKey}`, LOG_CONTEXT); + this.setHeaders(context.switchToHttp().getResponse(), { + [HEADER_KEYS.RETRY_AFTER]: `1`, + [HEADER_KEYS.LINK]: DOCS_LINK, + }); + + throw new ConflictException( + `Request with key "${idempotencyKey}" is currently being processed. Please retry after 1 second` + ); + } + if (bodyHash !== parsed.bodyHash) { + //different body sent than before + Logger.error(`idempotency key is being reused for different bodies. key:${idempotencyKey}`, LOG_CONTEXT); + this.setHeaders(context.switchToHttp().getResponse(), { + [HEADER_KEYS.LINK]: DOCS_LINK, + }); + + throw new UnprocessableEntityException( + `Request with key "${idempotencyKey}" is being reused for a different body` + ); + } + this.setHeaders(context.switchToHttp().getResponse(), { [HEADER_KEYS.IDEMPOTENCY_REPLAY]: 'true' }); + + //already seen the request return cached response + if (parsed.status === ReqStatusEnum.ERROR) { + Logger.error(`returning cached error response. key:${idempotencyKey}`, LOG_CONTEXT); + + throw this.buildError(parsed.data); + } + + return of(parsed.data); + } + + private async handleNewRequest( + context: ExecutionContext, + next: CallHandler, + bodyHash: string + ): Promise> { + const cacheKey = this.getCacheKey(context); + const idempotencyKey = this.getIdempotencyKey(context)!; + + return next.handle().pipe( + map(async (response) => { + const httpResponse = context.switchToHttp().getResponse(); + const statusCode = httpResponse.statusCode; + + // Cache the success response and return it + await this.setCache( + cacheKey, + { status: ReqStatusEnum.SUCCESS, bodyHash, statusCode: statusCode, data: response }, + IDEMPOTENCY_CACHE_TTL + ); + Logger.verbose(`cached the success response for idempotency key:${idempotencyKey}`, LOG_CONTEXT); + this.setHeaders(httpResponse, { [HEADER_KEYS.IDEMPOTENCY_KEY]: idempotencyKey }); + + return response; + }), + catchError((err) => { + const httpException = this.buildError(err); + // Cache the error response and return it + const error = err instanceof HttpException ? err : httpException; + this.setCache( + cacheKey, + { + status: ReqStatusEnum.ERROR, + statusCode: httpException.getStatus(), + bodyHash, + data: error, + }, + IDEMPOTENCY_CACHE_TTL + ).catch(() => {}); + Logger.verbose(`cached the error response for idempotency key:${idempotencyKey}`, LOG_CONTEXT); + this.setHeaders(context.switchToHttp().getResponse(), { [HEADER_KEYS.IDEMPOTENCY_KEY]: idempotencyKey }); + + throw err; + }) + ); + } +} diff --git a/apps/api/src/app/shared/helpers/content.service.spec.ts b/apps/api/src/app/shared/helpers/content.service.spec.ts index 70f80455447..32984c527b1 100644 --- a/apps/api/src/app/shared/helpers/content.service.spec.ts +++ b/apps/api/src/app/shared/helpers/content.service.spec.ts @@ -3,6 +3,8 @@ import { DelayTypeEnum, DigestTypeEnum, DigestUnitEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, FilterPartTypeEnum, StepTypeEnum, TriggerContextTypeEnum, @@ -292,13 +294,13 @@ describe('ContentService', function () { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.PAYLOAD, field: 'counter', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, diff --git a/apps/api/src/app/shared/shared.module.ts b/apps/api/src/app/shared/shared.module.ts index eadfc5b2318..ebd6c710093 100644 --- a/apps/api/src/app/shared/shared.module.ts +++ b/apps/api/src/app/shared/shared.module.ts @@ -32,7 +32,6 @@ import { DalServiceHealthIndicator, distributedLockService, featureFlagsService, - getIsMultiProviderConfigurationEnabled, getIsTopicNotificationEnabled, InvalidateCacheService, LoggerModule, @@ -85,7 +84,6 @@ const PROVIDERS = [ DalServiceHealthIndicator, distributedLockService, featureFlagsService, - getIsMultiProviderConfigurationEnabled, getIsTopicNotificationEnabled, InvalidateCacheService, storageService, diff --git a/apps/api/src/app/testing/dtos/idempotency.dto.ts b/apps/api/src/app/testing/dtos/idempotency.dto.ts new file mode 100644 index 00000000000..6f885116da1 --- /dev/null +++ b/apps/api/src/app/testing/dtos/idempotency.dto.ts @@ -0,0 +1,3 @@ +export class IdempotencyBodyDto { + data: number; +} diff --git a/apps/api/src/app/testing/testing.controller.ts b/apps/api/src/app/testing/testing.controller.ts index f23c67f0e76..1939ca49148 100644 --- a/apps/api/src/app/testing/testing.controller.ts +++ b/apps/api/src/app/testing/testing.controller.ts @@ -1,12 +1,16 @@ -import { Body, Controller, NotFoundException, Post } from '@nestjs/common'; +import { Body, Controller, Get, HttpException, NotFoundException, Post, UseGuards } from '@nestjs/common'; import { DalService } from '@novu/dal'; import { IUserEntity } from '@novu/shared'; import { ISeedDataResponseDto, SeedDataBodyDto } from './dtos/seed-data.dto'; +import { IdempotencyBodyDto } from './dtos/idempotency.dto'; + import { SeedData } from './usecases/seed-data/seed-data.usecase'; import { SeedDataCommand } from './usecases/seed-data/seed-data.command'; import { CreateSession } from './usecases/create-session/create-session.usecase'; import { CreateSessionCommand } from './usecases/create-session/create-session.command'; import { ApiExcludeController } from '@nestjs/swagger'; +import { JwtAuthGuard } from '../auth/framework/auth.guard'; +import { ExternalApiAccessible } from '../auth/framework/external-api.decorator'; @Controller('/testing') @ApiExcludeController() @@ -47,4 +51,28 @@ export class TestingController { return await this.seedDataUsecase.execute(command); } + + @ExternalApiAccessible() + @UseGuards(JwtAuthGuard) + @Post('/idempotency') + async idempotency(@Body() body: IdempotencyBodyDto): Promise<{ number: number }> { + if (process.env.NODE_ENV !== 'test') throw new NotFoundException(); + + if (body.data > 300) { + throw new HttpException(`` + Math.random(), body.data); + } + if (body.data === 250) { + //for testing conflict + await new Promise((resolve) => setTimeout(resolve, 500)); + } + + return { number: Math.random() }; + } + + @Get('/idempotency') + async idempotencyGet(): Promise<{ number: number }> { + if (process.env.NODE_ENV !== 'test') throw new NotFoundException(); + + return { number: Math.random() }; + } } diff --git a/apps/api/src/app/widgets/dtos/update-subscriber-preference-response.dto.ts b/apps/api/src/app/widgets/dtos/update-subscriber-preference-response.dto.ts index f8ceb822b6a..b737785eaac 100644 --- a/apps/api/src/app/widgets/dtos/update-subscriber-preference-response.dto.ts +++ b/apps/api/src/app/widgets/dtos/update-subscriber-preference-response.dto.ts @@ -1,7 +1,99 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { PreferenceChannels } from '../../shared/dtos/preference-channels'; +import { + INotificationTrigger, + INotificationTriggerVariable, + ITemplateConfiguration, + ITriggerReservedVariable, + TemplateVariableTypeEnum, + TriggerContextTypeEnum, + TriggerTypeEnum, +} from '@novu/shared'; -class TemplateResponse { +class Preference { + @ApiProperty({ + description: 'Sets if the workflow is fully enabled for all channels or not for the subscriber.', + type: Boolean, + }) + enabled: boolean; + + @ApiProperty({ + type: PreferenceChannels, + description: 'Subscriber preferences for the different channels regarding this workflow', + }) + channels: PreferenceChannels; +} + +export class NotificationTriggerVariableResponse implements INotificationTriggerVariable { + @ApiProperty({ + type: String, + description: 'The name of the variable', + }) + name: string; + + @ApiPropertyOptional() + @ApiProperty({ + description: 'The value of the variable', + }) + value?: any; + + @ApiPropertyOptional() + @ApiProperty({ + type: TemplateVariableTypeEnum, + description: 'The type of the variable', + }) + type?: TemplateVariableTypeEnum; +} + +export class TriggerReservedVariableResponse implements ITriggerReservedVariable { + @ApiProperty({ + type: TriggerContextTypeEnum, + description: 'The type of the reserved variable', + }) + type: TriggerContextTypeEnum; + + @ApiProperty({ + type: Array, + description: 'The reserved variables of the trigger', + }) + variables: NotificationTriggerVariableResponse[]; +} + +export class NotificationTriggerResponse implements INotificationTrigger { + @ApiProperty({ + type: TriggerTypeEnum, + description: 'The type of the trigger', + }) + type: TriggerTypeEnum; + + @ApiProperty({ + type: String, + description: 'The identifier of the trigger', + }) + identifier: string; + + @ApiProperty({ + type: Array, + description: 'The variables of the trigger', + }) + variables: NotificationTriggerVariableResponse[]; + + @ApiPropertyOptional() + @ApiProperty({ + type: Array, + description: 'The subscriber variables of the trigger', + }) + subscriberVariables?: NotificationTriggerVariableResponse[]; + + @ApiPropertyOptional() + @ApiProperty({ + type: Array, + description: 'The reserved variables of the trigger', + }) + reservedVariables?: TriggerReservedVariableResponse[]; +} + +class TemplateResponse implements ITemplateConfiguration { @ApiProperty({ description: 'Unique identifier of the workflow', type: String, @@ -20,20 +112,12 @@ class TemplateResponse { type: Boolean, }) critical: boolean; -} -class Preference { @ApiProperty({ - description: 'Sets if the workflow is fully enabled for all channels or not for the subscriber.', - type: Boolean, + description: 'Triggers are the events that will trigger the workflow.', + type: Array, }) - enabled: boolean; - - @ApiProperty({ - type: PreferenceChannels, - description: 'Subscriber preferences for the different channels regarding this workflow', - }) - channels: PreferenceChannels; + triggers: NotificationTriggerResponse[]; } export class UpdateSubscriberPreferenceResponseDto { diff --git a/apps/api/src/app/widgets/e2e/get-subscriber-preference.e2e.ts b/apps/api/src/app/widgets/e2e/get-subscriber-preference.e2e.ts index 6751742fae6..9d04e5344c9 100644 --- a/apps/api/src/app/widgets/e2e/get-subscriber-preference.e2e.ts +++ b/apps/api/src/app/widgets/e2e/get-subscriber-preference.e2e.ts @@ -23,6 +23,11 @@ describe('GET /widget/preferences', function () { const data = response.data.data[0]; + expect(data.template.name).to.exist; + expect(data.template.tags[0]).to.equal('test-tag'); + expect(data.template.critical).to.equal(false); + expect(data.template.triggers[0].identifier).to.contains('test-event-'); + expect(data.preference.channels.email).to.equal(true); expect(data.preference.channels.in_app).to.equal(true); diff --git a/apps/api/src/app/workflows/e2e/create-notification-templates.e2e.ts b/apps/api/src/app/workflows/e2e/create-notification-templates.e2e.ts index 0f404d73e90..68cb6190a25 100644 --- a/apps/api/src/app/workflows/e2e/create-notification-templates.e2e.ts +++ b/apps/api/src/app/workflows/e2e/create-notification-templates.e2e.ts @@ -4,6 +4,8 @@ import { ChannelCTATypeEnum, ChannelTypeEnum, EmailBlockTypeEnum, + FieldLogicalOperatorEnum, + FieldOperatorEnum, StepTypeEnum, INotificationTemplate, TriggerTypeEnum, @@ -80,13 +82,13 @@ describe('Create Workflow - /workflows (POST)', async () => { { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, @@ -504,13 +506,13 @@ export async function createTemplateFromBlueprint({ { isNegated: false, type: 'GROUP', - value: 'AND', + value: FieldLogicalOperatorEnum.AND, children: [ { on: FilterPartTypeEnum.SUBSCRIBER, field: 'firstName', value: 'test value', - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, }, ], }, diff --git a/apps/api/src/bootstrap.ts b/apps/api/src/bootstrap.ts index 2aa6d7fcaf4..7cf551fb7b0 100644 --- a/apps/api/src/bootstrap.ts +++ b/apps/api/src/bootstrap.ts @@ -94,7 +94,7 @@ export async function bootstrap(expressApp?): Promise { const options = new DocumentBuilder() .setTitle('Novu API') - .setDescription('The Novu API description') + .setDescription('Open API Specification for Novu API') .setVersion('1.0') .addTag('Events') .addTag('Subscribers') @@ -111,6 +111,7 @@ export async function bootstrap(expressApp?): Promise { .addTag('Feeds') .addTag('Tenants') .addTag('Messages') + .addTag('Organizations') .addTag('Execution Details') .build(); const document = SwaggerModule.createDocument(app, options); diff --git a/apps/api/src/types/env.d.ts b/apps/api/src/types/env.d.ts index d5650e5ab3c..7f30bd31b6a 100644 --- a/apps/api/src/types/env.d.ts +++ b/apps/api/src/types/env.d.ts @@ -11,6 +11,7 @@ declare namespace NodeJS { NODE_ENV: 'test' | 'production' | 'dev' | 'ci' | 'local'; PORT: string; DISABLE_USER_REGISTRATION: 'true' | 'false'; + IS_API_IDEMPOTENCY_ENABLED: 'true' | 'false'; FRONT_BASE_URL: string; SENTRY_DSN: string; } diff --git a/apps/inbound-mail/package.json b/apps/inbound-mail/package.json index 6bed05dc73b..787391a1d27 100644 --- a/apps/inbound-mail/package.json +++ b/apps/inbound-mail/package.json @@ -1,6 +1,6 @@ { "name": "@novu/inbound-mail", - "version": "0.20.0", + "version": "0.21.0", "description": "", "author": "", "private": true, @@ -19,8 +19,8 @@ "test": "cross-env TS_NODE_COMPILER_OPTIONS='{\"strictNullChecks\": false}' TZ=UTC NODE_ENV=test E2E_RUNNER=true mocha --trace-warnings --timeout 10000 --require ts-node/register --exit --file e2e/setup.ts src/**/**/*.spec.ts" }, "dependencies": { - "@novu/application-generic": "^0.20.0", - "@novu/shared": "^0.20.0", + "@novu/application-generic": "^0.21.0", + "@novu/shared": "^0.21.0", "@sentry/node": "^7.12.1", "bluebird": "^2.9.30", "dotenv": "^8.6.0", @@ -39,7 +39,7 @@ "winston": "^3.9.0" }, "devDependencies": { - "@novu/testing": "^0.20.0", + "@novu/testing": "^0.21.0", "@types/chai": "^4.2.11", "@types/express": "^4.17.8", "@types/html-to-text": "^9.0.1", diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index bc8805a7a98..7572dff8472 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -15,6 +15,7 @@ COPY libs/dal ./libs/dal COPY libs/testing ./libs/testing COPY packages/client ./packages/client COPY libs/shared ./libs/shared +COPY libs/design-system ./libs/design-system COPY packages/notification-center ./packages/notification-center COPY packages/stateless ./packages/stateless COPY packages/node ./packages/node @@ -27,7 +28,7 @@ COPY pnpm-workspace.yaml . COPY pnpm-lock.yaml . RUN --mount=type=cache,id=pnpm-store-web,target=/root/.pnpm-store\ - pnpm install --reporter=silent + pnpm install --frozen-lockfile RUN pnpm add @babel/core -w diff --git a/apps/web/cypress/tests/integration-store.spec.ts b/apps/web/cypress/tests/integration-store.spec.ts deleted file mode 100644 index b09c8c906b9..00000000000 --- a/apps/web/cypress/tests/integration-store.spec.ts +++ /dev/null @@ -1,225 +0,0 @@ -// @ts-nocheck -import { ChannelTypeEnum, InAppProviderIdEnum } from '@novu/shared'; - -Cypress.on('window:before:load', (win) => { - win._cypress = { - ...win._cypress, - IS_MULTI_PROVIDER_CONFIGURATION_ENABLED: 'false', - }; -}); - -describe.skip('Integration store page', function () { - beforeEach(function () { - cy.initializeSession().as('session'); - }); - - describe('In App', () => { - it('should display in app card for connection', function () { - cy.intercept('*/integrations', { - data: [], - }); - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - cy.getByTestId('integration-group-in-app') - .getByTestId('integration-provider-card-novu') - .eq(0) - .get('[data-test-id="integration-provider-card-novu"] button') - .contains('Connect'); - }); - - it('should create integration on clicking connect', function () { - cy.intercept('*/integrations', { - data: [], - }); - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - cy.intercept( - { url: '*/integrations', method: 'post' }, - { - data: { - integrationId: 'test', - createdAt: new Date().toISOString(), - active: true, - channel: ChannelTypeEnum.IN_APP, - providerId: InAppProviderIdEnum.Novu, - }, - } - ).as('create-integration'); - - cy.getByTestId('integration-group-in-app') - .getByTestId('integration-provider-card-novu') - .eq(0) - .get('[data-test-id="integration-provider-card-novu"] button') - .click(); - - cy.wait('@create-integration'); - cy.contains('Select a framework'); - }); - - it('should show guide on clicking connect', function () { - cy.intercept('*/integrations', { - data: [], - }); - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - cy.intercept( - { url: '*/integrations', method: 'post' }, - { - data: { - integrationId: 'test', - createdAt: new Date().toISOString(), - active: true, - channel: ChannelTypeEnum.IN_APP, - providerId: InAppProviderIdEnum.Novu, - }, - } - ).as('create-integration'); - - cy.getByTestId('integration-group-in-app') - .getByTestId('integration-provider-card-novu') - .eq(0) - .get('[data-test-id="integration-provider-card-novu"] button') - .click(); - - cy.wait('@create-integration'); - cy.contains('Select a framework'); - cy.getByTestId('in-app-select-framework-react').click(); - cy.contains('React integration guide'); - cy.contains('Configure Later').click(); - cy.contains('In-App notification center'); - }); - - it('should display in app modal', function () { - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - cy.getByTestId('integration-group-in-app').getByTestId('integration-provider-card-novu').eq(0).click(); - - cy.getByTestId('connect-integration-form-active-text').contains('Active'); - cy.getByTestId('connect-integration-in-app-hmac-text').contains('Disabled'); - cy.getByTestId('connect-integration-in-app-hmac').click({ force: true }); - cy.getByTestId('connect-integration-in-app-hmac-text').contains('Active'); - - cy.getByTestId('connect-integration-form-submit').click(); - cy.visit('/integrations'); - cy.getByTestId('integration-group-in-app').getByTestId('integration-provider-card-novu').eq(0).click(); - cy.getByTestId('connect-integration-form-active-text').contains('Active'); - cy.getByTestId('connect-integration-in-app-hmac-text').contains('Active'); - }); - }); - - describe('Sendgrid', () => { - it('should display email available for connection', function () { - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - getFirstIntegrationCard().get('button').contains('Connect'); - }); - - it('should display integrated sendgrid provider', function () { - interceptSendgridIntegration(true); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('card-status-bar-active').contains('Active'); - }); - - it('should display not integrated sendgrid provider', function () { - interceptSendgridIntegration(false); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('card-status-bar-active').contains('Disabled'); - }); - - it('should display use credentials on settings modal', function () { - interceptSendgridIntegration(true); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('provider-card-settings-svg').click(); - - cy.getByTestId('apiKey').should('have.value', '123'); - cy.getByTestId('from').should('have.value', 'cypress'); - }); - }); - - describe('Nodemailer', () => { - it('should display email available for connection', function () { - cy.visit('/integrations'); - cy.location('pathname').should('equal', '/integrations'); - - getFirstIntegrationCard().get('button').contains('Connect'); - }); - - it('should display integrated nodemailer provider', function () { - interceptNodemailerIntegration(true); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('card-status-bar-active').contains('Active'); - }); - - it('should display not integrated sendgrid provider', function () { - interceptNodemailerIntegration(false); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('card-status-bar-active').contains('Disabled'); - }); - - it('should display use credentials on settings modal', function () { - interceptNodemailerIntegration(true); - - cy.visit('/integrations'); - - getFirstIntegrationCard().getByTestId('provider-card-settings-svg').click(); - - cy.getByTestId('from').should('have.value', 'cypress-nodemailer'); - cy.getByTestId('senderName').should('have.value', 'cypress-novu'); - cy.getByTestId('host').should('have.value', 'localhost.novu.co'); - }); - }); -}); - -function getFirstIntegrationCard() { - return cy.getByTestId('integration-group-email').getByTestId('integration-provider-card-sendgrid').eq(0); -} - -function interceptSendgridIntegration(isActive: boolean) { - cy.intercept('*/integrations', { - data: [ - { - channel: ChannelTypeEnum.EMAIL, - providerId: 'sendgrid', - active: isActive, - credentials: { apiKey: '123', from: 'cypress' }, - }, - ], - }); -} - -function interceptNodemailerIntegration(isActive: boolean) { - cy.intercept('*/integrations', { - data: [ - { - channel: ChannelTypeEnum.EMAIL, - providerId: 'nodemailer', - active: isActive, - credentials: { - from: 'cypress-nodemailer', - senderName: 'cypress-novu', - host: 'localhost.novu.co', - port: 587, - secure: true, - requireTls: true, - ignoreTls: false, - tlsOptions: { requireUnauthorized: false }, - }, - }, - ], - }); -} diff --git a/apps/web/cypress/tests/integrations-list-modal.spec.ts b/apps/web/cypress/tests/integrations-list-modal.spec.ts index e3a302e0f9c..5310510f31c 100644 --- a/apps/web/cypress/tests/integrations-list-modal.spec.ts +++ b/apps/web/cypress/tests/integrations-list-modal.spec.ts @@ -14,7 +14,6 @@ import { Cypress.on('window:before:load', (win) => { win._cypress = { ...win._cypress, - IS_MULTI_PROVIDER_CONFIGURATION_ENABLED: 'true', }; win.isDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches; }); diff --git a/apps/web/cypress/tests/integrations-list-page.spec.ts b/apps/web/cypress/tests/integrations-list-page.spec.ts index 03341a1623e..23684be8dc5 100644 --- a/apps/web/cypress/tests/integrations-list-page.spec.ts +++ b/apps/web/cypress/tests/integrations-list-page.spec.ts @@ -14,7 +14,6 @@ import { Cypress.on('window:before:load', (win) => { win._cypress = { ...win._cypress, - IS_MULTI_PROVIDER_CONFIGURATION_ENABLED: 'true', }; win.isDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches; }); diff --git a/apps/web/package.json b/apps/web/package.json index 4bbdb3e9208..c777753e62f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@novu/web", - "version": "0.20.0", + "version": "0.21.0", "private": true, "scripts": { "start": "cross-env PORT=4200 react-app-rewired start", @@ -49,9 +49,9 @@ "@mantine/notifications": "^5.7.1", "@mantine/prism": "^5.7.1", "@mantine/spotlight": "^5.7.1", - "@novu/design-system": "^0.20.0", - "@novu/notification-center": "^0.20.0", - "@novu/shared": "^0.20.0", + "@novu/design-system": "^0.21.0", + "@novu/notification-center": "^0.21.0", + "@novu/shared": "^0.21.0", "@segment/analytics-next": "^1.48.0", "@sentry/react": "^7.40.0", "@sentry/tracing": "^7.40.0", @@ -125,8 +125,8 @@ "@babel/preset-react": "^7.13.13", "@babel/preset-typescript": "^7.13.0", "@babel/runtime": "^7.20.13", - "@novu/dal": "^0.20.0", - "@novu/testing": "^0.20.0", + "@novu/dal": "^0.21.0", + "@novu/testing": "^0.21.0", "@storybook/addon-actions": "^7.4.2", "@storybook/addon-essentials": "^7.4.2", "@storybook/addon-links": "^7.4.2", @@ -147,10 +147,10 @@ "http-server": "^0.13.0", "less-loader": "4.1.0", "nodemon": "^3.0.1", - "react-scripts": "^5.0.1", "react-app-rewired": "^2.2.1", "react-error-overlay": "6.0.11", "react-joyride": "^2.5.3", + "react-scripts": "^5.0.1", "storybook": "^7.4.2", "typescript": "4.9.5", "webpack": "^5.74.0", @@ -185,4 +185,4 @@ } ] } -} \ No newline at end of file +} diff --git a/apps/web/public/static/images/providers/dark/bandwidth.png b/apps/web/public/static/images/providers/dark/bandwidth.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8cbb1edd26e6fa51214aaeaa75319d8e07d99e GIT binary patch literal 52502 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/static/images/providers/dark/generic-sms.svg b/apps/web/public/static/images/providers/dark/generic-sms.svg new file mode 100644 index 00000000000..87e11a06f5d --- /dev/null +++ b/apps/web/public/static/images/providers/dark/generic-sms.svg @@ -0,0 +1 @@ + diff --git a/apps/web/public/static/images/providers/dark/messagebird.png b/apps/web/public/static/images/providers/dark/messagebird.png new file mode 100644 index 0000000000000000000000000000000000000000..8222ddca5ddc52cecb59849db650127a6947bdf7 GIT binary patch literal 17841 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 \ No newline at end of file diff --git a/apps/web/public/static/images/providers/dark/simpletexting.png b/apps/web/public/static/images/providers/dark/simpletexting.png index a3de6c62d06fcdd055f99676b32f6550a8a09d46..3efb31e91ef050824ab59a33934eabbb0c84187f 100644 GIT binary patch literal 15414 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 S4!}br89ZJ6T-G@yGywqr>bB7U diff --git a/apps/web/public/static/images/providers/dark/square/generic-sms.svg b/apps/web/public/static/images/providers/dark/square/generic-sms.svg new file mode 100644 index 00000000000..87e11a06f5d --- /dev/null +++ b/apps/web/public/static/images/providers/dark/square/generic-sms.svg @@ -0,0 +1 @@ + diff --git a/apps/web/public/static/images/providers/dark/square/pushpad.svg b/apps/web/public/static/images/providers/dark/square/pushpad.svg new file mode 100644 index 00000000000..03ae25bac83 --- /dev/null +++ b/apps/web/public/static/images/providers/dark/square/pushpad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/static/images/providers/light/bandwidth.png b/apps/web/public/static/images/providers/light/bandwidth.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8cbb1edd26e6fa51214aaeaa75319d8e07d99e GIT binary patch literal 52502 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/static/images/providers/light/generic-sms.svg b/apps/web/public/static/images/providers/light/generic-sms.svg new file mode 100644 index 00000000000..f22ac13d527 --- /dev/null +++ b/apps/web/public/static/images/providers/light/generic-sms.svg @@ -0,0 +1 @@ + diff --git a/apps/web/public/static/images/providers/light/messagebird.png b/apps/web/public/static/images/providers/light/messagebird.png new file mode 100644 index 0000000000000000000000000000000000000000..8222ddca5ddc52cecb59849db650127a6947bdf7 GIT binary patch literal 17841 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 \ No newline at end of file diff --git a/apps/web/public/static/images/providers/light/simpletexting.png b/apps/web/public/static/images/providers/light/simpletexting.png index 7541832e7a1b3dd8a06729d9c4a98154c3ae1420..c01773f853b016935e6fe256cc405ca93870ef0a 100644 GIT binary patch literal 38062 zcmdp-1ydZ~)3$M0+--ry-Q9w_ySuw3ut0#|?vmgRKinm_YjC&4A-KCe`B%N4;_a%D zQ#CVnYNn^F``lMYsj0}K0f+%mP*7;{a#9*lP%ygx&O?w8{_XQozNG#;KznM)NF`<({L8VH{ONncNP0n-Re~>Qz z9-01o-_hZH*>0E|*FlFFB<2>4TUOH4G?PBgw5aQYv36ruJ};4^(V4m{MIjaC*Kpyo zZ2jiHwV{uMxjK0fj`qjZ)8lAL#L{-^dFqp&K$=VG2< zil&6VR-^xW`wHt{NRPy62DJEp#(9?AygQDNnwqLI{%1VHe&_tw!lKg%+d2W0AlX{F zfvLf!fJkOvPjE_~IUxR^Unlp}O0R*9@XGb_%t>@^Wkrt$YM4Ql1TZ=|!L-W{DYUOp zQ0G>TEbVgfGn-8MV25AoazVB zEuKz}j!i@aCsa8k8rhRb5Gv2v^KxI z`1<{CI5gPZ9ptmGBlT~~iQ-^PiEh!}@2 zHwNSJ`QIDfERb|#Fi5GG z4#bS<4;K@89v&DyzxN==&dXS7m-5qJS27RI9W})SFob!q$6Z*XVN;!xYCo5DKEm1A3{#gzGEiWXU4cq&ECg} z1+PwE@JytS#vuQ2lt3o(BxP*u92Rf|8XX<|!^+6IHM_ByHDKrjhsG%=ADPlH*EyNB zW!$lWt4mupFhpSbaQcqO)MM*TizN@O59O|xB(0H{rEcgCzAT)Yn)3SRH+@6iACLZM zG|Lc4W)*`ay+TeMe^DLdS*h@^MZJ6o@H4N+&qV^6-LFMLNf^%~Y~)U)pVVbvS}mSV z5d-JEkNFUX1Zh+ngm};G{m+BgbkEisNdh?qUVqiQjd>ili*}Mxm*XopV`dy8S*jzG zJ8O6{=DzkU2L8T$4cEmyDNKjn0S;-P9$}c(rD2|6UXH10(>Q+vun&!ROH^ ztRK1S=PC+DK4$EwlV&zQ9tRrmpIo3R5SM=_!32aU_ACGTm5qSeOaW-D8^T1`#fO*4 zE7X(FywhIz8fCq24Xjt-l|C2OmDpHS_&#_7gVfw$RJMokm#dNmM1`GF2a9!!O(c~_u zb2AQ~xEOU`Fj|gVJJ>lO~)^smBzptQr2Z5pb69pLqM?0c9~jj@uWOG&K+j);?v( zS#F}tLoZ~cfHePHDyZqt3`~86dp|vQb_ym69u0mSG)Q8nkhq?M@(eZ$ia<@Qco&}N z3f$>A{|7NX?2`N&>Kcynoa34ujD7>NT!nzzVU>*Qjixry0w*;yJY^BwXUNR%9Diox zO*r2_f8lZ%!h>ZN`Fy)vX!-V5FhU^LxSDPDOQ0}FrOyKnmpj&kh*Q0oKT1|o3b*ho zq*$L>Yw%$IwF+ObeP&LXGBn}Be4%EE*gq+tR6*xNJ$d1T%8QgNIg}D3xB8PyZ z{E82KuUMauIwk=!>~1z}m$W_kg{Q3rCnhQp`-@)pZg7XApoY~~R^NvfI;dpjVK zwapqHl?I7g9yxK{#UX`y!@GfI%jTA3}X+147F>2ylcI?UUT9M-V`nqB4x*+RHL07TU zcy3Fs7(U`Is$-IR(@>E)XASdX&LoLWZ7giK_rEXaxihZ#`M5p%LcW?kCbg8$4ppy- z;I5W7p1x_Uo?e9KgShi$cpUI?)6-)ujVr{aMIY?~>d@I20ZZ)oQ7aq%IyrT~sIqKD$~-p_jcvZ|=2 zu+1;cZD=>*9`IBW#vLMa%A7RU)TW1re&Oe!NlKE)h@7jF>`-@`6DVy_3xiV`@Ha1m zbG&^pmemotzs)R)z#tOMLZz~#Rm$C+WMhC0LRG+zUYVliBMdCBJiOXD`F8~|Bz&+5 z{)lEt#c0^kgHkbF|&tWSrg_2YP}^ZMuO1xIJ*FVskNh8ld9FGp*+W^c1@ zT3^lL(yGkjs>7T0&GcysC8E-7xl7vEFGUOTKYzcpXOcQQJ5LVp(7~0tj!sOlO-{1? z8u5sq=HYE-i3+7k)JeI+X7q}as1L8c)I;IzX8tUz-12=V_}?8uO$4~p*OoMhI}=mqWCcqNvnfaZr|4i@z8x#6|TXA2oVpoKkg9ZX@lw&NBH;m zdR_k#U{^r$uyUxQEqqPX)z`wd{PJnOjVmd;CV68A)eTa<$hn_Ze)8YUkq1N-Vbyo^ zy-tGPmuG8p#Xeok&R)z+KfOLhwpsaYy=DD6VE*=GpfV9`K6Lr{`y6f7T%#+S`%reE z%pHq)G8a7@jOdE^Uh;)gZIn$Jer3H4quaWcCmXc|B@|eMYJx68*A6-le+GOWnqIt; zb=ou{Ojz~C3c71+842@JweB}R)Ld|;dj`pwBdwS`!H;LC^`@5akB#2|&7l-vgTYjWMw13#3<1Y5>54!9y?(~&RqNgQuMmjQPccZw1pp(Ghv$QQ$FiV5dv?lMf01u+h^&;t>8IBa2qgT{b zT=nt0O!xi6j}If_Zw9~r;l`iJfG4Sq%)FZN>ox_rFl#3r!3DY%lBEylO-+n9VMMJ0t@7z#U31=x8-q^wG;si}!yI&3#Q0GpW$&vi(} z-Z4iHZwfg^cq8VL0IB4E;Bb`__M#D6fk#W|H%;PWtX3! zzp-(N`)HzgP|NjZYo1F*W!qN^pX-!pY&x1Sfm5$b$VbJFwb;Va5?OUs)rzUMzI*beiH?qkqYol8Tsp?k+fVe6(vPWWAC9zAK$^p|T6m3*jyOhWqC7=uw=`AW z6rrsxWR9Ee2I!QTl%Zd;?(=p5lVHQ(wp5~%t_0dG`>msgRBp7|J|=AnwUDniddjNm z9{m8U($bD_Rt##3n~xE^!ax&DUcbmu;?dz2TTvpZYZzpAykGT+Y~4S9_YZ$GFDWSK zemTFdyd>1sxy!kzS@N?~Z%jyy8e4_q#ZcD(4cn{tS7PxVpfjO_527 z6JMmwf#2;~y!>~-po*sw@^TK@?BFBpP*PHw!mh*V9B-&ns5D!#8jak0+0e}<#EvB7 z%lbB@liH@Fjx~yt->Eo+q#Q9|1T)#yNN!` z?>8b^^&fVKDq=yg%n?{D{$j16&ZOhCq~IK9Qq#dsyt238Y$wE%LFDSDIWleQYG}7i z|5vU{!Ij|FMS2LUG;qz6oK|{GU!MK70MC7AVHa}5^TFY1gj0%qX9lS_0s82gA}h(N7U$p_tg(?;xL+^HatLynFFL3$lB`OGhtav{aSJ%TMnu>vDXh%W5KtEp7 zieB783-IE<^J9w~hJd`EdMuBYwfok#M^ww}md{R>F=;2qf;dqsL&?$a_@3|bbb89mX2KU_2(GkJA6FPy5<}h3`m~~Vt>-ArKef2sf)?+ywpQWLu)gH`#cB4kG zLq-6fK#$Z}Dt>`#+f-LI>Yk3|y5qZ{vJTCDa*9qaeB~=E>sRTXIX{dZZPi~aAJciP z&t#e00K&&}{Vu`E>9wnD;6cLTEN`>>AQRBc(elBW;;T~EW4g*Z7l0B=GopWgn9 z^6>D8sqbNe>j*}<-R=1Chwh*%?$64jEos#Lz zM=<(tI{P_|V)ruYCR`l%^&L8DTWtrr{r#5E9^dTfaCGq^9#}^fp;2q8By_w~AZ<6- zNBX2S`oZ~A@xyyW$shrE^?eFEA|x08N!8qgLT1I0GcUue#eNrzh&RJ{pkP}~Sy{&f z|6*iOOl1dIVC57~$@iv6rq~2BR|A9V(DHc^_`T8w2A@4@Tb(F7MMb=}ed;jJ6|Lxl zy4>7C+zicr^UCc<{g6p*h1Y^j<=2*~T7k~MEj0(bDzyd%RuaD4dOaU*ooMQ4)KuI$ zKCmzlz_YBS6HHI`piOedn=b_GBr>*M587LQdJzhiZe?`=Iq&10JR!~nU-}5Y*i6Soe22UFqdE4qgxjq1DtzR06S$nB^d~9wJ64;3NYE=+S|nZ!+LzDhb1qa z_4t719)fx^KP0~IQ3UiAHU2{0UCVkR>DJqvhw6Py7%^{C#5BD(FX&y>+9u>#JYZt` zeKsqJS8Y1jUndjP1S87;=(EdB|6}~yd7|`_&_tFrF+(Vw#qhz-u;Wu9d`BvJ&MJ(a zn_7jHPG~Rc{&Xq87L-vlvL~Oz_nA%C(H?R%i(6!t0~HEeZQqcdZ1wrEwpjUT2Yx5S zOjsS$EM-xcp6co<5_0RFCXh>`cpJn+B^&h8O*C_yJbH?NpSe)Im}8Xqa=z z@wzzf>hOL)|LTCOso7<(S*rR8G=IvaW&Ll-pWoLpBzsh;*^PsPKl57OIl=~ zTn@oKXqtZF#O6cN*#^o6T&RBQAIs*TAKpht7pX2RXpzf5kqM~K*HE52m@lSaKLhb*s`9hWU#Y=Ey8T6x>==2Yq@KtbV80SbE87ZQ*x^91JPYb^p z-o@-R??<1yHkKaXnadg?A)YZ7TJX3t`|UJH#uI58S4lBbhx@zZiJn?3?7!%Y6xewHE?r2XrHAY;wKzJNGvfJLEmQVjI@DA(IvS2H5jt#XMbmv9wqS*#LLB&}^8a zP^&$Eckia=0UXB~4a0}dX4^#+)yMm<-lufr;+zeh9tyU94EM)Lg)%&BQt4Y#zYgtw z4e5dzfNBR!_8=Uv55t5-!bL5VXJG=<^LzL<;8YW-t?2D~J9KGAKd7UEvSB=``RPIp z_avgKnVUiS69Aknppe2*VV7Eb>`v0E|B=)M>P;tb=zd2XI8 zck^pZ>Po^pDohF39%o9*o*ud5XXRproY2nd{Zh)&_~<|3GwCAJZryngEiNtw+e{hU zT_jb6N9DiW_wCWMTGnG`a2K4}x^_LkOrzD3Q?jx3*v+NtZ`C@Vyh+d#!-#~zYpG1% zeMJfR+{s#!R^Cn9qgx|?lh>p%w(1LPyPJkUYFawb&$e2%ANipU|KtQFZ5}*dwhyPT z>PZF7(HdpJCuRQ?m9=+Mc6(u=zM$t=MA(2`!NFumWKiU!rU=^Kw`#u0{yIGzcPZ>y z6$C`}Jp5z0I!_P)%Zbs(9}@S+%{OWP=unGS>s++9y1IJxs)Eb=;w{G5Wg4Tx@$?7> zFi4LPrps*Ackpc||7SXmCe4oHLdQ}+uO9r0t8ff!3*5VYG>T_JuXbRg&wR%x&>=68 zi=k$wX)=??Hf%ZT`8@Mw$fBG|i)j~tJ`qB37v@}AdVa%;5vhr;=c`k|oa#y1E(5V=bDWcizlY=EoTqf~- z0TfW~X389jg?1dT0|&zZ1q67}gJ+hcdMHJ}*8TsvOT=*OY854A$1A(?*8079BYL}# zxUEU`g4`5cpVs&~Mob?Y6RD=5v49t_tYQPNxbM`Je#;--tshs-l0sV~3qGnt(H#Nq zfsSK~TN*56yb4uP);@BY*gO5C#mpw(>OP+HHZ*+9YQJD_q@|`d{jJ%0E9>J8;I(w; zN=20xtsJN*FD&Np;&qtVzSDmsqEEDEj`Co&An-%p^7=1VZ$8;NYdI$}^$NnFu^Zgf ze&2g>$?fdCrt@>{?giHI^M24>TEj%${d$GGv%Q)zH+|{~T?sX@6y5@3Vepp3#CN;8 z=l!Jz(IP=j?eP0?6x!x@af9q{m_&g1Y-}p|g7!rJ0e{oAm*E~$_RfIF-TH%rz3GmN z7O|7Nv;as7srM1JeJ73+8mv1s)Au_k^#msF6^CqUf+8>wQX(c4IerCd(Xvpd9K=4= zVcB`et(r-yu67l@?hVQ@Okkpq2sWAL3z#cTK0Y$4C`~Y3_$d&`+i4lmuXo=cGA?E$ zOZ4A}Wt(~%ADSznB<3UOt9|~6yhxr{77V)Rj)1zQWx)6k&~}lrxOZpSJWja~X3fUi zNl;wn*46#}192IlHnm5Ox|pu)D_K@pRJjK(j9#!7Mn4pAWK~X6afD~SbW+a-Od4hu zE~%K$D5ig924XRrJyR2G-V2aBDN{*(|LEov6psrn~Fk;>pJfw@C zrljBVXtw!NT7M6mMan7BhS9|0rj3iJ#yRs|NGKN3BCBD=enV{a3*_DVt1&TAA0l0G zDp-2mvcOk5{i{n$^e>eef|C<=+5EAA`z&71gY0pj?qc(#&31+l1RWXUf;5cOX7~wl z7&;}YknX?G?Ezv;z?)gPGU%4pEqgIX!l0ww)A#LKcFM5+rspmu8{z6ZA}ek<5^-&92t76~$c+`%P$5(a&_GZbbEoe?8o^cD zzUFxkJI&nna>(W>+?fg;3=_DVHT@+6YpwO4ULAi6VJl=kv;(OLxDf?2(aQlds1&PG%n`MkK3dbH;aqB z+k*zl(ixA)G_?uiQYU(jj`=PGsb?Pn1dH53rGDp2;0nY(_i3ATn z2+iM^i$K#xfCZ?*Ug3gvLMIfI3*q;`Mgi-!L1(z!&SBCXFY5m^xp?3B6yf!pox8=+ zB_Z=biHZKXb^UHyy7~1}QJJgf<@O~QL3L zaG>7ld;N3(;uaBq{II1tNi4=J=o7XG^#B?(Gdl||Ww>p9o*;G6#`O93=$Y%A4Mg`c z(Dx(kr|FO(`vA~5me_r9MlFzb7yGml3s z6S#qm=F2mU2*F`6`1~jsjMLs^(y4mOon{kRoLkc0cjNDUGDCxjhDH*j-}z5%7q7_N zje=4tSSqs5mK!OY6i1j=Cd|!D>FP|6DkN&bqA~Gds>Ui}{uaFYt3Cx=_w`2rRZ2!i zTH|(hi7Hvef1kM^27Cx$7z!uMB!%h(**N4hvYtIk8s>^9ctYk|giN|bL_dJ(4#cIh zfN4MI@Ga4f*~QWR{AKm`KaHZ$^zLrP6%U?F5BL^*i2Qi`n2>Wmt?%(+%IKICKn#!t zUTHr@%mPaL^*ARx828luF#oB`UMsVRCei5$xEVS( z2pf^VQG78XstZ3Y?3@vg{2TEVD}oy)LpW8gDp|rPF&7BZgvsU;(rCH4xOM4z9Z_i| zp*-*Xdwz1_VDg@@WpfAIC{w^1U7)}T@gA3WnYW{}|E6m2#qofLj}Q_8=hZ#+a52>juZZf)X;M!XP&_o^ALfp0$1RORh<{+ST(<^pAt8b%lqr-kD>c&+QIVYBh|TpqRWM6D(;vO05^8?S5|&COhj0<<-nDmH{+L+ z%Yl(?Kc(QK#(pkEbdqBwmRlVw<2nhGtLm*B?{$oTwDhD5doU@Ung8B@P-TYnjLiFQ zL02>@RiRx`SRyQn|T+KnooJLZwE#)kz zQ|Yq%?CW%+yvivKE6HnYTv4va$_hc}SPdWNyvU_>N!hms=AS@xxMYxsWc$#^XH%}g zU;pN9qVHYZ3wH~5*14(0o1~=Y%26GJWNv!4YiAR#clw<3Ab@!(QU;qMzkmYG zB#6a-Gbd-5qHL(2$+fG<`b>E%QlQbESuAL2CQHJeK@RX;sD;e`Eubz5`Wc>G(By*R864iMHC03wXgTZ1`PgzCUYl!T2izmrOW_YIRMGdEWb*qR-2 z($q5~#IP&xhP_-mTWw)*AHvxC`g_y=)CpVxulHi1)+27T~;9?wekqZq4Kc-;4_5uZ5BkfV2s938p_^!WT~-n#D?E@>2& zsgdgb8R6c=I?tCMaX_(xv?2KMcXV%QA6Vt;W1)mwL zlfH`!83Ta!3q}#m;dh|>s0-`7tx{7D!Sj9zPWs;Mr2X|ae>YBh9wtYd*gmSL{Fk(5 z(@qD8)wCOb46x$R)2PPg0&%j+(AK`_grABXv!JsM|3I=$jvTjb?=whXAlKzLxo-tt z=k$ql(^)P=G7Vl{R_3w0&%MP@O~K?gijDClU7s%ICi*?z-KEDekqb?Xdm^@XbWE>c z-f0HyR@Bu!wO@4iCjN`GHjTE2_>i?D6zjS~_HXsj9N4cY;s~EE&dO;JB9GPRv_~zT zrgy?+rTJIhAdr}OSmC(2ZP;9JHeU|!hi-T7l?H-sU`@R zJ3ToCW)otXUs^w68u%jVO8_t8PyI5T--Z_YCQU;VhL}Z6g0aUIIg)ac!)tkw$5=tk z*05#_lBsimCqpB{$Xo88QLtBsFqXx=YJ2ORvQ;uAeALtzJY=-5RUBoJoaUaMI6Wi& z_mco{)9`3hT(a)p)kQiZ)XFeI*0`6 zaCJ38V^iD4*%+9zzOTauI$r(h3iT@eaV|?yzKnu{A|*1qAn#CDD$?q|88bIU5U}3x zQ7(EBxR)VY>E*II0|tNQ9##}Z7*;UF_a0HanY=^RE8h^ee5hEK>i9-#Lao=5vG$TT z+=rESfi_DkR?ZQqE0$?M`vc1^hhmq{n#b660h&!^o;1x;fRit5e+5TRXN#U zazS@HCdbib_@@ABT|zkXhu$xww&hpk4fT6bF^gE>_cyom7sS0VNqQSdE$)rcj4DX+~ z>gPOhvKVJvF5h~$k$OFA-*5Q*6l>qwMg468vOQ0E<0aM;`W0&7#EIU5qQ1!Ro&Fu; zs26|(saiY3SwoatLe(@yHy-7lVBy0|)XpuY?fYVR_VC5+6? z&->DccW7Ztb&DpSX7F_~bHC+miaZ}@5FPzYPY)LoT4S;jd%Qyq-mS>be|p)$)Lj(_ zYkdfAJ0Wk5&LPy6rnQIcqctz4ksPt;fqh)no}Hzj90v@y6;>`~`yHG)OSxS|s-r)f zEnodUb&a)uH@3Ex;SAsoAictDmqEe7d~}x%hf899nq&z2NVHbj-|o3XM@*eGtMO;S zxr`KI3G&fRK*K{mx9h>8N2~&ubh1pRE=ORJ&a^>#!KzI)F{pIBgPuvX{#Nhvh1woi zM+YgW1Z}9dL1KlTt>yI@wbt6k#)E^g6uJk1ySckCYdu&QSCBAZr3XrbHA(85QpHGf zcV(q#@4VD^P|fxsJ6Et)9BI}3yhub2x}PJ6Rs<8riU1`T9Y@$Jte2gYd30@O|Jd*0 za`W5P&Hy6cS1&K_5sO)Rboh%vgpKfi)27z4vZC%9FK=1LdBveHAHRl1&IUg}e|YdK zp(<8vYx{O^u(++RZeMCS&T4r3+P5dxuNbiTPN9Q~RjZ!5a*Utem^Wnj08RiQ^Y=%> z8~z`ZG()qx28r(@nd2eem#dAp&AGW3=-<7EcShjzm~a6IC#Q~&QUl$(w5pkySTy!J z?7*Gt4|TUfw~@BZ+0`@w>zmNx@Rv0{L>w}@J*5~XS6`XoyUL3vdFQ3DJRBCXwq#VF z?yBWo4UKF)OJfIjx5t;K7TL?qhq=ALDj^TEJaS6(VX8gc5%{tWhw|zwr;RRic(*Gcvo4j>@;O2{r0bi*JlrjnS8|Spv zN|!w(z2L7?DJh4n@$@7?85pG8=tS%*4E}SIqAxuU3qFc=5Q*EX8X6!7X2<+?QOa{| zNu=v}E8!g(Ey#WJ)$Ba0r{2Q$>gt8S&#U`d>2ygq@9g_!THr87^}DLPe1Lo+8}rY; zL;5Qf3dOKHAe~Qrh!9EM+lRCA>Bn_hclEUBTF3biop0;=sr%PWLsM{-?F34~w~&y_ zglCKzzk;2=L0xnezx(`D4c!hVDR@QjhB$)v_yjO@bHyVosZ|{+{Dx`x;Hz@2aCI{s zpnYhtRnD=Rid;V{VFwpGD_!0twu%h{Dc9#jm=jQ99o<;s?c9Tk!x;^3*L6Q-SFX=o zF}kh?FELyUZe_S4FS~1|rrg*uBSR%9vgKHjXi_hh4i8Jm2M|xZTn$du{pv9H<2`cg z+s9x@rtGl?r4ghW;c@7)r0!IY7%WL)}GSb=_EJh~vAN(1pHncBSOdNAJv)6Wp zf>ETAdNP^ftIj3*_kPmNYaLm%kC z3y{ahp$XQfqtxFsC{N+2Ff8B)jTGt{I`S_}F)qM=4O^Xj z_O?C+bIkYnN2Zr_KkvU!Ze4bF7e5ajo$b(Clz{xPBTbu>w6bEj4JU^8*}5(+`tEwx zdJZxVHK>n^!s6!Tk~guRk)}`;Kayl}x>)S5Bd;P{;)!%q{M7CQSyQ-^;noCNyzO^*B>~^zS26`GhSJyt?aT-SQ z!^R6G>Z*qx5@jnOmErcI;%7-SgfD4@mnzVyWb{wHoTy4XC?#0zssF*2-j7m_PwL+; zjT>)&?e6@**y`~gd1*Bv`O6Kk+jwyP?)U!Dv*~Fof6Ju07IOd5HjI^2k8KczSxGCg zwkJ=XWn#kXv!=9Hrx`rWX*m`~@H}FAn`3sEtpV(cgynQHKpjlW$7t^jDEo_mB~^y@ zVBBbj^}f~w@WG9g2|E<)m1LD45D}Y-%7J7#?;R<3zd4Gk+<=9L3-XYPRE#KGYYlI= zeuV)3TpI^^jbe&}E0X0l&>i`CRz2n`_)OoA&9bszR-1Ot%M@-J z$zUweDWN8|enA(eHz%6W58GHDu?;2#d378S%*t&9O$y5?MdEbC#qF2UZ8jfPF9)E8 zm4A7U5dXpB>)O-xa2fV|9H^-Urfn09$L~AD`x8fme)K+@E(lcd=e-hlS5hB?fobaM z@{{-UJc8GW!3*fml=hEjHdJd*7ZR9^(0yruyrpa=5fbqjD4Z8nBC>3gfQw8$7By zu86|hvY>0)Z2MRPea|6)m&NA-{<1i>d01B;91DY@@n3j`z#x}+vR!oR8{Cl`S0@H? ztm5!tL|@CPxy|@*CY^@^mL8sT5vGLj#v+O|`rK`x$5_Ge!vfXxyT`p`&(jy1izq6U zyq9PySuYXy&sK%3rOr`=wGzT5Bo4+@NYS8;drExj^Mq|p+YRx*{{ehiGD1Fex!E2b zCHWBt5ACMMF}5OHJkJv_zK>E%z7Q$pL{>s;93Y$OCH8v)Q2vV!+v-OrA*j4t674#~ zRd@qVV)W_@e;w}F4Y1o70RSbOOI?_)SmmE+}fx$}F+$YioHe ze+~RaRJ9T_&x6#2H%I~tL(q>30M{4K1)tf+=$^p1LE*-ch(f-cdzwD3jvU&94BSGQ zYLOGOtte;t4Q30y$<6O*`;rh(nFYYos7Yc(KvqnYAJg%zKY#4$A-@96J4Xnj-eEye$LF1GS}N3xYZ$hN*yEcYKrIKlwp(v$h}lGx36;})btJ=y%Cn%SFa0&Mj>V>eeo1!v+6ObuM_4U z!g>Ip6ZpmEy7n~H_=2p0^C#7T5koXPCvA~AnsA9Yz3EO#SJS><->K2|PiEjZO~(nV z(X4uWvAp!&ojQhNvgJ+JTGQ82WUdxykH6ax#D6PZ2G&6TQnPcShuNS|xC}Q})61vb z-CgncwvaX$cLd4Q;UDmoh!!)*_4G;Ry{^Io4$u0z!&&*YNg&aSf-QG(_5nEZTPv-oI;2zcILrWUx|(E4o|k8I^iOxtf@7{6xpwD&W3m# zOzSQf^-wn1W;fnnGJ(^rimpP({;_M=0~tC<*H^z)gu!aFqO5o6m+>uWy2z=$H2Hj) z2!9k0@~`Kv9H5+AamC=&Wl_;%kZ_Y?>vYNqoi2cGfk|D%j3fN6;&u2N9_x>@daKZBl*YTdIIEi?_w&RVp=}}Mp3ZyA#W^c z*yNAUE^53Hf@86rl*du~;-4tbI^>0`0Es#Qw~e{Vo|yys3?)M&-yIZb;wf`F4IRvI zR&48>7Y`}DP+U95w&^-zZ81*Pm+H9=7IOsZC%WbDy3j2&Zyr2&HbwK zpFiXCp6anKZKMA|?U-jIO*Z$ZJyQyefeioFZ1H!Y+w`3zmrh}jaJhQXdzr$pf8aG~ z@v{m&0{`oVkQbQfgQuQr+4OxO)dB(n&%?(uK)G~K6$k%o2(HE=gNzywL+dCJ=nh+i zmW|D69TOJG>6tN2Ft#mTzPBGMtY|+rw$aLmuC8~lscHO;pJnwS9Tx=$oeX*s^})}= zS@=3^P@4O+Q*o9*+@`K4L_$kI=7!5y)YtZXt%szH5WDS8*}&l@(9Mc^YBktXe&;_> z_NoYBv;b(2&=yPzio&J>i0cpdT=boAq|%Oax?oX|(UeH*W4M0z-pre+BSu6c`lHtB z1b&6wB=_rTse@8uX;@De=ki$g2Z?QjElU2eRH*}FfW`wJpgMfO57C1y+jLeZUn<7KV>W9MMP za?--1?3rrX%Nd*@fU!&kFg&VoC8m5FwqddSr~~-?+B@&#HU!p~)tX(4bggIFr00RW zb35cuXizK(Fn#}AzBrC0OT=ZkQ(W1--g{oiwS&<#u%GG`?yNBiM^pi1fD2sA;It3+ z-ib3+RZ&*v>C8(ULzyyO%IN-kV&_qhL+3p7HKLifb4H$10?|vm%IBhXMfYErrmy1( zE)~Fkr7=I0m-N-ye&aV3C}rrviU`JIz`pOyLE z=3t-DM0NCO^_Bpxak@)FW$J!gV)Yle&h{4+$rI@mo7VIz{)3JWQ=Uj zj67gh4AmM6{XJ(z9JROGxJg1!n>L#fyAmN715nTWR$8Iv5}s(wL!WP`Ay;cVyil)L z`B$J3c zx3IyR+Yg5l3>z^_fM@gmyoq*7t_UV3vq+lJK`HXiSYk`yYF1N|xHvl=t9HEjHEak> zB(f;UP#R7@6zOul?Fi&RC&hp3hP1LUQx&yISSI9fxN8WDYejAz0?&ks@20NpSa-<7 zX@&9PV9}}dDS!LuYyV^L{XhZ9UqEFjywfeb3maMK*$W}>2=%K-Ma+knI$1eQk9Vp6 zkk99Txh(^s)|~*uzs|9q(t>hJ0KlrNktH<2q!wYA{-1JF;Q#t?tmz*Mw`pul%B=nY z&4%xYO@S^x3$1X;KPhGy;p*%294ZjLtd6GAk&n;T&3QK3I+j?#UruP13q$xyIF?L| zPO5+Z$5htiy^+fG^T^baG7WLXE<18ioEo2wd{J)nqMq*Ov?1?GtktWc>KjX~->HMi zl_UimC1bI-bV{U?qV?Ja*Hp&0vHMnHlLSRy8y%gsSVfnZHUOtJ1b!Da6oWS^iX!<; zNR5un_uci|Kj@X*Sy=Cm*jgL9GNO5gP`6$_HRKNU1|Fx)g)IX8gc0y+ii+1pt{fGO zx$@BKn%c3nPG2wu43 zcvr&AooM=bAJAE6b=dp0c2UGg5-Mkvt$;CETCXi@F$FESS8~N)wPvvx;V|CYV=9Pc*wv0 z&_F{MnQ>+5XMv8rBv8^2eJ3@y>y-n=jTy30-VfZjTV9fa0xP5W6~PBJ>v`3AE&!j= z_p!9V9AWE|w}gj@mtw7Ru~{xLVooZxBXHTQUMTMV5!ptg?MQ7z5yPpTpwJpdd(IU9 z60=!ypAx1Lddo0&?$ON5@jK@nmxiH3MLfj2-M>>s%F%H`ylet%&~}lfw15eFUL+A& zlCV98e@X6|d0~W1JWl9GCAJ=*@PA#N z8r%=Ge-f|{JeA3Xe`vDe66{~Bb~zqxVSka0A0Lm_7FZ=x=I6vI!zKRZtzgLVpL*^}E$fA$gp*Z7PK??$l0okypo&-)o>kLUHwTkq8JwJ+RK*$UtRK+# zX+v97r41H{;UdnGjb?OnbFl@gHQ)cjYOM-ZMx`O~&Jk z%iy-I*m<{9GW6MWX1TbI(T<5>_W*K=i+fk$(n9p!m)dknuj~)2O0ZDZba!fe3 zl4)spc*U>=YFoT?Vo1EASAe!B0L1jls~M*;~r`TLPWpiIy7kNpxB0>Z8?cnFNXK3mc^yhtxHU|-Uq(yAG6 zi|ItRmIsgaMG=)CuC1>}_>*BES>`bbl#@#1W-?dV2jvfb$;9k&*AQ$&#B9p7dL3w{ zs{20x$Ury05O2Wm?@dWcuGa-6R`V*5NQ?|vmekCT3gZ(2;dNXiiMu61Bv~10^#}Lu zIqn)?!vz}sqeu4tJw46Sfz|0K4>24?2wSW@>*(>FQ(RIq-tc}hj{hu)j%3IE?Rboz zFllj1Tl-90vl9C}Ay^o}X&qQfc>-&e^qnI}Q&Ur2N^;UWy0Fs4CZ^fM`jV2OEILkKkN-`Kb#vqP@5B}uFr|o)aS-(8**bcA9H!J+Qyt%o$hkuwGBD(#5R03eaHz3 zmnYUW_iul2TunoMa93@9VAIh8-^P78!QF?vLSr{C1_=+@I3uZq!>%Oo3}|Dp=~(sT zCu`Z07AB>nq$Hm1%yHI;tA4t>yF1see)GYq!~2$wDa`qLNq)`&?1O|Ia#avnn2}-d zVs$JwePD-O+Ug)yM=}XUB**@vbvG-t^PLMXzT(O9@(I(8(~cM)np$B1V6ud$fm`r_ zhk_u$LCByhV%SfpBxn7O9q;{H_dLwt{8J8_EipMO-Uj4=MpT98AOxov$j`|*ymR~3 z0j&@}SOS57-)dp2u;vWK2-+zWB=`yY?EQjxfP5_6F;r1dq_}M_c6N3Qc@)>FXl$sj zPD^#Y7KgZrA_AWSn+R}qlNHWvCt(6sr zUr+cNd7|OKI-KiDk6!RSAv!72-P<=lJtHGG;cNJTpvTugByvm3%R5{XrVAD?2ni^W zgOjm84g97y?R=}Rx2GrJb7ZMMvVX5rX>BJs^EhNG4p}5N5ek&5+nSVDep)td^NWxE zIj?W`dN$Sz+JMtDRT+d*l=F}d@BEds&%fkDQ;4KxWM<|qz3H1h&T-{3?@ZVV%*^0^ z?2+~^vg5J)tBzSa@UsFIc+g1cwMAHS#YhmASm37G4HgUwr(B0bD zV56d8oahtN8aAh56B^_sgyO6x9C?j4){!%Idd!jORXG;!n*p)yhP*Wew%vp%3~>m- zxa06Ye_#3NH?F99{O-%EAO7Nnm4CW!N!6dPUt0Oc>y{k-{k7+yJMz107WZ#g{QmRj zRR8|EbJ11(F7atN-2c9-`Q7#BqN{rF`g5uugnj7xkNf>~ODg_y!?KFMe({1Mf4$?9 zhDYzbGPUOAM;-pA9;>Vpo5F#>Vs%5$Vr?N55@gOr0=Arz^xVPK=ne;Gow(`;=h0ca zcGaH_@87+=AUo}r^0I>U7LLeqT=z_gLnMJng=!W=365;T#bjwv;&!`>gku7~?@-kZ zw&aYp7hZJvFH$_7Q+C=s6(nBa`f0r25G01w53aXJcI4=ff9K7n&9C4L=Vuy&AT zsYDG1JPy_#=@}r-(*h-R6ebP_|6(8HBD$Yp21|XA3HB&Bx&|{~cy??O#BCMK6n2U* zybcIG>>%UTKk*g7$?bNl*wNbjhT&yI!KVrIb+58oA)^8zgZH4fJV3Z&eW}giJR|*# zyxz3*U^u=k(WN9IRo8^7enW2X?Adj6Hy zw791%p=?PMHjmOM^iU{+?alP>eRKP3&;HZ!`k4Z&`LTxzg?-N;jbp!Hobw6?=5Ufg z(xmo=n)g<}INV)2K1w7Q2*A4#^qYaZK=6MJr5_EYyA$AWxm?7ZTd43UygqOM;y31O zc(d4{9M8fgu+p#zxR{4d~jNo0`ydv@|#OZ|lD|!SA{| zcKgGwrLn%g-yQFFJP)3)6X!0gsjgOhU7eZ`#|k-PL2DKY1vqCPc5>HXA5Vf@x;LwI z{E*jH94u$8xaz03x2JoGdRcU^9z?h6-gW7y_IfUX-+HIPa9qza_VlzkosQ1La+NsAA_{nhgriZ~ot!d|X41hk4AV0} zoTOP#-Z+Sca6YUBNQ}6o#286wT=!1x;r;s!uOkk=FV){x!^sgvqh%6ur4bf0>t{qex&!K9{5FS_Gx5v+Bw$}z%%fD^55(&C;xYu1V@_0H}2C8cG`#LK=C zcIKyoG6q2<5S~^DBlt;9tfsnd?LYo}I+LcJ1WdkX4GJ1f4GJ=PKPS9(ig1|bvDT_@ z&xVGoqr={%;-e@yH<$_*2HqozE9}gk5LYJ;%H)*P)Hs)(qp&!K6~uO0B@7(|gApPs zErJ7?g#!$RarEs_pg9XK*j@Gr$C3z7kr*UT8AKKXPm7`-pI4ymPJ3#$S#x!|;8520 zwrzcF-I_OVmSe$lCyy`wLwb^nZKxuD!3-rTw&=8lOv{8ug7z=x~6*2 zYf}vdcuNwdf0QBbgWolk8EOY`dQJ91s?3v;oWAzfmJxlQAEm3Sv(3(PeryWF(V%*#J_r{{ zk_p3c*@m}KM@Du|PMmX>;HW4D6NTQ)0^z9&MC++M0C5Z3T+bL{JmklEKeS^w?~qJ! zdf!BWwmGe~)1TI2&+AV=lHI#~Jr(y8E5uU^1*?mu!ZId3yKuP69Qs2 z7>_sZ8}LHgLjfm6WoVq;N`|P4eZN3ly>C}fT-dNXU2cKcoH*J})3E7VA~-9%K7t#b zDKW>C)xzSau~7gN{Arc3@K|8QC4Vqy*9$=Ki6a-WgOI}U3~jNU@&25j8gbPR4r@Jf z_|UF5U;EED{l2#ICyp(+H_MyS9E}8thMls(7+@}^LbSt8y?Ms&COy4@l=jZxL+4*` z@%IPXak?Kg02Eg53_DmYo2YSdI2@|4r+c08!-xS7@qxa?FA!;QP8KZu+bqo5ks96d zKAI*SSKkiW$f9?{hTsPrjvuNjo%XQs(;c zT6D*5C%&Hxzk`GG&YQpJ8c9*C`d|r+-0&FqB)G05Yz=q`motqgJu^G1SzJ6sO$r1R znsMwPtoNbw!W8JynAAi^VT=w}J`rWbn7G84o=jWY&@fCAcTyi;IIAuCZ zQ8KOJJW3YANgQ#?XfIfX!zBn#6I?2$Y0VSA_K59m8pIhIhsTpR5xHd2p0#vl%C-0Z z*;jnwwVK1rVNAk#jj-RDBE(2e^ys?nufOm#)~qGYHnJq9tr%di@4x1x>0f&|V| z#mPKjWYFuXohX`>s1^sSpo;l~!Hh~%RfQGeF)I{p>@r1cAX_2U!msc@JTrDEK?6fE z+!+^xLyk;m1Er;9$H>yYIk}x*yn_$@<7JY($gA2r0}3CsTHiHIZ9iPIIRaPJI+BMuL@s{xQTJjyIu6CW+i3 zB9w*TdV3hS9EiRoswWb7EPr|9p`D)$i< zGOZ}*)aTgZAv3c?`$$e;%bu=RfA!TPyLaqJoMCu?_(NU%Ul0D{P|h_ssrF=IRl-ET z5p3}|8Q1a3%j@pH^P1tP3Ce(C&ZHkax2cgES4`uwF7U7d#8GR!gOnV3_~&mveE-i3 zuP3E&%(!tmw>|V$r*ldn_9cwriW-zcm{@>}ZF%FhEq}Y`W}F@0@IGST$ky54{mbhW z?sMj`peq=#%ZAqvF@E~2*_O{g@>a;5?@=I{VjU1sa1u~- zV1G1`IKoYVyskA*`3`N`0EKTz2CB+hz_>sx#Ucj^Ox$ODsQ3=S8;) zM>r7hkN5~X1O-4pxTSwPLBcx~@8|7UQ^V3qBoZFbVyMGOG!kyLS$QxhSZmt_zfImqtOZAzu)!m z3tEyb{-pe*pd-^AV>v?c@Sf;6*sc(i%tIg~1tNlKWqFImxb4$s|Lgz!dtr3{MlRGH zM@dhJgc6Hzke)OeC!xi@Rx;t$5J`$ucd`|4JzBAM*N_C=NjY(4%dmjiyRkVW@H`Mj zKrldjhIEGGoUorSC~-mpO%vo^zpJy) zyBMq}mZOLac{x^UaFD;_jP4S|Q+>b(K0A*1IKyD7`OI+i=#jk}-dS}+QJ(h>kH_7M zb7Wb0C_zIaU~rhKOc4ubC*g=_VHnr%ii(QI7>9mxz`bE+$n$JqIG0Em2xxEc+L-a# zo%Wu-zP^*zk_-n}j4?Kc$orNA&Y6H^t*R)BBQ|^Xi3s?8tqj9}uKA!Q9fB3Y75mdM zBif;z=Q&F_7EMRvgYWYL2XP+uffdzoXO!mG0>5u=kZ z#49N9xx^6Ry7u;Z{qL>b@z%ed`A`J^i~?y3WmUrDK$_|=rsxYP`#YOZyy(A;FnAwu zCxgD0e%P^fNN5*Opiug(Y7pNv5@#$Vnv$Co%AAfxYcjnq-4snIWA!m*?Y{Vtqb;tqKyWJbK@nX%-e6v>`xlUN%hP7qOW%N&k+!bwWuP7@BJBib7H z#Lj_d7)Y|8El{Amy>9j2I4yQVUQSwNG#n%xl%ge31_Ofgv`~cQtfaBEwP5_DsoxlE z|EpmK(kVt0$f!bRDq+44Tn+m_;nWB`&j&)G&>1Ur4LcBYJkMZt^cl|pVzGFbrD+*o zADZ2S$UtEQnHEitsJOzR;i@cidh@P+eH6?f3LqbpWl>*B31>6br$)e9O5G)9L++m~ z`2%;XpMH1jekd{O>rQ^)K7JeoKU`bG!AueuY*_-a1>5i&gvzilMbwY3^M(Q_bF8gF z3ytgC>3vynz^*NgNcTIe0d366{kr64y8q(|a!^wm;;I{rG#o z>)-eOaqy|Aa9)Ln^Y%OA8oJ{Ns5`>PgJLu|JhdZxH@&?sRqfg@!#l$zNKhn*Slfw_ z7~%{_I^xoTovqtmd;Cl^b$t|F-;Od8HX3V5Ai`mKgS3VdtKw=RQfzovv=}MSJQ$lg z*c^y8wwM!P9KeZY84!z*m_gS-yo28`lSBcIPmZ7c4!=yHui+FaY7m z(<(_7oBf&bir&=7(Vn#6p60Z`&StNFZ(CY$Uwe9BZ>!h0we%)VmLWP+m*!yhvMNVJQvpIB}mll;SmxDcp0t%4t!uA=wluF!THy4B^CzK9L{5@t7{Zb zQ0So`LZS%7`L6Wv2bU0on1_L1MX%C2qkLw?6|#Td-px>=_(6)>7FLv)u6p%(D&Ym; zQ2F-up0v`^u^*b5_)ODpSHPT~@q~%B9Eo^}|0N8azA?(dJkZ!g+otcp4{-1AKac~sqxhC?`x37*q|IN$8&wTw7bfKs3yeRn8*H-pC@`WY7 z$8J9_@WdS#gr5A$2ksvU7kuK&E5c9Rabft$J1&eo^RUN*ce8C#BU?iNtPaZ$P0<#K&;L&Q-j=$Z2HCH&78 ziD1JpRAiN9Smum(n&vppqG`&9nwRlyV#jV(1uHRvsH&nc6qA^U0m1-l%TN^HTxPIK zJ$&fkj>Crz?ZoLz&>cQ}aOZHjLx&FRIFUQn-_fIo_Z&E|e_Ly7Ym;%?!;Ut@sZumq zjN^cWL{@>LrqEnagq2jkuU$;s{~i36K841`UPy_!i~mmJH#ScnI0M!_F(`ykz@S_K zktBop5Mxn@1QEi?5kd>W4>=MKeAvZ;M2&?Ai3SKA^AQG|8V?d#l0mRrNR)O$zKf&# zz%IhM_0NwwxC5Md9qY#M69t;yg*3Sr$WLe^PCMc^iln$}K14si9by$0)sA{eSFuaHnMG4&y)FkcdR-FeO;s$EaX#Vxy8{Hw zJSvt1*aVJhhmyf|h#<1!gqQs!H-2z;QP*29l(qi*snX_`UKrcG{+05+O>d45Y*{_t zzj@WT-gjRc)BX0#W4hM9gs!}2{mT=2*1uZbwdSRT4LhTk2>tEj)OyR013{*jxsATECz2ALmLY}AObPi!6n2O?pGBl9v+r{ zh=buXFRqY=`ufWB49_N=^ouyxzm zJga#BrXlE*xX3AOu4Tp~7zMzkCxDkBrYlbe8b z@I6jAUsbEP?TJ5b`op)rwEhp@yM6udzkSPw2fudXyAOWl`V9}_j|8#g?7=S{l%%~x*N_}eevu;F)i-Ms#Hci*!1fv?}V;r`n{fAmkc-;!SU@+xVGdtmP{&3XHkniz3Z&EDiBhP^C?McG#rUQ$xVpI zwo z6Y}-;Sk+h<=eNSnxfFKth5Z^28GUNeM5}FdthF{2(lRqMy$f!*JK!uSUo3{+OJi(o)0gS&7}@aLl^) z>)&m0Oj$tqB&-#}Iv1isWMzYm5l`LPr}uAMzZU2H!}VJ$-}u{a(*g(fhb5KBEDr_} zhtjJgo#;Jz^Rl!b7kge;r(0Xs3TGR_r)Q!!w&$BykR z@r9z7X6NMOCw!Wm2ow}rU&B$NgurUc1Q$ytDr7$JUOTP1#U=C3TWNSbE17i8dFS_( zTy}HJmSYtmH^mv>Mb1tXF-meHN4M{K^SQr?f*>gRWNC!dRvbCZRjzt0iHS%U9yo6r z4I)cm+@#AnZhYyo8^4KyO+Wb%(KK06X$3NQ6*5k=#^As)C>hnK3paVV;crt~6EdGrXCcJ?O?vuO2qQcN+|bSkMyZ8M{WDyuzZD5$yJ)3p}_N z>^A}qOW%?x>;&<53Zr{$w^We+a30-3PJkxM_~E2d$S zcVS7%*oC^sPdN~736*`CbR6BeIVIlOY0=_DpN|zw_3&=uTrx)$&OP6gmUhMmOAH5| zRIfK>&h>Y75V(Jvm9S96#CeBeGDVW4u5fhkE06Sab#@xw-)F}g&;GNpbHiJ^jvY+|{63#0 z+R?_VAgU$6M;Pk(v-SAX`)FtXibi|jV#6`e6brCu-*Cw$jj)kUpW4?{6^{+i#JYpQ6juf*DXC*+S%plH(K9bx z9t2BCSmO|jM(Yi4pJ`4l1V$&v-Zqq-NF=J<zV*AIb9-n6cH?7@uAox4QPKMG+8t3<$NQpE2n zNmI(szjf@?=`#%Pr;R2=!#J-|qA3vKEeJn~;YplLPD{_tKjlbnlYxV^lf>6p$;G;Z z8rTXNObiV|g;CL=V1RI^l1PJl{)*O&m0xPfT=|8D;+wuzQ+ms{tBY^CyWipWnzCEJ zQ(N|h?oaX?K?F^x87Y>bnCZTif;N=Yw_p5-I{&bmwPOQ1saRyXXtVyF&7rx zGo(vA8z1TJ3%1l8P5gRhF~t?2S6N!@mkDtJk}lQ^K>CGDOi^Sop0wig^^JI^W0R2w zYq2oVwRLnBPnkC3N@MqkF@5ITE1Fu`r&_HJUCdzTN{mzZnUn6_Syf%N*YJ8mP?8y& zIw-Ytv8Y1!j_uY1f*vi7=W3;UN;$>Ly*@ zSu;y6{PKULc)ceb5OgX;e^-kQ!W$=XO#p(HvXB7f@??&gIMvuWWU$O)Y<{NkHyqi) zL_7SNV$6V!b6#LgkRCc<$7m2(jEgAg<1(a-Nf~iR1|xG$qHvBAI)QhPu+2##Hv9ya z_S%F4z}>hAQ-WjU6ppn7qHAev%XmPx8NwXUnPv(fN+LQXuV$Y>nVa(03>FvjL- z!-BXH1zf0@y(=}vu*~p&)}ldZ8=E6S z#pd;|d*$Ays2C+GyayJ-l7m;ITA?&=o3v=^imPulypDP@bMx}j&;RBR+tQ{?5^V`# zq)9B1Gz;NFZN1uikKf-=RZ(GhKOsBbeD3i=t^JTDh9P=FMvP5^s!XExJia4&=6TbX zUNWR5#Cn@+j#!BtCkieejjtD{W3UjFb=e)cV`pMto`la)42?C-L$_bU!^zV~bJd}J zUW?MF&xTIn#GN3hbQ^{Hs(zJ4IC4~Xjk z#=-7DtRoWEj=>wnF_uFGPl2KaLmHQIv};0FXIsk|pN0V$RpM&y-1*m6RM!728dLth zWa+Y7AyXQL;66FnA+n@w+!uZRKr+u-;N>K;L7dwISM^VFIksb;m4xr(GkOxurxys} z!G`hsN9g%2z9Mi6BxIY@LF$`ZC(N3=;F}2_!_UlFb8o9|Xr5)U+p!@}udPB+B*fz+ z!|SQ9syMpZ@Oo0<&cOuXgMb)<`%hF=QA83Y2jnTd{&j%t+q3JL{JgBaii8Fd!voAE zoRDTX($d;hJbwJd2i$IVlHuLtIJ7o3G%zi@-n0m9A_WElDL&`A;<4r94ex`dv$?*`74PoB!T@C95N{Q@1{5$X zDb{FG(e(V%vSFEr5b}IT6vL3^99z)FPD^-BRQ+clKRcGwu$emT%}q_#mhEetq7N5! zfb*cWz-eT#&lLzOS|Spo5t*Z*un6Ckm@dHdnbS|;P!Mw}&gzfNi&(3~5tg!nb+bTT zYlZJ%%HX#lgAa`k>^urOCeU)^ljv`Sj2dw@Wy-XLzL0#MN;^qkNK9$%i9NRBqRW1t zmY$wzco`AqFI;qWePi2KSQcL{L>_RA9*HR8u-fFF&W>jduO^=$AbC&AFkw|T6smNS zNrS zgrY5kwYW)Tb<3p-7cITlb_O~LI~-2u%8M@j>6|(9E;M!xnGmI&l~Jj5+l;`Pq?iWDU2ecSfet$*T=1F2c>Yh^STWfe3eE6-TF_9)*3AU`mk>mNZa7dj4;;Oq4MGae2;cBL!xrrZg?=BW2_D<-x)- zsnZu3-iOTi2@_|sR`(x!`vS=p-U3wZ&Lxr7)Y&tg=Y8kb^Dex6#JV@&aQ0=le&gHhmA`tbciOG@PCNI4 zi;SO6i8nnX!!z%iJA3%79G0Wu{vmF0cE~(g;)=F~9j%*RIJ$rDF2nnPz^N(@uX+BF zOu6kaFNO7{ABM%bk^~|;l1RII@_BPFy7nf+`=EeAi7Ykk-(nT~aXoW~z~;0VWa}~! zSUd40jaxB!-r}W(_tOG}Dy1j1j{~{FkZmtcN`MzJzK(jT4(;D(Y2Ep%-B;PBP!SSk z6cVRtuoE<~sSb$aOuO7CQq4%ozIQKP8)2aU$AiT z=UC49Xh%nPp4H|6VFmFXPK~1jAvqHZOR3>N@1G(AoO}$+E5_z&gCz!I(`4wNxzvpT zg3WfHsc)K;}DoKb=tzzw7jQUTRKaf4mZJ> z&^Zu78i+dVPrxy>#!>1YAa8Cr4ml<9c&vxxpqPlYZ6Jp9z73EE2%IBDtaKmBdz)UW)kk{g@i_e^v+rmVaz zE%Vf!=`m5vxcIu;+g;=4YPJ;E0fkBs|0=~0T8feMz@BZpUVG~AhWA0yP+3tS?SJ#{ zmfng6Mu`)R)`-H$kSVjompUd>8F%4rVaPEprFF)ORuXNixhyfyl=Gdy1GlVvT<$N$a_PzDo6B&KG*E2$k!dRei z2!&Fa0wE=-#375sj^awexv=;V7fl02pH&{>v{eWx){Z@!v5C|8>5MaEp)yqT91xNS zluhspuG~+l5D`_q{govSM=}uv&3@o;?H5=}@*5YdyzHsjv*%uLI;CB_)|fG4C#|^P zl0OE+^3&~IeR)o25*QbV8hW7xi~-z7G#nyhO7ouHwQI+5hae9QvqSqQ3aVcH^-_eP zSt;G?ev)H}fMp!CJyx5O)HgPdA!Xkt7{#uVp0v2DxdrxQmFjP9<^>eN(sJ1$*=0u6-~<^y)SgETa@T{v&y z;#(4FXy7zAHP*$$JzvkxNNp8`2n2-;86gNz3Y#xE!f;k{w5DM>=SqI%{0lGsQC4<# zo^j}Df#EZI&fE(ZFFXI0magCvP0bypR;v>phSLi*Q9=1;enCNr;r*-to6L5<^2A?r zf_vW5lrWK16u>OJBY01AjA$TI`#iJ8_f5L>2j_h47k`~HXTf5eY|%J;&|tII_!+Zj zUwrp3AI!P-zJF9_ue>#A%Xiu!GK0|~o!0#EGq3v6ou{hdpSobl(rC$wo1^y3WSlxd z0vjt+RuEQE;tf?c__x3KCma=Ncpo%-*1z#eM)2@jD%K+jSjhzM7~`wJCy}<4$y3KH zyY_3?-^=hmV4CV`YWSM<&su^_0S&~OKwF8*T8Rh|*Kf}v_1Vi7&`ZAltL0y~`yTA5 zKUk54YwGD8Baa6@z#xDm`tf|#sJb$~eZmavd3riKIvU@3?)N#qJzH5{L!1WT5>>54 zp`BnWaKt8r8;!yoJmVKMA}4fb@X_Hlx}%MaEj!l@sL$X?aat;WxQRw12PRCKnA_gj zJsww_$I2=FeL;zeftZT>&}PI1!Pe5&IZ0#K8;Zw_yLjUG@r9Y0S*aY$LNeB%K%-YX zVF5%hfnY|7BM_lLmpf_l)a8?=Out8vnO`(;yj56DMJY%Gc9FTbydYMh`p0DW^DPz9o@c}EM%~l0XcMea+(o zd5)n_I%eFGu3rB+EM!jo769jFN^;tLy`AlUkHuoA><5yYn^zVS)$38DW86WoIYHAD zUWoMlFfTWkZSU-w!toYeU@;K4{QiJj5Y;PZ&75AI)^x(q)#vADS6i&M zrEm==h2f3j3eJtSeHM!q?mOz}>g`=xP*`~B#0itq>~^aFnj#=#o8l=zK?Q=TblQwr zR}__u`(<}e@CU8!U1cs{I7=h(*oy7Vq(2*Sz{*6_FD_HF^hpzMkElQD(}D= z(!4Qlv9JEcYyMus<)hYSR#aZgV5da-6t6ykAQ&(1jI`(Piyw7Hkw7_ele!x6gtz`_P21&OD7 z&xV>kTi-Rjo)o-}Yt|LFhFOmb2YN9_*qF|yD zS&Wga%+!WxsQ31&%F6wTyE`?8xVrv$;ws&nda$mh^5vn5tBiEd?wYEjBQCDSjw!$7 zlN48FW6GBvUtBr-y`6233`Shx;9!U}dMGB=^n>>;#~*_C@zR*FW0!Y!^<-i^L*b4B z3oqE&)jJ+?|C`58oOpg&*%(h|W@bhT-~v3U-gFQe;~}2S9zSXN%_-ij``WsFUx#B# zQTQ;Bx#BxRp^lw46;&caJW2}lvJQ5(Hr!TMS9{7~?H>ihJ1;NS8j3_OMeV!t>RGZO4SsMk8dwXk+H))`L^ zSMP4z^7?b(U@(}tyAQxxvw2s3@vAL4%dQVObFCI45(d(h2x6C!!la;M)8_sE{@stm zV2q7JPMbbZ%cZ#~j(Fzm6)eT+o&6zAkvQD1#9ACFE;fzsuHNArWDOaP`pU3tVS84| z%ovm8!I?-X5SKP05S%q19u2$;(JSEJp)Gl469g*sP;>HHS|y#}M(cIe~%9*J^ixt+rCWpx|g~>n=D{*)VVa zq1r3=AF00ez|p!}4^`HkU)R_^-WQ6dP&7~RHV62Jaug)=L}OjTz+-buED|I+nciwj ziQTz>-`>soO$`FLw-d&mQ)P1f47Pdavj)ZhV{;%tSbh+k{RxqUJifD|qpi22Y#BegJ$2J-LDkn;=epXT0bWS)Xxhxh3u|Yb;+N#8o6!1~D&aB}aVW(M>>1DOuZ3Lxe~kg?)ggz%lSleoLU-Q}G#xiW3V=W54& z@dw>=fB2{H`S(9XR{rXr%(8p_DlfYGk3Cbr@~h^u>wj32v-0L<@BEp8^vRiFXTDX1 z0uOfLX5=WbQzEg-VPc83{Aj zYW~+VuC|R$mT0TOLB34m)CySp@kxMb%IJTG{RSa?2@#_tGhDUfz@{~C>OXvfd_tje ze6R{{>y}L~wKdmXK5=Z(UtA7LcPQ+GfRpr^09{~#Kg?L57z}%G)(tS&V01XU6EXl7 zu{zy^)m`OZ6kO95>F$+~SQ-hb8y4yA23Z88Lsq1_q+uy(fkke*)&-3*c&`uVTf+Vn@KHsJ#5Q!`v2DP)WQtslQ;wgBU zkhdbJaT2Nc8*3?#2#=Ll-E@X0yt*LV$)7VDV^coZdDC8$_{=T?aTP5C)TD%sK%Iq^ zw4jTjTMqh8g^==f+IgqP6QR)+&cqVoE>P;+)yAv@5r7qy$t*mPX$zYAb5Y`7^wgeK zHD#zRrjgyVi#(jrfg*|xkKD0>%GdV5i(KKLM>O0DOQ+#yR#aD2#qh<`ws+(B^vriP zGd+C)5Zwm#ASyVjXQV9f{XWnZ{oR)X#LxFyCz|oRA>!^k!5+=!$2C*2bGc7B4p^{wT9Xn9cTdw18IynEP=Nz-*A2eBF^KwiK4LB+^sW){0AbbdVLkF8~P%!>a2%YOTBYY|y)C zXl9YuRzMjIA#|STy_`xd^D1A04GS3EgbmXx2lA_mJ!|c0!K|6pF|Wtt!>($a&TNiO z6UduEEW~(t4Kuc(#otRnByg4^^zJ0+ZX7~(j7#7?Gkhm|O8NQL<#;k-{<(36V#$*j ziXxIv;zpTH_{Fg$>Cs7ca|%v=)Oi84DFF_0q&ZCT1Qm}ol}A!IZDr!PkH{8-2p-1K zT9JK3)*FSL_uU>ETyHU>{p#+9m}@|~9P-)OjLM(EsIXzyLkHVpfF+wMAJ+<>T7qfM zm4}UoN8PVe-r*`5^BW0C$**0_m(86L{DBu)UgZWd@Yf=&q%>N|eFAv2Q(SJq`ftkk zsMNyvS-UaNY&rw0jz@6c2r`%A1&f#rym)|yn~C2nF%!gaQAQVHezDYbx6%pO-zKDF z4K(PDoWl_=UyR!1fwAd8f-MrXCs=b&e7$`m&MAjDuQ$85-Z|%g*~Ohz>(^9KNlk%h zHn0Q0uW=+U|M^K7iIEyGl#pb%OX2Wu9)dF>Qf{``UDTuP0-3oISB5*|m7CXJ(HCv^ z-G*7#q#kwKZ?%=UF!IF?DVcgE=F$1#AVyCP-tm7Aj>!_XRTQ*^MH#?CX>~d}3`b}l zL;civ(lrwTSC2k4;D1y2*6<4Hr$?20mPDD3!x0w^D zlJ+p&$k_$j*@&--5_#gGYNTGa&)IRC>oQo@=O|uMl>kSHfvnNL22QtN;LB05b40S{L)UdJkdb6kTNrGT5B5F6HCVW;D-2Dvfb{6 zt+3tR>a9HQy<{`=9yv@-xoL5>@m@PzLwso;%y_ul6vf_(>|P?~)zEbI+*n_pPrCs! zC8{Q?#HEB4Y=n)>{yA#Yt&)Rg>TM-wEtLsH^HEmlPH;4ObXJCrqd&^Ep_?ClKnJ0D zZ3Nu{e~mTujQc-(%mYvM!cLhCB&!1}r-f5#yOm$WMMVxQ!>Qs$2f`mGR6T(-^yx%i zMW2(V7UK;-dx*+BK;QcMd#{$^6~_J>z%2a5ZQ6aC5%MigP0GYSeeON|cJo z>POgx57vspcZ^N~ko*7MOL`$feotcvZMyGjhf?Zp=jR&G_00h`gq(5gZ-)Ocy;uV% zz8(^Oa48$y5%w1I(Ch6yN_0ukb7`K}PF-XjHIqXbbrIMaAI{zM^o03&?Z1FNAKTqv znBE}MFP-)^%a?0+M>W*P^5RtLUzf<}Mb0PPg;G4q%XvKb1cb>%1hMa1N%F z4=rAsLF*Ysxe*QyDiEBU32vaaCmjIVdT`JLt%!@uHE_I69eUF$^JT8Fcjn7#HbR+L zH)kuD@Je&gz}s64vuJA8Z6C-YI-HYjvjE-z72>Ec#CrnRCqztiPkCCUq!tvQX17@O zk>b|}?@#yl_W?DAB%Ml<0IK-rH)|u+z(p!H zlql@6gyD-U%=9{9$HRT2W&0x1_nMV#Nn?DwsYj*-KEX}YQ1W(q8Y2Z!ex>v%;FoKb zqf_v`Sj-2x!hreZWnQ@A@hpC7fi3 zp?cksOQLO$q%!S84M>1H_@8&aAk*t^IXUtW$zD{d1ly=jEwuo*7zav|+R2Qq5z+8& z%^pK=T_(-pN|tWehLrT5%4tYsR5q=96-%ayEcf3s+Dh>Iv#loZx5LdQ48HkM<7lJ( z_AD3GkZJHoI%F(J0R8Lp5%HWBE4jWt5>lol;MwqI>tNZ;z0TrlbUomCx1=%p+1FXH zc=*;2M)}E?$sFm~Q8Bd9C$2Q~fFEUE)v)H$;EmzAJhjf+kL~SeeHG2pWsN+GOd$PtLZMyO0lpQy&lMa{*yYSVV|Xi|kq_RAVpU$-j&wUVkhKSfs2 zI)sGMJVMic)vSXjib9Q5XH3LY4?xBAIJ#AMk~kB<9PNf2%h`kn7_La7q4XKs!M>i7 zC2e1pzMto!k@z-7nsz|s!&sW8XB-Z55J7kCn6d!(mHCDp0|gJnM}%bRx$4E}TG|^i z@kVd$k!0&1p1e;Jh<{ILa^=vHjffBQQ~Cd#5m$k)_GJ{^zD#xxEFC=5r&$vYvHY|W zL>^fJkos^?SB(RXp7;ch06Xc6JERb@)HXqm>Yrr7| z2=-*RF6nHp)05M2$P+mJFzs7xeYLV6gj@*q<^TwSeS@^U_r&=I3QaZxMSX5Fr%G&Dp*Ed`mr~+G zct(lz;X=g6muJHU@%eUJ?=HMhyc2Pb0jbJuL&cuHulcCP5>z>#Yel)fDU+r%0fF## zX^=YJf~59Oq;p`75PZ=<#q^i}V0X8rwY8sT6~HR3RkPo4nNZtwxC7+TlPr!JBE@bA{i=I%H$v z5!-6}ufjC)*Yz@wQ!fPSdh&F}CxEhpEbGq2bXp4~k>HVZ%);?n%d6?O3>PKKp6m%A*`l$KM8o9QIJGkB7=+H z(GhY77N2Nbh<_^l0DDsEcf|PAJB&~p)uHj*>5qY^js@A?UzoeIZB$CuO&JI>G+*79 z`&UcdHPaxKHc4Qps-5ZD)zGm_>>({JZRWICd#qvB&0c9OlayO6lgZ$C{4h5@87>C zdkS`CX~hzs;7sOG6x`5TvDI}))zPSA^6BkI(}5Z+C(%L2hvSb}8T5fv4cW*!@z{9JnKjG+5CmTJQ2N+Qz;5w%b8eb@D2jhT7CTcgyd5u-$Ygs!~hAE}=O*dxCWwWmuFdOB_8jS2`khjDbq^1x|u ziObPGy@|=$n%_Mo+4U)?E!(sNlUZf$*Zy7|Bf|cyv-!3(Q>^?za>m}<@_QSujN`Om zcpt)K<$H1I@uzpolzVg2-QbB2+r%~gB_e?OWza4&kPJb~f1WUJ!|CYjzLM+nW9+Uv z;<{k5=W5xNu_*TS6jCV!&s_9tuwbcR*q! zHX>6qj`RvnpA_9Vjp$&)yv|B{FE*Ar<0%*`K>{K=7@neM&XXTPA{9!yf?!&ziP5=$ zLzyA25}tc-;!Y{Gf4@$u(`FKPNrb(SH!2g7U2U984?0SP6K$4ES0>uv2U z?Op>Nz>#$3Sc}-?+1uNTb@Vd{!tz*Jy_|@N`!4tiJDTQPM_vOYu!V463#I?QC%L={ z_uVw)i%Ieidl5r#k1dw}L#7>ecHuuCunRKbK7bz|&lOQg{wk1;s7l0QjIr;(yoXMX^28JJ@3WRHabE&oBQq1A%COPzrWWiOR6y+Gy5mv>-*WQl zf95%%-}LQ&S33;EBsTsgfku?M4XPVuRnQokN~rq1pk=Oo5^iN=)G&SGhCR`L@Wy`h n7HMp^ZM^s5{~N|!NR)5cU<8wAufi|FA7G)Srmu=nwvGB9G+#8W literal 42874 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 diff --git a/apps/web/public/static/images/providers/light/square/pushpad.svg b/apps/web/public/static/images/providers/light/square/pushpad.svg new file mode 100644 index 00000000000..03ae25bac83 --- /dev/null +++ b/apps/web/public/static/images/providers/light/square/pushpad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/src/components/conditions/Conditions.tsx b/apps/web/src/components/conditions/Conditions.tsx index 12486d47273..cc1e3167cb8 100644 --- a/apps/web/src/components/conditions/Conditions.tsx +++ b/apps/web/src/components/conditions/Conditions.tsx @@ -3,7 +3,7 @@ import styled from '@emotion/styled'; import { useMemo } from 'react'; import { Control, Controller, useFieldArray, useForm, useWatch } from 'react-hook-form'; -import { FILTER_TO_LABEL, FilterPartTypeEnum } from '@novu/shared'; +import { FILTER_TO_LABEL, FilterPartTypeEnum, FieldLogicalOperatorEnum, FieldOperatorEnum } from '@novu/shared'; import { Button, @@ -135,13 +135,13 @@ export function Conditions({ { return ( ; i - {operator !== 'IS_DEFINED' && ( + {operator !== FieldOperatorEnum.IS_DEFINED && ( channelType === ChannelTypeEnum.EMAIL || channelType === ChannelTypeEnum.SMS, [channelType] ); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const { activeIntegrationsByEnv, hasActiveIntegration } = useHasActiveIntegrations({ filterByEnv, @@ -25,14 +23,9 @@ export function useGetPrimaryIntegration({ filterByEnv = true, channelType }: Us return undefined; } - if (!isMultiProviderConfigurationEnabled) { - return activeIntegrationsByEnv?.find((integration) => integration.channel === channelType && integration.active) - ?.providerId; - } - return activeIntegrationsByEnv?.find((integration) => integration.primary && integration.channel === channelType) ?.providerId; - }, [isMultiProviderConfigurationEnabled, hasActiveIntegration, activeIntegrationsByEnv, channelType, isPrimaryStep]); + }, [hasActiveIntegration, activeIntegrationsByEnv, channelType, isPrimaryStep]); return { primaryIntegration: getPrimaryIntegration, diff --git a/apps/web/src/hooks/useFeatureFlags.ts b/apps/web/src/hooks/useFeatureFlags.ts index adce50bda95..71c6e909cc1 100644 --- a/apps/web/src/hooks/useFeatureFlags.ts +++ b/apps/web/src/hooks/useFeatureFlags.ts @@ -1,11 +1,7 @@ import { FeatureFlagsKeysEnum } from '@novu/shared'; import { useFlags } from 'launchdarkly-react-client-sdk'; -import { - IS_TEMPLATE_STORE_ENABLED, - IS_MULTI_PROVIDER_CONFIGURATION_ENABLED, - IS_MULTI_TENANCY_ENABLED, -} from '../config'; +import { IS_TEMPLATE_STORE_ENABLED, IS_MULTI_TENANCY_ENABLED } from '../config'; const prepareBooleanStringFeatureFlag = (value: string | undefined, defaultValue: boolean): boolean => { const preparedValue = value === 'true'; @@ -29,18 +25,6 @@ export const useIsTemplateStoreEnabled = (): boolean => { return isTemplateStoreEnabled ?? defaultValue; }; -export const useIsMultiProviderConfigurationEnabled = (): boolean => { - const value = IS_MULTI_PROVIDER_CONFIGURATION_ENABLED; - const fallbackValue = false; - const defaultValue = prepareBooleanStringFeatureFlag(value, fallbackValue); - - const isMultiProviderConfigurationEnabled = useGetFlagByKey( - FeatureFlagsKeysEnum.IS_MULTI_PROVIDER_CONFIGURATION_ENABLED - ); - - return isMultiProviderConfigurationEnabled ?? defaultValue; -}; - export const useIsMultiTenancyEnabled = (): boolean => { const value = IS_MULTI_TENANCY_ENABLED; const fallbackValue = false; diff --git a/apps/web/src/pages/integrations/IntegrationsListPage.tsx b/apps/web/src/pages/integrations/IntegrationsListPage.tsx index bbcfe678294..a7ce20ee1b7 100644 --- a/apps/web/src/pages/integrations/IntegrationsListPage.tsx +++ b/apps/web/src/pages/integrations/IntegrationsListPage.tsx @@ -4,14 +4,11 @@ import { useNavigate } from 'react-router-dom'; import { Row } from 'react-table'; import { ROUTES } from '../../constants/routes.enum'; -import { useIsMultiProviderConfigurationEnabled } from '../../hooks'; import { IntegrationsList } from './IntegrationsList'; -import { IntegrationsStore } from './IntegrationsStorePage'; import { ITableIntegration } from './types'; export const IntegrationsListPage = () => { const navigate = useNavigate(); - const isIntegrationsListPageEnabled = useIsMultiProviderConfigurationEnabled(); const onRowClickCallback = useCallback( (item: Row) => { @@ -31,13 +28,11 @@ export const IntegrationsListPage = () => { [navigate] ); - return isIntegrationsListPageEnabled ? ( + return ( - ) : ( - ); }; diff --git a/apps/web/src/pages/integrations/IntegrationsStoreModal.tsx b/apps/web/src/pages/integrations/IntegrationsStoreModal.tsx deleted file mode 100644 index 654c8dd086d..00000000000 --- a/apps/web/src/pages/integrations/IntegrationsStoreModal.tsx +++ /dev/null @@ -1,306 +0,0 @@ -import { useCallback, useEffect, useState } from 'react'; -import styled from '@emotion/styled'; -import { Grid, Group, Modal, ActionIcon, createStyles, MantineTheme, Drawer } from '@mantine/core'; -import { ChannelTypeEnum, EmailProviderIdEnum, InAppProviderIdEnum, SmsProviderIdEnum } from '@novu/shared'; - -import { useAuthController, useEnvController } from '../../hooks'; -import { When } from '../../components/utils/When'; -import { NovuEmailProviderModal } from './components/NovuEmailProviderModal'; -import { NovuInAppProviderModal } from './components/NovuInAppProviderModal'; -import { ChannelGroup } from './components/Modal/ChannelGroup'; -import { colors, shadows, Title, Close } from '@novu/design-system'; -import { ConnectIntegrationForm } from './components/Modal/ConnectIntegrationForm'; -import { useProviders } from './useProviders'; -import { useSegment } from '../../components/providers/SegmentProvider'; -import { IntegrationsStoreModalAnalytics } from './constants'; -import { NovuSmsProviderModal } from './components/NovuSmsProviderModal'; -import { useCreateInAppIntegration } from '../../hooks/useCreateInAppIntegration'; -import type { IIntegratedProvider } from './types'; - -export function IntegrationsStoreModal({ - scrollTo, - openIntegration, - closeIntegration, - selectedProvider = null, -}: { - scrollTo?: ChannelTypeEnum; - openIntegration: boolean; - closeIntegration: () => void; - selectedProvider?: IIntegratedProvider | null; -}) { - const segment = useSegment(); - const { environment } = useEnvController(); - const { organization } = useAuthController(); - const { emailProviders, smsProvider, chatProvider, pushProvider, inAppProvider, isLoading } = useProviders(); - const [isFormOpened, setFormIsOpened] = useState(false); - const [isCreateIntegrationModal, setIsCreateIntegrationModal] = useState(false); - const [provider, setProvider] = useState(null); - const { create } = useCreateInAppIntegration((data: any) => { - setProvider({ - ...(provider as IIntegratedProvider), - integrationId: data._id, - active: data.active, - }); - }); - - const { classes } = useModalStyles(); - const { classes: drawerClasses } = useDrawerStyles(); - - useEffect(() => { - setFormIsOpened(selectedProvider !== null); - setProvider(selectedProvider); - }, [selectedProvider]); - - async function handleOnProviderClick( - visible: boolean, - createIntegrationModal: boolean, - providerConfig: IIntegratedProvider - ) { - setFormIsOpened(visible); - if (providerConfig.providerId === InAppProviderIdEnum.Novu && providerConfig.channel === ChannelTypeEnum.IN_APP) { - create(); - } - setProvider(providerConfig); - setIsCreateIntegrationModal(createIntegrationModal); - segment.track(IntegrationsStoreModalAnalytics.SELECT_PROVIDER_CLICK, { - providerId: provider?.providerId, - channel: provider?.channel, - name: provider?.displayName, - active: provider?.active, - }); - } - - const handleModalClose = useCallback(() => { - closeIntegration(); - setFormIsOpened(false); - setProvider(null); - segment.track(IntegrationsStoreModalAnalytics.CLOSE_MODAL); - }, [segment, closeIntegration]); - - const handleCloseForm = useCallback(() => { - if (isFormOpened) { - setProvider(null); - setFormIsOpened(false); - - return; - } - - closeIntegration(); - segment.track(IntegrationsStoreModalAnalytics.CLOSE_MODAL); - }, [segment, isFormOpened, setProvider, setFormIsOpened, closeIntegration]); - - useEffect(() => { - const handleKeyDown = (e) => { - if (openIntegration && e.key === 'Escape') { - handleCloseForm(); - } - }; - - document.addEventListener('keydown', handleKeyDown); - - return () => document.removeEventListener('keydown', handleKeyDown); - }, [openIntegration, handleCloseForm]); - - useEffect(() => { - if (!scrollTo || !openIntegration) return; - - setTimeout(() => { - const channelSection = document.getElementById(scrollTo); - const modalContainer = document.querySelector('.mantine-Modal-modal'); - if (channelSection && modalContainer) { - modalContainer.scrollBy({ - top: channelSection.getBoundingClientRect().top - HEADER_HEIGHT - HEADER_MARGIN, - behavior: 'smooth', - }); - } - }, 0); - }, [openIntegration, scrollTo]); - - return ( - - Integration Store - - - - - } - classNames={classes} - fullScreen - opened={openIntegration} - onClose={handleModalClose} - > - - - {!isLoading ? ( - <> - - - - - - - ) : null} - - - - - - - -
- -
-
- -
- -
-
- -
- -
-
-
-
-
-
- ); -} -const DRAWER_PADDING = 40; -const DRAWER_PADDING_SMALL = 20; -const HEADER_HEIGHT_SMALL = 70; -const HEADER_HEIGHT = 90; -const HEADER_MARGIN = 10; -const DISTANCE_FROM_HEADER = 64; -const INTEGRATION_SETTING_TOP_SMALL = HEADER_HEIGHT_SMALL + HEADER_MARGIN; -const INTEGRATION_SETTING_TOP = HEADER_HEIGHT + HEADER_MARGIN + DISTANCE_FROM_HEADER; - -const IntegrationCardWrapper = styled.div` - position: sticky; - box-sizing: border-box; - padding: 0; - display: flex; - justify-content: space-between; - flex-direction: column; - height: calc(100vh - ${INTEGRATION_SETTING_TOP_SMALL + DRAWER_PADDING_SMALL}px); - box-shadow: ${({ theme }) => (theme.colorScheme === 'dark' ? shadows.dark : shadows.medium)}; - border-radius: 7px; - background-color: ${({ theme }) => (theme.colorScheme === 'dark' ? colors.B20 : colors.B98)}; - overflow: hidden; - - @media screen and (min-width: 1367px) { - top: ${INTEGRATION_SETTING_TOP}px; - height: calc(100vh - ${INTEGRATION_SETTING_TOP + DRAWER_PADDING}px); - } -`; - -const useModalStyles = createStyles((theme: MantineTheme) => { - const dark = theme.colorScheme === 'dark'; - - return { - header: { - position: 'sticky', - top: 0, - padding: '30px', - marginLeft: '-30px', - marginRight: '-30px', - height: HEADER_HEIGHT_SMALL, - zIndex: 9, - boxShadow: dark ? shadows.dark : shadows.medium, - backgroundColor: dark ? colors.BGDark : colors.white, - marginBottom: 10, - '@media screen and (min-width: 1367px)': { - height: HEADER_HEIGHT, - }, - }, - title: { - width: '100%', - marginRight: 0, - h1: { - fontSize: 22, - }, - '@media screen and (min-width: 1367px)': { - h1: { - fontSize: 26, - }, - }, - }, - modal: { - backdropFilter: 'blur(15px)', - padding: '0px 30px !important', - backgroundColor: dark ? theme.fn.rgba(colors.BGDark, 0.8) : theme.fn.rgba(colors.white, 0.7), - }, - }; -}); - -const useDrawerStyles = createStyles((theme: MantineTheme) => { - return { - drawer: { - top: `${INTEGRATION_SETTING_TOP_SMALL - DRAWER_PADDING_SMALL}px`, - display: 'flex', - flexDirection: 'column', - justifyContent: 'end', - background: 'transparent', - width: 660, - padding: `${DRAWER_PADDING_SMALL}px !important`, - boxShadow: 'none', - - '@media screen and (min-width: 1367px)': { - top: `${INTEGRATION_SETTING_TOP - DRAWER_PADDING}px`, - padding: `${DRAWER_PADDING}px !important`, - }, - }, - }; -}); diff --git a/apps/web/src/pages/integrations/IntegrationsStorePage.tsx b/apps/web/src/pages/integrations/IntegrationsStorePage.tsx deleted file mode 100644 index 5fcdf57c29e..00000000000 --- a/apps/web/src/pages/integrations/IntegrationsStorePage.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { useState } from 'react'; -import styled from '@emotion/styled'; -import { Modal } from '@mantine/core'; -import { ChannelTypeEnum, EmailProviderIdEnum, InAppProviderIdEnum, SmsProviderIdEnum } from '@novu/shared'; - -import PageHeader from '../../components/layout/components/PageHeader'; -import PageContainer from '../../components/layout/components/PageContainer'; -import { ChannelGroup } from './components/ChannelGroup'; -import { ConnectIntegrationForm } from './components/ConnectIntegrationForm'; -import { When } from '../../components/utils/When'; -import { NovuEmailProviderModal } from './components/NovuEmailProviderModal'; -import { NovuInAppProviderModal } from './components/NovuInAppProviderModal'; -import { useProviders } from './useProviders'; -import { NovuSmsProviderModal } from './components/NovuSmsProviderModal'; -import { useCreateInAppIntegration } from '../../hooks/useCreateInAppIntegration'; -import { LoadingOverlay } from '@novu/design-system'; -import type { IIntegratedProvider } from './types'; - -export function IntegrationsStore() { - const { emailProviders, smsProvider, chatProvider, pushProvider, inAppProvider, isLoading, refetch } = useProviders(); - const [isModalOpened, setModalIsOpened] = useState(false); - const [isCreateIntegrationModal, setIsCreateIntegrationModal] = useState(false); - const [provider, setProvider] = useState(null); - const { create } = useCreateInAppIntegration((data: any) => { - setProvider({ - ...(provider as IIntegratedProvider), - integrationId: data._id, - active: data.active, - }); - }); - - async function handlerVisible( - visible: boolean, - createIntegrationModal: boolean, - providerConfig: IIntegratedProvider - ) { - setModalIsOpened(visible); - if (providerConfig.providerId === InAppProviderIdEnum.Novu && providerConfig.channel === ChannelTypeEnum.IN_APP) { - create(); - } - setProvider(providerConfig); - setIsCreateIntegrationModal(createIntegrationModal); - } - - async function handlerShowModal(showModal: boolean) { - await setModalIsOpened(showModal); - if (!showModal) { - await refetch(); - } - } - - return ( - - - - - setModalIsOpened(false)} - > - - setModalIsOpened(false)} - provider={provider as IIntegratedProvider} - showModal={handlerShowModal} - createModel={isCreateIntegrationModal} - /> - - - setModalIsOpened(false)} /> - - - setModalIsOpened(false)} - /> - - - setModalIsOpened(false)} /> - - - - - - - - - - - - - - ); -} - -const ContentWrapper = styled.div` - padding: 0 30px; -`; diff --git a/apps/web/src/pages/integrations/components/multi-provider/sort-providers.ts b/apps/web/src/pages/integrations/components/multi-provider/sort-providers.ts index 3fdf6837d52..788d85950c6 100644 --- a/apps/web/src/pages/integrations/components/multi-provider/sort-providers.ts +++ b/apps/web/src/pages/integrations/components/multi-provider/sort-providers.ts @@ -46,6 +46,7 @@ const providers: Record = { PushProviderIdEnum.APNS, PushProviderIdEnum.PushWebhook, PushProviderIdEnum.OneSignal, + PushProviderIdEnum.Pushpad, ], [ChannelTypeEnum.SMS]: [ SmsProviderIdEnum.Twilio, @@ -67,6 +68,7 @@ const providers: Record = { SmsProviderIdEnum.Termii, SmsProviderIdEnum.AfricasTalking, SmsProviderIdEnum.Novu, + SmsProviderIdEnum.Bandwidth, ].sort(), ], }; diff --git a/apps/web/src/pages/integrations/components/multi-provider/useSelectPrimaryIntegrationModal.tsx b/apps/web/src/pages/integrations/components/multi-provider/useSelectPrimaryIntegrationModal.tsx index d8f655a7664..797d42ec2d1 100644 --- a/apps/web/src/pages/integrations/components/multi-provider/useSelectPrimaryIntegrationModal.tsx +++ b/apps/web/src/pages/integrations/components/multi-provider/useSelectPrimaryIntegrationModal.tsx @@ -1,17 +1,14 @@ import { useState, useCallback } from 'react'; import { useDisclosure } from '@mantine/hooks'; -import { useInlineComponent, useIsMultiProviderConfigurationEnabled } from '../../../../hooks'; +import { useInlineComponent } from '../../../../hooks'; import { ISelectPrimaryIntegrationModalProps, SelectPrimaryIntegrationModal } from './SelectPrimaryIntegrationModal'; export const useSelectPrimaryIntegrationModal = () => { - const [opened, { open, close }] = useDisclosure(false); + const [isOpened, { open, close }] = useDisclosure(false); const [{ environmentId, channelType, exclude, onClose }, setModalProps] = useState< Partial> >({}); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); - const isOpened = opened && isMultiProviderConfigurationEnabled; - const onCloseCallback = useCallback(() => { close(); onClose?.(); diff --git a/apps/web/src/pages/integrations/useProviders.ts b/apps/web/src/pages/integrations/useProviders.ts index ec5c477566f..fb9c136d5ca 100644 --- a/apps/web/src/pages/integrations/useProviders.ts +++ b/apps/web/src/pages/integrations/useProviders.ts @@ -9,7 +9,7 @@ import { PushProviderIdEnum, } from '@novu/shared'; -import { useIntegrations, useIsMultiProviderConfigurationEnabled } from '../../hooks'; +import { useIntegrations } from '../../hooks'; import type { IIntegratedProvider, IntegrationEntity } from './types'; import { IS_DOCKER_HOSTED } from '../../config'; @@ -30,45 +30,6 @@ function fcmFallback(integration: IntegrationEntity | undefined, clonedCredentia } } -function initializeProviders(integrations: IntegrationEntity[]): IIntegratedProvider[] { - return providers - .filter((provider) => !NOVU_SMS_EMAIL_PROVIDERS.includes(provider.id)) - .map((providerItem) => { - const integration = integrations.find((integrationItem) => integrationItem.providerId === providerItem.id); - - const clonedCredentials = cloneDeep(providerItem.credentials); - - if (integration?.credentials && Object.keys(clonedCredentials).length !== 0) { - clonedCredentials.forEach((credential) => { - // eslint-disable-next-line no-param-reassign - credential.value = - credential.type === 'boolean' || credential.type === 'switch' - ? integration.credentials[credential.key] - : integration.credentials[credential.key]?.toString(); - }); - } - - // Remove this like after the run of the fcm-credentials-migration script - fcmFallback(integration, clonedCredentials); - - return { - providerId: providerItem.id, - integrationId: integration?._id ? integration._id : '', - displayName: providerItem.displayName, - channel: providerItem.channel, - credentials: integration?.credentials ? clonedCredentials : providerItem.credentials, - docReference: providerItem.docReference, - comingSoon: !!providerItem.comingSoon, - betaVersion: !!providerItem.betaVersion, - active: integration?.active ?? false, - connected: !!integration, - logoFileName: providerItem.logoFileName, - environmentId: integration?._environmentId, - primary: integration?.primary ?? false, - }; - }); -} - function initializeProvidersByIntegration(integrations: IntegrationEntity[]): IIntegratedProvider[] { return integrations .filter((integrationItem) => { @@ -140,13 +101,10 @@ const sortProviders = (unsortedProviders: IIntegratedProvider[]) => { export const useProviders = () => { const { integrations, loading: isLoading, refetch } = useIntegrations(); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const sortedProviders = useMemo(() => { if (integrations) { - const initializedProviders = isMultiProviderConfigurationEnabled - ? initializeProvidersByIntegration(integrations) - : initializeProviders(integrations); + const initializedProviders = initializeProvidersByIntegration(integrations); return { emailProviders: sortProviders( @@ -176,7 +134,7 @@ export const useProviders = () => { inAppProvider: [], providers: [], }; - }, [isMultiProviderConfigurationEnabled, integrations]); + }, [integrations]); return { ...sortedProviders, diff --git a/apps/web/src/pages/quick-start/steps/GetStarted.tsx b/apps/web/src/pages/quick-start/steps/GetStarted.tsx index 5d2c110e253..9a67138a54a 100644 --- a/apps/web/src/pages/quick-start/steps/GetStarted.tsx +++ b/apps/web/src/pages/quick-start/steps/GetStarted.tsx @@ -4,9 +4,7 @@ import { useEffect, useState } from 'react'; import { useSegment } from '../../../components/providers/SegmentProvider'; import { ArrowRight } from '@novu/design-system'; -import { useIsMultiProviderConfigurationEnabled } from '../../../hooks'; import { IntegrationsListModal } from '../../integrations/IntegrationsListModal'; -import { IntegrationsStoreModal } from '../../integrations/IntegrationsStoreModal'; import { ChannelsConfiguration } from '../components/ChannelsConfiguration'; import { GetStartedLayout } from '../components/layout/GetStartedLayout'; import { NavButton } from '../components/NavButton'; @@ -27,7 +25,6 @@ const ChannelsConfigurationHolder = styled.div` export function GetStarted() { const segment = useSegment(); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const [clickedChannel, setClickedChannel] = useState<{ open: boolean; channelType?: ChannelTypeEnum; @@ -56,20 +53,11 @@ export function GetStarted() { }} > - {isMultiProviderConfigurationEnabled ? ( - - ) : ( - - )} - + diff --git a/apps/web/src/pages/templates/components/LackIntegrationAlert.tsx b/apps/web/src/pages/templates/components/LackIntegrationAlert.tsx index 5fb28006a7c..13ace2c6e27 100644 --- a/apps/web/src/pages/templates/components/LackIntegrationAlert.tsx +++ b/apps/web/src/pages/templates/components/LackIntegrationAlert.tsx @@ -5,10 +5,9 @@ import styled from '@emotion/styled'; import { ChannelTypeEnum } from '@novu/shared'; import { colors, Text, ErrorIcon, WarningIcon, CircleArrowRight } from '@novu/design-system'; -import { IntegrationsStoreModal } from '../../integrations/IntegrationsStoreModal'; import { useSegment } from '../../../components/providers/SegmentProvider'; import { stepNames, TemplateEditorAnalyticsEnum } from '../constants'; -import { useEnvController, useIsMultiProviderConfigurationEnabled } from '../../../hooks'; +import { useEnvController } from '../../../hooks'; import { IntegrationsListModal } from '../../integrations/IntegrationsListModal'; import { Group } from '@mantine/core'; import { useSelectPrimaryIntegrationModal } from '../../integrations/components/multi-provider/useSelectPrimaryIntegrationModal'; @@ -29,7 +28,6 @@ export function LackIntegrationAlert({ const segment = useSegment(); const { environment } = useEnvController(); const [isIntegrationsModalOpened, openIntegrationsModal] = useState(false); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const { openModal: openSelectPrimaryIntegrationModal, SelectPrimaryIntegrationModal } = useSelectPrimaryIntegrationModal(); @@ -64,19 +62,11 @@ export function LackIntegrationAlert({ - {isMultiProviderConfigurationEnabled ? ( - - ) : ( - - )} + ); diff --git a/apps/web/src/pages/templates/components/ListProviders.tsx b/apps/web/src/pages/templates/components/ListProviders.tsx index e40cb363e70..c48932525f3 100644 --- a/apps/web/src/pages/templates/components/ListProviders.tsx +++ b/apps/web/src/pages/templates/components/ListProviders.tsx @@ -3,7 +3,7 @@ import { ChannelTypeEnum, NOVU_SMS_EMAIL_PROVIDERS } from '@novu/shared'; import { When } from '../../../components/utils/When'; import { Button, colors, Tooltip } from '@novu/design-system'; -import { useEnvController, useIsMultiProviderConfigurationEnabled } from '../../../hooks'; +import { useEnvController } from '../../../hooks'; import { IntegrationEnvironmentPill } from '../../integrations/components/IntegrationEnvironmentPill'; import { IntegrationStatus } from '../../integrations/components/IntegrationStatus'; import type { IIntegratedProvider } from '../../integrations/types'; @@ -23,7 +23,6 @@ export const ListProviders = ({ setProvider: (provider: IIntegratedProvider) => void; }) => { const { colorScheme } = useMantineColorScheme(); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const { environment: currentEnvironment } = useEnvController(); return ( @@ -65,7 +64,7 @@ export const ListProviders = ({ key={provider.identifier ?? provider.providerId} style={{ width: '100%', - padding: isMultiProviderConfigurationEnabled ? '8px 12px' : 15, + padding: '8px 12px', background: colorScheme === 'dark' ? colors.B20 : colors.B98, borderRadius: 8, marginBottom: 12, @@ -91,19 +90,16 @@ export const ListProviders = ({ - + {provider.name || provider.displayName} - + - - - +
(undefined); const [provider, setProvider] = useState(null); - const isMultiProviderConfigurationEnabled = useIsMultiProviderConfigurationEnabled(); const onIntegrationModalClose = () => { setProvider(null); @@ -74,21 +71,12 @@ export function ProvidersPage() { /> - {isMultiProviderConfigurationEnabled ? ( - - ) : ( - - )} + ); } diff --git a/apps/web/src/pages/templates/components/email-editor/EmailContentCard.tsx b/apps/web/src/pages/templates/components/email-editor/EmailContentCard.tsx index 09515fdffc9..0f96f92c557 100644 --- a/apps/web/src/pages/templates/components/email-editor/EmailContentCard.tsx +++ b/apps/web/src/pages/templates/components/email-editor/EmailContentCard.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { Tabs } from '@novu/design-system'; -import { useActiveIntegrations, useEnvController, useIsMultiProviderConfigurationEnabled } from '../../../../hooks'; +import { useActiveIntegrations, useEnvController } from '../../../../hooks'; import { EmailCustomCodeEditor } from './EmailCustomCodeEditor'; import { EmailInboxContent } from './EmailInboxContent'; import { EmailMessageEditor } from './EmailMessageEditor'; @@ -22,7 +22,6 @@ export function EmailContentCard({ const { control, setValue, watch } = useFormContext(); // retrieve all hook methods const contentType = watch(`steps.${index}.template.contentType`); const activeTab = contentType === 'customHtml' ? CUSTOM_CODE : EDITOR; - const isMultiProviderConfigEnabled = useIsMultiProviderConfigurationEnabled(); const { integrations = [] } = useActiveIntegrations(); const [integration, setIntegration]: any = useState(null); @@ -30,12 +29,8 @@ export function EmailContentCard({ if (integrations.length === 0) { return; } - setIntegration( - integrations.find((item) => - isMultiProviderConfigEnabled ? item.channel === 'email' && item.primary : item.channel === 'email' - ) || null - ); - }, [isMultiProviderConfigEnabled, integrations, setIntegration]); + setIntegration(integrations.find((item) => item.channel === 'email' && item.primary) || null); + }, [integrations, setIntegration]); const onTabChange = (value: string | null) => { setValue(`steps.${index}.template.contentType`, value === EDITOR ? 'editor' : 'customHtml'); diff --git a/apps/web/src/pages/templates/editor/Preview.tsx b/apps/web/src/pages/templates/editor/Preview.tsx index fe3b1363b31..7d57be29914 100644 --- a/apps/web/src/pages/templates/editor/Preview.tsx +++ b/apps/web/src/pages/templates/editor/Preview.tsx @@ -11,7 +11,7 @@ import { useProcessVariables } from '../../../hooks'; import { PreviewMobile } from './PreviewMobile'; import { PreviewWeb } from './PreviewWeb'; import { errorMessage } from '../../../utils/notifications'; -import { useActiveIntegrations, useIsMultiProviderConfigurationEnabled } from '../../../hooks'; +import { useActiveIntegrations } from '../../../hooks'; export const Preview = ({ activeStep, view }: { activeStep: number; view: string }) => { const { control } = useFormContext(); @@ -43,7 +43,6 @@ export const Preview = ({ activeStep, view }: { activeStep: number; view: string }); const { integrations = [] } = useActiveIntegrations(); - const isMultiProviderConfigEnabled = useIsMultiProviderConfigurationEnabled(); const [integration, setIntegration]: any = useState(null); const [parsedSubject, setParsedSubject] = useState(subject); const [content, setContent] = useState('
'); @@ -92,12 +91,8 @@ export const Preview = ({ activeStep, view }: { activeStep: number; view: string if (integrations.length === 0) { return; } - setIntegration( - integrations.find((item) => - isMultiProviderConfigEnabled ? item.channel === 'email' && item.primary : item.channel === 'email' - ) || null - ); - }, [isMultiProviderConfigEnabled, integrations, setIntegration]); + setIntegration(integrations.find((item) => item.channel === 'email' && item.primary) || null); + }, [integrations, setIntegration]); return ( <> diff --git a/apps/web/src/pages/templates/filter/FilterModal.tsx b/apps/web/src/pages/templates/filter/FilterModal.tsx index 2d6f9f8bb24..ea27f2d5a09 100644 --- a/apps/web/src/pages/templates/filter/FilterModal.tsx +++ b/apps/web/src/pages/templates/filter/FilterModal.tsx @@ -1,6 +1,6 @@ import { Divider, Grid, Group, Modal, useMantineTheme } from '@mantine/core'; import { Controller, useFieldArray, useWatch } from 'react-hook-form'; -import { FILTER_TO_LABEL, FilterPartTypeEnum, ChannelTypeEnum } from '@novu/shared'; +import { FILTER_TO_LABEL, FilterPartTypeEnum, ChannelTypeEnum, FieldOperatorEnum } from '@novu/shared'; import { When } from '../../../components/utils/When'; import { Button, colors, Input, Select, shadows, Title, Trash } from '@novu/design-system'; @@ -136,7 +136,7 @@ export function FilterModal({ mt={30} onClick={() => { append({ - operator: 'EQUAL', + operator: FieldOperatorEnum.EQUAL, on: 'payload', }); }} @@ -332,28 +332,28 @@ function EqualityForm({ { return ( +