From fd4e8d23ac30fee66f3748b98ba7d60e3aa79705 Mon Sep 17 00:00:00 2001 From: Matthias Kuhr <52661546+MatKuhr@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:49:29 +0200 Subject: [PATCH] chore: Refactor E2E Test using Jest (#51) * WIP * Apply local testing strategy * Fix server startup * Fix WGET * Fix WGET * Cleanup * More cleanup * Add Staging and Prod environments * Try printing environment info * Update .github/workflows/e2e-test.yaml Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update .github/workflows/e2e-test.yaml Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Update sample-code/src/index.ts Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> * Add linting and change to await/try/catch * Formatting * Try moving E2E test to jest * Cleanup and fix badge link * fix: Changes from lint * Cleanup * Remove redundant dependencies * Update lockfile * experiments * Fix jest * Update E2E Test workflow * Add install step * Update lockfile * Try fix * Fix TS finally * Remove unnecessary workaround * re-enable slack notification * Cleanup * Fix import paths * Add AI Core and Orchestration Tests * fix: Changes from lint * Disable orchestration e2e test * fix: Changes from lint * set private --------- Co-authored-by: Marika Marszalkowski <868536+marikaner@users.noreply.github.com> Co-authored-by: cloud-sdk-js Co-authored-by: deekshas8 --- .github/workflows/e2e-test.yaml | 24 +- .gitignore | 3 + jest.config.mjs | 12 +- package.json | 4 +- packages/gen-ai-hub/src/index.ts | 1 + pnpm-lock.yaml | 604 +++++++++++------- pnpm-workspace.yaml | 4 +- sample-code/README.md | 7 +- sample-code/package.json | 18 +- sample-code/src/index.ts | 46 +- sample-code/src/server.ts | 44 ++ tests/e2e-tests/jest.config.mjs | 5 + tests/e2e-tests/package.json | 28 + tests/e2e-tests/src/ai-core.test.ts | 15 + tests/e2e-tests/src/open-ai.test.ts | 16 + tests/e2e-tests/src/orchestration.test.ts | 24 + tests/e2e-tests/tsconfig.json | 11 + .../type-tests}/context.test-d.ts | 2 +- .../type-tests}/http-client.test-d.ts | 2 +- .../type-tests}/openai.test-d.ts | 4 +- .../type-tests}/orchestration.test-d.ts | 4 +- 21 files changed, 544 insertions(+), 334 deletions(-) create mode 100644 sample-code/src/server.ts create mode 100644 tests/e2e-tests/jest.config.mjs create mode 100644 tests/e2e-tests/package.json create mode 100644 tests/e2e-tests/src/ai-core.test.ts create mode 100644 tests/e2e-tests/src/open-ai.test.ts create mode 100644 tests/e2e-tests/src/orchestration.test.ts create mode 100644 tests/e2e-tests/tsconfig.json rename {type-tests => tests/type-tests}/context.test-d.ts (63%) rename {type-tests => tests/type-tests}/http-client.test-d.ts (88%) rename {type-tests => tests/type-tests}/openai.test-d.ts (82%) rename {type-tests => tests/type-tests}/orchestration.test-d.ts (93%) diff --git a/.github/workflows/e2e-test.yaml b/.github/workflows/e2e-test.yaml index 30797026..ca59053c 100644 --- a/.github/workflows/e2e-test.yaml +++ b/.github/workflows/e2e-test.yaml @@ -1,8 +1,5 @@ name: "E2E Test" on: - push: - branches: - - chore/e2e-test workflow_dispatch: schedule: - cron: 0 22 * * * @@ -20,9 +17,6 @@ jobs: secret-name: AI_CORE_PRODUCTION name: "Build and Test" runs-on: ubuntu-latest - env: - WGET_ARGS: "-qO- -S --content-on-error" - WGET_URL: "localhost:8080" steps: - name: "Checkout repository" uses: actions/checkout@v4 @@ -37,12 +31,12 @@ jobs: - name: Create .env file env: aicore: ${{ secrets[matrix.secret-name] }} - working-directory: ./sample-code run: | - echo "aicore='$aicore'" > .env + echo "aicore='$aicore'" > sample-code/.env + echo "aicore='$aicore'" > tests/e2e-tests/.env url=$(echo "$aicore" | jq -r '.serviceurls.AI_API_URL' | sed 's|^https://||') echo "Using AI Core ${{ matrix.environment }} instance on $url" - - name: "Start App" + - name: "Check Sample App Starts Up" working-directory: ./sample-code run: | pnpm run local & @@ -55,15 +49,11 @@ jobs: exit 1 fi done - - name: "Health Check" - run: | - wget "$WGET_ARGS" "$WGET_URL/health" - - name: "OpenAI Chat Completion" - run: | - wget "$WGET_ARGS" "$WGET_URL/llm" - - name: "OpenAI Text Embedding" + wget -qO- -S --content-on-error localhost:8080 + - name: "Execute E2E Tests" + working-directory: ./tests/e2e-tests run: | - wget "$WGET_ARGS" "$WGET_URL/embedding" + pnpm run e2e-test - name: "Slack Notification" if: failure() uses: slackapi/slack-github-action@v1.26.0 diff --git a/.gitignore b/.gitignore index 56839da4..4ed3ea34 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,7 @@ build/Release .env .env.test .env.local + +# VS Code +.vscode /pnpm-publish-summary.json diff --git a/jest.config.mjs b/jest.config.mjs index 5009c119..2bca7c35 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -97,7 +97,7 @@ const config = { // notifyMode: "failure-change", // A preset that is used as a base for Jest's configuration - preset: 'ts-jest', + preset: 'ts-jest/presets/default-esm', // Run tests from one or more projects // projects: undefined, @@ -153,9 +153,9 @@ const config = { testMatch: ['**/*.test.ts'], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], + testPathIgnorePatterns: [ + "./dist" + ], // The regexp pattern or array of patterns that Jest uses to detect test files // testRegex: [], @@ -166,6 +166,8 @@ const config = { // This option allows use of a custom test runner // testRunner: "jest-circus/runner", + // extensionsToTreatAsEsm: ['.ts'], + // A map from regular expressions to paths to transformers transform: { '^.+\\.tsx?$': [ @@ -186,7 +188,7 @@ const config = { // unmockedModulePathPatterns: undefined, // Indicates whether each individual test should be reported during the run - // verbose: undefined, + // verbose: true, // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode // watchPathIgnorePatterns: [], diff --git a/package.json b/package.json index 93e1e55e..aea8b179 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "repository": "github:SAP/ai-sdk-js", "private": true, "type": "module", - "types": "type-tests", + "types": "tests/type-tests", "tsd": { - "directory": "type-tests" + "directory": "tests/type-tests" }, "scripts": { "postinstall": "pnpm compile", diff --git a/packages/gen-ai-hub/src/index.ts b/packages/gen-ai-hub/src/index.ts index df77efd2..96aed6c6 100644 --- a/packages/gen-ai-hub/src/index.ts +++ b/packages/gen-ai-hub/src/index.ts @@ -14,3 +14,4 @@ export { LlmConfig, ChatMessages } from './orchestration/index.js'; +export { getAiCoreDestination } from './core/index.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9385173b..4ab7ee3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 3.17.0 '@sap-cloud-sdk/eslint-config': specifier: ^3.17.0 - version: 3.17.0(@types/eslint@7.29.0)(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(prettier@3.3.3)(typescript@5.5.4) + version: 3.17.0(@types/eslint@8.56.10)(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(prettier@3.3.3)(typescript@5.5.4) '@sap-cloud-sdk/http-client': specifier: ^3.17.0 version: 3.17.0 @@ -40,7 +40,7 @@ importers: version: 3.3.3 ts-jest: specifier: ^29.2.4 - version: 29.2.4(@babel/core@7.25.2)(@jest/transform@30.0.0-alpha.5)(@jest/types@29.6.3)(babel-jest@30.0.0-alpha.5(@babel/core@7.25.2))(jest@30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.2.4(@babel/core@7.24.7)(@jest/types@29.6.3)(jest@30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) @@ -86,7 +86,7 @@ importers: sample-code: dependencies: '@sap-ai-sdk/gen-ai-hub': - specifier: workspace:* + specifier: workspace:^ version: link:../packages/gen-ai-hub '@types/express': specifier: ^4.17.21 @@ -94,12 +94,22 @@ importers: express: specifier: ^4.19.2 version: 4.19.2 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) - typescript: - specifier: ^5.4.5 - version: 5.5.4 + + tests/e2e-tests: + dependencies: + '@sap-ai-sdk/ai-core': + specifier: workspace:^ + version: link:../../packages/ai-core + '@sap-ai-sdk/gen-ai-hub': + specifier: workspace:^ + version: link:../../packages/gen-ai-hub + '@sap-ai-sdk/sample-code': + specifier: workspace:^ + version: link:../../sample-code + devDependencies: + dotenv: + specifier: ^16.4.5 + version: 16.4.5 packages: @@ -126,40 +136,60 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} @@ -168,20 +198,25 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.0': - resolution: {integrity: sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} engines: {node: '>=6.0.0'} hasBin: true @@ -266,8 +301,12 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.2': - resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==} + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} '@babel/types@7.25.2': @@ -494,8 +533,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -570,8 +609,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.32.35': - resolution: {integrity: sha512-Ul3YyOTU++to8cgNkttakC0dWvpERr6RYoHO2W47DLbFvrwBDJUY31B1sImH6JZSYc4Kt4PyHtoPNu+vL2r2dA==} + '@sinclair/typebox@0.32.34': + resolution: {integrity: sha512-a3Z3ytYl6R/+7ldxx04PO1semkwWlX/8pTqxsPw4quIcIXDFPZhOc1Wx8azWmkU26ccK3mHwcWenn0avNgAKQg==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -616,6 +655,9 @@ packages: '@types/eslint@7.29.0': resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -655,9 +697,6 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.14.13': - resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} - '@types/node@20.14.14': resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} @@ -778,8 +817,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -931,8 +970,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.2: - resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -976,8 +1015,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001645: - resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + caniuse-lite@1.0.30001640: + resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1201,6 +1240,10 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1215,8 +1258,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.4.816: + resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -1338,8 +1381,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@48.10.2: - resolution: {integrity: sha512-xTkf/MmEeVrTbezc6kDqCJmK9RcseIKo8X4oyoDCMvV4LY8dqrQi8kmfRrv9n0gNBkCclevaOh2Lkmu6Fs8SLg==} + eslint-plugin-jsdoc@48.11.0: + resolution: {integrity: sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1407,6 +1450,10 @@ packages: engines: {node: '>=4'} hasBin: true + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1480,9 +1527,6 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -1730,8 +1774,8 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -1783,8 +1827,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} is-data-view@1.0.1: @@ -1900,8 +1944,9 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} @@ -2191,12 +2236,17 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + logform@2.6.1: resolution: {integrity: sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==} engines: {node: '>= 12.0.0'} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} + engines: {node: 14 || >=16.14} lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2342,8 +2392,8 @@ packages: node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2704,6 +2754,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2900,6 +2955,10 @@ packages: resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} hasBin: true + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.1: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3238,8 +3297,8 @@ snapshots: '@apidevtools/openapi-schemas': 2.1.0 '@apidevtools/swagger-methods': 3.0.2 '@jsdevtools/ono': 7.1.3 - ajv: 8.17.1 - ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv: 8.16.0 + ajv-draft-04: 1.0.0(ajv@8.16.0) call-me-maybe: 1.0.2 openapi-types: 12.1.3 @@ -3248,20 +3307,20 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.24.7': {} - '@babel/core@7.25.2': + '@babel/core@7.24.7': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.0 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 debug: 4.3.6 gensync: 1.0.0-beta.2 @@ -3270,57 +3329,77 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-compilation-targets@7.24.7': dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.2 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.24.7 + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.24.7 + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.2 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.24.7': {} '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.2 - '@babel/types': 7.25.2 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.24.7': {} - '@babel/helpers@7.25.0': + '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.24.7 '@babel/highlight@7.24.7': dependencies: @@ -3329,79 +3408,83 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.25.0': + '@babel/parser@7.24.7': + dependencies: + '@babel/types': 7.24.7 + + '@babel/parser@7.25.3': dependencies: '@babel/types': 7.25.2 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/runtime@7.25.0': dependencies: @@ -3410,21 +3493,30 @@ snapshots: '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.0 + '@babel/parser': 7.25.3 '@babel/types': 7.25.2 - '@babel/traverse@7.25.2': + '@babel/traverse@7.24.7': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.0 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color + '@babel/types@7.24.7': + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@babel/types@7.25.2': dependencies: '@babel/helper-string-parser': 7.24.8 @@ -3790,7 +3882,7 @@ snapshots: '@jest/schemas@30.0.0-alpha.5': dependencies: - '@sinclair/typebox': 0.32.35 + '@sinclair/typebox': 0.32.34 '@jest/snapshot-utils@30.0.0-alpha.5': dependencies: @@ -3821,7 +3913,7 @@ snapshots: '@jest/transform@30.0.0-alpha.5': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.24.7 '@jest/types': 30.0.0-alpha.5 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -3861,24 +3953,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.4.15 '@jsdevtools/ono@7.1.3': {} @@ -3929,16 +4021,16 @@ snapshots: - encoding - supports-color - '@sap-cloud-sdk/eslint-config@3.17.0(@types/eslint@7.29.0)(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(prettier@3.3.3)(typescript@5.5.4)': + '@sap-cloud-sdk/eslint-config@3.17.0(@types/eslint@8.56.10)(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(prettier@3.3.3)(typescript@5.5.4)': dependencies: '@eslint/js': 9.8.0 eslint: 9.8.0 eslint-config-prettier: 9.1.0(eslint@9.8.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) - eslint-plugin-jsdoc: 48.10.2(eslint@9.8.0) - eslint-plugin-prettier: 5.2.1(@types/eslint@7.29.0)(eslint-config-prettier@9.1.0(eslint@9.8.0))(eslint@9.8.0)(prettier@3.3.3) + eslint-plugin-jsdoc: 48.11.0(eslint@9.8.0) + eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.8.0))(eslint@9.8.0)(prettier@3.3.3) eslint-plugin-regex: 1.10.0(eslint@9.8.0) - eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) + eslint-plugin-unused-imports: 4.0.1(eslint@9.8.0) typescript-eslint: 7.18.0(eslint@9.8.0)(typescript@5.5.4) transitivePeerDependencies: - '@types/eslint' @@ -4013,7 +4105,7 @@ snapshots: dependencies: axios: 1.7.2 chalk: 4.1.2 - logform: 2.6.1 + logform: 2.6.0 voca: 1.4.1 winston: 3.13.1 winston-transport: 4.7.1 @@ -4039,7 +4131,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.32.35': {} + '@sinclair/typebox@0.32.34': {} '@sinonjs/commons@3.0.1': dependencies: @@ -4061,44 +4153,50 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.0 - '@babel/types': 7.25.2 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.24.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.0 - '@babel/types': 7.25.2 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.24.7 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.14.13 + '@types/node': 20.14.14 '@types/connect@3.4.38': dependencies: - '@types/node': 20.14.13 + '@types/node': 20.14.14 '@types/eslint@7.29.0': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + optional: true + '@types/estree@1.0.5': {} '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.14.13 + '@types/node': 20.14.14 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -4137,10 +4235,6 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.14.13': - dependencies: - undici-types: 5.26.5 - '@types/node@20.14.14': dependencies: undici-types: 5.26.5 @@ -4156,12 +4250,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.14.13 + '@types/node': 20.14.14 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.14.13 + '@types/node': 20.14.14 '@types/send': 0.17.4 '@types/stack-utils@2.0.3': {} @@ -4270,9 +4364,9 @@ snapshots: acorn@8.12.1: {} - ajv-draft-04@1.0.0(ajv@8.17.1): + ajv-draft-04@1.0.0(ajv@8.16.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.16.0 ajv@6.12.6: dependencies: @@ -4281,12 +4375,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.16.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + uri-js: 4.4.1 ansi-colors@4.1.3: {} @@ -4401,13 +4495,13 @@ snapshots: transitivePeerDependencies: - debug - babel-jest@30.0.0-alpha.5(@babel/core@7.25.2): + babel-jest@30.0.0-alpha.5(@babel/core@7.24.7): dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.24.7 '@jest/transform': 30.0.0-alpha.5 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 30.0.0-alpha.5(@babel/core@7.25.2) + babel-preset-jest: 30.0.0-alpha.5(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -4416,7 +4510,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -4427,31 +4521,31 @@ snapshots: babel-plugin-jest-hoist@30.0.0-alpha.5: dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - - babel-preset-jest@30.0.0-alpha.5(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + + babel-preset-jest@30.0.0-alpha.5(@babel/core@7.24.7): + dependencies: + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 30.0.0-alpha.5 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) balanced-match@1.0.2: {} @@ -4489,12 +4583,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.2: + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001645 - electron-to-chromium: 1.5.4 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.2) + caniuse-lite: 1.0.30001640 + electron-to-chromium: 1.4.816 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.1) bs-logger@0.2.6: dependencies: @@ -4532,7 +4626,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001645: {} + caniuse-lite@1.0.30001640: {} chalk@2.4.2: dependencies: @@ -4713,6 +4807,8 @@ snapshots: dependencies: esutils: 2.0.3 + dotenv@16.4.5: {} + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -4725,7 +4821,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.4: {} + electron-to-chromium@1.4.816: {} emittery@0.13.1: {} @@ -4853,7 +4949,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.0 + is-core-module: 2.14.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color @@ -4880,7 +4976,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) hasown: 2.0.2 - is-core-module: 2.15.0 + is-core-module: 2.14.0 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -4895,7 +4991,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@48.10.2(eslint@9.8.0): + eslint-plugin-jsdoc@48.11.0(eslint@9.8.0): dependencies: '@es-joy/jsdoccomment': 0.46.0 are-docs-informative: 0.0.2 @@ -4912,26 +5008,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.2.1(@types/eslint@7.29.0)(eslint-config-prettier@9.1.0(eslint@9.8.0))(eslint@9.8.0)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.8.0))(eslint@9.8.0)(prettier@3.3.3): dependencies: eslint: 9.8.0 prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 optionalDependencies: - '@types/eslint': 7.29.0 + '@types/eslint': 8.56.10 eslint-config-prettier: 9.1.0(eslint@9.8.0) eslint-plugin-regex@1.10.0(eslint@9.8.0): dependencies: eslint: 9.8.0 - eslint-plugin-unused-imports@4.0.1(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): + eslint-plugin-unused-imports@4.0.1(eslint@9.8.0): dependencies: eslint: 9.8.0 eslint-rule-composer: 0.3.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) eslint-rule-composer@0.3.0: {} @@ -4964,7 +5058,7 @@ snapshots: eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 espree: 10.1.0 - esquery: 1.6.0 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -4993,6 +5087,10 @@ snapshots: esprima@4.0.1: {} + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -5105,8 +5203,6 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.1: {} - fastest-levenshtein@1.0.16: {} fastq@1.17.1: @@ -5255,7 +5351,7 @@ snapshots: glob@10.4.2: dependencies: foreground-child: 3.2.1 - jackspeak: 3.4.3 + jackspeak: 3.4.0 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 @@ -5264,7 +5360,7 @@ snapshots: glob@10.4.5: dependencies: foreground-child: 3.2.1 - jackspeak: 3.4.3 + jackspeak: 3.4.0 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 @@ -5362,7 +5458,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@3.2.0: + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 @@ -5408,7 +5504,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.15.0: + is-core-module@2.14.0: dependencies: hasown: 2.0.2 @@ -5485,8 +5581,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.0 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -5495,11 +5591,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.0 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.6.2 transitivePeerDependencies: - supports-color @@ -5522,7 +5618,7 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.3: + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -5574,7 +5670,7 @@ snapshots: '@jest/types': 30.0.0-alpha.5 chalk: 4.1.2 exit: 0.1.2 - import-local: 3.2.0 + import-local: 3.1.0 jest-config: 30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) jest-util: 30.0.0-alpha.5 jest-validate: 30.0.0-alpha.5 @@ -5587,11 +5683,11 @@ snapshots: jest-config@30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.24.7 '@jest/pattern': 30.0.0-alpha.5 '@jest/test-sequencer': 30.0.0-alpha.5 '@jest/types': 30.0.0-alpha.5 - babel-jest: 30.0.0-alpha.5(@babel/core@7.25.2) + babel-jest: 30.0.0-alpha.5(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 4.0.0 deepmerge: 4.3.1 @@ -5800,16 +5896,16 @@ snapshots: jest-snapshot@30.0.0-alpha.5: dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.0 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.2 + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@jest/expect-utils': 30.0.0-alpha.5 '@jest/snapshot-utils': 30.0.0-alpha.5 '@jest/transform': 30.0.0-alpha.5 '@jest/types': 30.0.0-alpha.5 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 30.0.0-alpha.5 graceful-fs: 4.2.11 @@ -5819,8 +5915,8 @@ snapshots: jest-message-util: 30.0.0-alpha.5 jest-util: 30.0.0-alpha.5 pretty-format: 30.0.0-alpha.5 - semver: 7.6.3 - synckit: 0.9.1 + semver: 7.6.2 + synckit: 0.9.0 transitivePeerDependencies: - supports-color @@ -5873,7 +5969,7 @@ snapshots: dependencies: '@jest/core': 30.0.0-alpha.5(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) '@jest/types': 30.0.0-alpha.5 - import-local: 3.2.0 + import-local: 3.1.0 jest-cli: 30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) transitivePeerDependencies: - '@types/node' @@ -5935,7 +6031,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.3 + semver: 7.6.2 jwa@1.4.1: dependencies: @@ -6007,6 +6103,15 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + logform@2.6.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + logform@2.6.1: dependencies: '@colors/colors': 1.6.0 @@ -6016,7 +6121,7 @@ snapshots: safe-stable-stringify: 2.4.3 triple-beam: 1.4.1 - lru-cache@10.4.3: {} + lru-cache@10.3.0: {} lru-cache@4.1.5: dependencies: @@ -6147,7 +6252,7 @@ snapshots: dependencies: es6-promise: 3.3.1 - node-releases@2.0.18: {} + node-releases@2.0.14: {} normalize-package-data@2.5.0: dependencies: @@ -6159,8 +6264,8 @@ snapshots: normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.0 - semver: 7.6.3 + is-core-module: 2.14.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -6317,7 +6422,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.4.3 + lru-cache: 10.3.0 minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -6465,7 +6570,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -6500,6 +6605,8 @@ snapshots: semver@6.3.1: {} + semver@7.6.2: {} + semver@7.6.3: {} send@0.18.0: @@ -6740,6 +6847,11 @@ snapshots: transitivePeerDependencies: - encoding + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + synckit@0.9.1: dependencies: '@pkgr/core': 0.1.1 @@ -6781,7 +6893,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-jest@29.2.4(@babel/core@7.25.2)(@jest/transform@30.0.0-alpha.5)(@jest/types@29.6.3)(babel-jest@30.0.0-alpha.5(@babel/core@7.25.2))(jest@30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.2.4(@babel/core@7.24.7)(@jest/types@29.6.3)(jest@30.0.0-alpha.5(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -6791,14 +6903,12 @@ snapshots: json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.3 + semver: 7.6.2 typescript: 5.5.4 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.25.2 - '@jest/transform': 30.0.0-alpha.5 + '@babel/core': 7.24.7 '@jest/types': 29.6.3 - babel-jest: 30.0.0-alpha.5(@babel/core@7.25.2) ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4): dependencies: @@ -6918,9 +7028,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.2): + update-browserslist-db@1.1.0(browserslist@4.23.1): dependencies: - browserslist: 4.23.2 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 @@ -7007,7 +7117,7 @@ snapshots: '@dabh/diagnostics': 2.0.3 async: 3.2.5 is-stream: 2.0.1 - logform: 2.6.1 + logform: 2.6.0 one-time: 1.0.0 readable-stream: 3.6.2 safe-stable-stringify: 2.4.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6def165c..26e0ec3a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,9 @@ packages: - 'packages/gen-ai-hub' # sample code - 'sample-code' + # e2e tests + - 'tests/e2e-tests' # exclude packages that are inside test directories - '!poc/' - '!test-util' - - '!type-tests/' + - '!tests/type-tests' diff --git a/sample-code/README.md b/sample-code/README.md index 6f30927d..bcd68003 100644 --- a/sample-code/README.md +++ b/sample-code/README.md @@ -1,6 +1,6 @@ # Sample Code and E2E Test -![e2e-test](https://github.com/SAP/ai-sdk-js/actions/workflows/e2e-test.yml/badge.svg) +![e2e-test](https://github.com/SAP/ai-sdk-js/actions/workflows/e2e-test.yaml/badge.svg) Sample code to demonstrate the usage of the SAP AI SDK. Also used as basis for running E2E tests. @@ -21,11 +21,6 @@ Call the test endpoints: - [Simple Chat Completion](localhost:8080/llm) - [Simple Embedding Call](localhost:8080/embedding) -Deploy to CF with: - -1. `cf login` into your Cloud Foundry account -2. `cf push` - ## Run the E2E Test Trigger the [GitHub Action](https://github.com/SAP/ai-sdk-js/actions/workflows/e2e-test.yml). diff --git a/sample-code/package.json b/sample-code/package.json index 7ebdf7b1..50bcc856 100644 --- a/sample-code/package.json +++ b/sample-code/package.json @@ -4,15 +4,21 @@ "version": "0.0.0", "private": "true", "dependencies": { - "@sap-ai-sdk/gen-ai-hub": "workspace:*", + "@sap-ai-sdk/gen-ai-hub": "workspace:^", "@types/express": "^4.17.21", - "express": "^4.19.2", - "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "express": "^4.19.2" }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map" + ], "scripts": { - "start": "node --loader ts-node/esm src/index.ts", - "local": "node --env-file=.env --loader ts-node/esm src/index.ts", + "start": "node --loader ts-node/esm src/server.ts", + "local": "node --env-file=.env --loader ts-node/esm src/server.ts", "compile": "tsc", "dev": "tsc -w", "lint": "eslint . && prettier . --config ../.prettierrc --ignore-path ../.prettierignore -c", diff --git a/sample-code/src/index.ts b/sample-code/src/index.ts index 06c3bc6b..263e923e 100644 --- a/sample-code/src/index.ts +++ b/sample-code/src/index.ts @@ -1,44 +1,2 @@ -/* eslint-disable no-console */ -import express from 'express'; -import { chatCompletion, computeEmbedding } from './aiservice.js'; - -const app = express(); -const port = 8080; - -app.get(['/', '/health'], (req, res) => { - res.send('Hello World! 🌍'); -}); - -app.get('/llm', async (req, res) => { - try { - res.send(await chatCompletion()); - } catch (error: any) { - console.error(error); - res - .status(500) - .send('Yikes, vibes are off apparently 😬 -> ' + error.message); - } -}); - -app.get('/embedding', async (req, res) => { - try { - const result = await computeEmbedding(); - if (result.length === 0) { - throw new Error('No embedding vector returned'); - } - res.send('Number crunching success, got a nice vector.'); - } catch (error: any) { - console.error(error); - res - .status(500) - .send('Yikes, vibes are off apparently 😬 -> ' + error.message); - } -}); - -app.get('/orchestration', (req, res) => { - res.status(418).send('Not implemented 🛠️'); -}); - -app.listen(port, () => { - console.log(`Server running at http://localhost:${port}`); -}); +// exported for e2e tests +export { chatCompletion, computeEmbedding } from './aiservice.js'; diff --git a/sample-code/src/server.ts b/sample-code/src/server.ts new file mode 100644 index 00000000..06c3bc6b --- /dev/null +++ b/sample-code/src/server.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-console */ +import express from 'express'; +import { chatCompletion, computeEmbedding } from './aiservice.js'; + +const app = express(); +const port = 8080; + +app.get(['/', '/health'], (req, res) => { + res.send('Hello World! 🌍'); +}); + +app.get('/llm', async (req, res) => { + try { + res.send(await chatCompletion()); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently 😬 -> ' + error.message); + } +}); + +app.get('/embedding', async (req, res) => { + try { + const result = await computeEmbedding(); + if (result.length === 0) { + throw new Error('No embedding vector returned'); + } + res.send('Number crunching success, got a nice vector.'); + } catch (error: any) { + console.error(error); + res + .status(500) + .send('Yikes, vibes are off apparently 😬 -> ' + error.message); + } +}); + +app.get('/orchestration', (req, res) => { + res.status(418).send('Not implemented 🛠️'); +}); + +app.listen(port, () => { + console.log(`Server running at http://localhost:${port}`); +}); diff --git a/tests/e2e-tests/jest.config.mjs b/tests/e2e-tests/jest.config.mjs new file mode 100644 index 00000000..44831b39 --- /dev/null +++ b/tests/e2e-tests/jest.config.mjs @@ -0,0 +1,5 @@ +import config from '../../jest.config.mjs'; +export default { + ...config, + displayName: 'e2e-tests', +}; diff --git a/tests/e2e-tests/package.json b/tests/e2e-tests/package.json new file mode 100644 index 00000000..0b6ca9c4 --- /dev/null +++ b/tests/e2e-tests/package.json @@ -0,0 +1,28 @@ +{ + "type": "module", + "name": "@sap-ai-sdk/e2e-tests", + "version": "0.0.1", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "private": "true", + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map" + ], + "dependencies": { + "@sap-ai-sdk/sample-code": "workspace:^", + "@sap-ai-sdk/gen-ai-hub": "workspace:^", + "@sap-ai-sdk/ai-core": "workspace:^" + }, + "scripts": { + "compile": "tsc", + "e2e-test": "NODE_OPTIONS=--experimental-vm-modules jest", + "lint": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -c", + "lint:fix": "prettier . --config ../../.prettierrc --ignore-path ../../.prettierignore -w --log-level error" + }, + "devDependencies": { + "dotenv": "^16.4.5" + } +} diff --git a/tests/e2e-tests/src/ai-core.test.ts b/tests/e2e-tests/src/ai-core.test.ts new file mode 100644 index 00000000..640ee719 --- /dev/null +++ b/tests/e2e-tests/src/ai-core.test.ts @@ -0,0 +1,15 @@ +import { DeploymentApi } from '@sap-ai-sdk/ai-core'; +import { getAiCoreDestination } from '@sap-ai-sdk/gen-ai-hub'; +import { HttpDestination } from '@sap-cloud-sdk/connectivity'; +import 'dotenv/config'; + +describe('ai-core', () => { + test.skip('should get deployments, but is currently broken', async () => { + const d = (await getAiCoreDestination()) as HttpDestination; + const deployments = await DeploymentApi.deploymentQuery( + {}, + { 'AI-Resource-Group': 'default' } + ).execute(d); + expect(deployments).toBeDefined(); + }); +}); diff --git a/tests/e2e-tests/src/open-ai.test.ts b/tests/e2e-tests/src/open-ai.test.ts new file mode 100644 index 00000000..003c6220 --- /dev/null +++ b/tests/e2e-tests/src/open-ai.test.ts @@ -0,0 +1,16 @@ +import { chatCompletion, computeEmbedding } from '@sap-ai-sdk/sample-code'; +import 'dotenv/config'; + +describe('OpenAI Foundation Model Access', () => { + it('should complete a chat', async () => { + const result = await chatCompletion(); + expect(result).toBeDefined(); + expect(result).toContain('Paris'); + }); + + it('should compute an embedding vector', async () => { + const result = await computeEmbedding(); + expect(result).toBeDefined(); + expect(result).not.toHaveLength(0); + }); +}); diff --git a/tests/e2e-tests/src/orchestration.test.ts b/tests/e2e-tests/src/orchestration.test.ts new file mode 100644 index 00000000..2ba37f90 --- /dev/null +++ b/tests/e2e-tests/src/orchestration.test.ts @@ -0,0 +1,24 @@ +import { + GenAiHubClient, + GenAiHubCompletionParameters +} from '@sap-ai-sdk/gen-ai-hub'; +import 'dotenv/config'; + +describe('orchestration', () => { + test.skip("should complete a chat, but currently doesn't work", async () => { + const request: GenAiHubCompletionParameters = { + deploymentConfiguration: { deploymentId: 'db1d64d9f06be467' }, + llmConfig: { + model_name: 'gpt-35-turbo-16k', + model_params: { max_tokens: 50, temperature: 0.1 } + }, + prompt: { + template: [{ role: 'user', content: 'Hello!' }] + } + }; + const response = await new GenAiHubClient().chatCompletion(request); + + expect(response.module_results).toBeDefined(); + expect(response.orchestration_result.choices).not.toHaveLength(0); + }); +}); diff --git a/tests/e2e-tests/tsconfig.json b/tests/e2e-tests/tsconfig.json new file mode 100644 index 00000000..7a08d33d --- /dev/null +++ b/tests/e2e-tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/.tsbuildinfo", + "composite": true + }, + "include": ["**/*.ts"], + "exclude": ["dist/**/*", "node_modules/**/*"] +} diff --git a/type-tests/context.test-d.ts b/tests/type-tests/context.test-d.ts similarity index 63% rename from type-tests/context.test-d.ts rename to tests/type-tests/context.test-d.ts index 2fbfd980..98029060 100644 --- a/type-tests/context.test-d.ts +++ b/tests/type-tests/context.test-d.ts @@ -1,5 +1,5 @@ import { Destination } from '@sap-cloud-sdk/connectivity'; import { expectType } from 'tsd'; -import { getAiCoreDestination } from '../packages/gen-ai-hub/src/core/context.js'; +import { getAiCoreDestination } from '../../packages/gen-ai-hub/src/core/context.js'; expectType>(getAiCoreDestination()); diff --git a/type-tests/http-client.test-d.ts b/tests/type-tests/http-client.test-d.ts similarity index 88% rename from type-tests/http-client.test-d.ts rename to tests/type-tests/http-client.test-d.ts index 289433b1..8b85cdc0 100644 --- a/type-tests/http-client.test-d.ts +++ b/tests/type-tests/http-client.test-d.ts @@ -1,6 +1,6 @@ import { HttpResponse } from '@sap-cloud-sdk/http-client'; import { expectError, expectType } from 'tsd'; -import { executeRequest } from '../packages/gen-ai-hub/src/core/http-client.js'; +import { executeRequest } from '../../packages/gen-ai-hub/src/core/http-client.js'; expectType>( executeRequest( diff --git a/type-tests/openai.test-d.ts b/tests/type-tests/openai.test-d.ts similarity index 82% rename from type-tests/openai.test-d.ts rename to tests/type-tests/openai.test-d.ts index 6defa2db..53050c22 100644 --- a/type-tests/openai.test-d.ts +++ b/tests/type-tests/openai.test-d.ts @@ -1,9 +1,9 @@ import { expectError, expectType } from 'tsd'; -import { OpenAiClient } from '../packages/gen-ai-hub/src/client/openai/openai-client.js'; +import { OpenAiClient } from '../../packages/gen-ai-hub/src/client/openai/openai-client.js'; import { OpenAiChatCompletionOutput, OpenAiEmbeddingOutput -} from '../packages/gen-ai-hub/src/client/openai/openai-types.js' +} from '../../packages/gen-ai-hub/src/client/openai/openai-types.js' const client = new OpenAiClient(); expectType(client ); diff --git a/type-tests/orchestration.test-d.ts b/tests/type-tests/orchestration.test-d.ts similarity index 93% rename from type-tests/orchestration.test-d.ts rename to tests/type-tests/orchestration.test-d.ts index 8c9dec67..04bb2740 100644 --- a/type-tests/orchestration.test-d.ts +++ b/tests/type-tests/orchestration.test-d.ts @@ -1,6 +1,6 @@ import { expectError, expectType } from 'tsd'; -import { GenAiHubClient } from '../packages/gen-ai-hub/src/orchestration/orchestration-client.js'; -import { CompletionPostResponse } from '../packages/gen-ai-hub/src/orchestration/index.js'; +import { GenAiHubClient } from '../../packages/gen-ai-hub/src/orchestration/orchestration-client.js'; +import { CompletionPostResponse } from '../../packages/gen-ai-hub/src/orchestration/index.js'; const client = new GenAiHubClient(); expectType(client);