Просмотр исходного кода

Merge pull request #10338 from growilabs/support/fix-biome-errors

support: Fix biome errors
Yuki Takei 6 месяцев назад
Родитель
Сommit
f31096a352
47 измененных файлов с 204 добавлено и 204 удалено
  1. 1 1
      apps/app/bin/openapi/generate-operation-ids/cli.spec.ts
  2. 1 1
      apps/app/bin/openapi/generate-operation-ids/cli.ts
  3. 3 3
      apps/app/bin/openapi/generate-operation-ids/generate-operation-ids.spec.ts
  4. 1 1
      apps/app/bin/print-memory-consumption.ts
  5. 0 14
      apps/app/config/cdn.js
  6. 1 1
      apps/app/config/migrate-mongo-config.js
  7. 1 0
      apps/app/config/next-i18next.config.js
  8. 2 2
      apps/app/next.config.js
  9. 1 1
      apps/app/src/features/comment/server/events/event-emitter.ts
  10. 1 1
      apps/app/src/features/external-user-group/server/routes/apiv3/external-user-group.ts
  11. 1 1
      apps/app/src/features/growi-plugin/server/consts/index.ts
  12. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-access-handler.spec.ts
  13. 6 3
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-access-handler.ts
  14. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-api-handler.spec.ts
  15. 5 2
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-api-handler.ts
  16. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-listing-api-handler.spec.ts
  17. 5 2
      apps/app/src/features/opentelemetry/server/anonymization/handlers/page-listing-api-handler.ts
  18. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/handlers/search-api-handler.spec.ts
  19. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/handlers/search-api-handler.ts
  20. 1 1
      apps/app/src/features/opentelemetry/server/anonymization/interfaces/anonymization-module.ts
  21. 1 1
      apps/app/src/features/opentelemetry/server/custom-metrics/application-metrics.spec.ts
  22. 1 1
      apps/app/src/features/opentelemetry/server/custom-metrics/application-metrics.ts
  23. 2 2
      apps/app/src/features/opentelemetry/server/logger.ts
  24. 1 1
      apps/app/src/features/opentelemetry/server/node-sdk-configuration.ts
  25. 1 1
      apps/app/src/features/opentelemetry/server/node-sdk-resource.ts
  26. 1 1
      apps/app/src/features/page-bulk-export/client/components/PageBulkExportSelectModal.tsx
  27. 3 3
      apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/index.ts
  28. 2 2
      apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/steps/create-page-snapshots-async.ts
  29. 3 3
      apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/steps/export-pages-to-fs-async.ts
  30. 2 2
      apps/app/src/features/templates/server/routes/apiv3/index.ts
  31. 2 2
      apps/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js
  32. 1 1
      apps/app/src/server/crowi/express-init.js
  33. 1 1
      apps/app/src/server/crowi/index.js
  34. 1 1
      apps/app/src/server/routes/ogp.ts
  35. 1 1
      apps/app/src/server/service/i18next.ts
  36. 3 4
      apps/app/src/server/util/project-dir-utils.ts
  37. 1 2
      apps/app/src/stores-universal/context.tsx
  38. 1 0
      apps/app/src/stores-universal/use-context-swr.tsx
  39. 2 2
      apps/app/src/utils/next.config.utils.js
  40. 1 1
      apps/app/test/integration/models/page-redirect.test.js
  41. 1 1
      apps/app/test/integration/models/page.test.js
  42. 1 1
      apps/app/test/integration/models/user.test.js
  43. 1 1
      apps/app/test/integration/setup-crowi.ts
  44. 1 1
      apps/pdf-converter/package.json
  45. 7 2
      biome.json
  46. 1 1
      package.json
  47. 126 126
      pnpm-lock.yaml

+ 1 - 1
apps/app/bin/openapi/generate-operation-ids/cli.spec.ts

@@ -1,4 +1,4 @@
-import { writeFileSync } from 'fs';
+import { writeFileSync } from 'node:fs';
 
 
 import { beforeEach, describe, expect, it, vi } from 'vitest';
 import { beforeEach, describe, expect, it, vi } from 'vitest';
 
 

+ 1 - 1
apps/app/bin/openapi/generate-operation-ids/cli.ts

@@ -1,5 +1,5 @@
+import { writeFileSync } from 'node:fs';
 import { Command } from 'commander';
 import { Command } from 'commander';
-import { writeFileSync } from 'fs';
 
 
 import { generateOperationIds } from './generate-operation-ids';
 import { generateOperationIds } from './generate-operation-ids';
 
 

+ 3 - 3
apps/app/bin/openapi/generate-operation-ids/generate-operation-ids.spec.ts

@@ -1,7 +1,7 @@
-import fs from 'fs/promises';
+import fs from 'node:fs/promises';
+import { tmpdir } from 'node:os';
+import path from 'node:path';
 import type { OpenAPI3 } from 'openapi-typescript';
 import type { OpenAPI3 } from 'openapi-typescript';
-import { tmpdir } from 'os';
-import path from 'path';
 import { describe, expect, it } from 'vitest';
 import { describe, expect, it } from 'vitest';
 
 
 import { generateOperationIds } from './generate-operation-ids';
 import { generateOperationIds } from './generate-operation-ids';

+ 1 - 1
apps/app/bin/print-memory-consumption.ts

@@ -11,7 +11,7 @@
  *        print-memory-consumption.ts [--port=9229] [--host=localhost] [--json]
  *        print-memory-consumption.ts [--port=9229] [--host=localhost] [--json]
  */
  */
 
 
-import { get } from 'http';
+import { get } from 'node:http';
 
 
 import WebSocket from 'ws';
 import WebSocket from 'ws';
 
 

+ 0 - 14
apps/app/config/cdn.js

@@ -1,14 +0,0 @@
-import path from 'path';
-
-import { projectRoot } from '~/utils/project-dir-utils';
-
-export const cdnLocalScriptRoot = path.join(
-  projectRoot,
-  'public/static/js/cdn',
-);
-export const cdnLocalScriptWebRoot = '/static/js/cdn';
-export const cdnLocalStyleRoot = path.join(
-  projectRoot,
-  'public/static/styles/cdn',
-);
-export const cdnLocalStyleWebRoot = '/static/styles/cdn';

+ 1 - 1
apps/app/config/migrate-mongo-config.js

@@ -6,7 +6,7 @@
  */
  */
 const isProduction = process.env.NODE_ENV === 'production';
 const isProduction = process.env.NODE_ENV === 'production';
 
 
-const { URL } = require('url');
+const { URL } = require('node:url');
 
 
 const { getMongoUri, mongoOptions } = isProduction
 const { getMongoUri, mongoOptions } = isProduction
   ? // eslint-disable-next-line import/extensions, import/no-unresolved
   ? // eslint-disable-next-line import/extensions, import/no-unresolved

+ 1 - 0
apps/app/config/next-i18next.config.js

@@ -1,5 +1,6 @@
 const isDev = process.env.NODE_ENV === 'development';
 const isDev = process.env.NODE_ENV === 'development';
 
 
+// biome-ignore lint/style/useNodejsImportProtocol: ignore
 const path = require('path');
 const path = require('path');
 
 
 const { AllLang } = require('@growi/core');
 const { AllLang } = require('@growi/core');

+ 2 - 2
apps/app/next.config.js

@@ -5,7 +5,7 @@
  * See: https://github.com/vercel/next.js/discussions/35969#discussioncomment-2522954
  * See: https://github.com/vercel/next.js/discussions/35969#discussioncomment-2522954
  */
  */
 
 
-const path = require('path');
+const path = require('node:path');
 
 
 const { withSuperjson } = require('next-superjson');
 const { withSuperjson } = require('next-superjson');
 const {
 const {
@@ -93,7 +93,7 @@ const optimizePackageImports = [
   '@growi/ui',
   '@growi/ui',
 ];
 ];
 
 
-module.exports = async (phase, { defaultConfig }) => {
+module.exports = async (phase) => {
   const { i18n, localePath } = require('./config/next-i18next.config');
   const { i18n, localePath } = require('./config/next-i18next.config');
 
 
   /** @type {import('next').NextConfig} */
   /** @type {import('next').NextConfig} */

+ 1 - 1
apps/app/src/features/comment/server/events/event-emitter.ts

@@ -1,3 +1,3 @@
-import { EventEmitter } from 'events';
+import { EventEmitter } from 'node:events';
 
 
 export const commentEvent = new EventEmitter();
 export const commentEvent = new EventEmitter();

+ 1 - 1
apps/app/src/features/external-user-group/server/routes/apiv3/external-user-group.ts

@@ -964,7 +964,7 @@ module.exports = (crowi: Crowi): Router => {
           req.user.name,
           req.user.name,
           req.body.password,
           req.body.password,
         );
         );
-      } catch (e) {
+      } catch (_e) {
         return res.apiv3Err(
         return res.apiv3Err(
           new ErrorV3(
           new ErrorV3(
             'LDAP group sync failed',
             'LDAP group sync failed',

+ 1 - 1
apps/app/src/features/growi-plugin/server/consts/index.ts

@@ -1,4 +1,4 @@
-import { resolveFromRoot } from '~/utils/project-dir-utils';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 
 
 export const PLUGIN_STORING_PATH = resolveFromRoot('tmp/plugins');
 export const PLUGIN_STORING_PATH = resolveFromRoot('tmp/plugins');
 
 

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-access-handler.spec.ts

@@ -1,4 +1,4 @@
-import type { IncomingMessage } from 'http';
+import type { IncomingMessage } from 'node:http';
 
 
 import { describe, expect, it } from 'vitest';
 import { describe, expect, it } from 'vitest';
 
 

+ 6 - 3
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-access-handler.ts

@@ -1,3 +1,5 @@
+import { createHash } from 'node:crypto';
+import type { IncomingMessage } from 'node:http';
 import {
 import {
   getUsernameByPath,
   getUsernameByPath,
   isCreatablePage,
   isCreatablePage,
@@ -7,8 +9,6 @@ import {
   isUsersTopPage,
   isUsersTopPage,
 } from '@growi/core/dist/utils/page-path-utils';
 } from '@growi/core/dist/utils/page-path-utils';
 import { diag } from '@opentelemetry/api';
 import { diag } from '@opentelemetry/api';
-import { createHash } from 'crypto';
-import type { IncomingMessage } from 'http';
 
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -132,7 +132,10 @@ export const pageAccessModule: AnonymizationModule = {
   /**
   /**
    * Handle anonymization for page access requests
    * Handle anonymization for page access requests
    */
    */
-  handle(request: IncomingMessage, url: string): Record<string, string> | null {
+  handle(
+    _request: IncomingMessage,
+    url: string,
+  ): Record<string, string> | null {
     try {
     try {
       const parsedUrl = new URL(url, 'http://localhost');
       const parsedUrl = new URL(url, 'http://localhost');
       const originalPath = parsedUrl.pathname;
       const originalPath = parsedUrl.pathname;

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-api-handler.spec.ts

@@ -1,4 +1,4 @@
-import type { IncomingMessage } from 'http';
+import type { IncomingMessage } from 'node:http';
 
 
 import { beforeEach, describe, expect, it } from 'vitest';
 import { beforeEach, describe, expect, it } from 'vitest';
 
 

+ 5 - 2
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-api-handler.ts

@@ -1,5 +1,5 @@
+import type { IncomingMessage } from 'node:http';
 import { diag } from '@opentelemetry/api';
 import { diag } from '@opentelemetry/api';
-import type { IncomingMessage } from 'http';
 
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -28,7 +28,10 @@ export const pageApiModule: AnonymizationModule = {
   /**
   /**
    * Handle anonymization for page API endpoints
    * Handle anonymization for page API endpoints
    */
    */
-  handle(request: IncomingMessage, url: string): Record<string, string> | null {
+  handle(
+    _request: IncomingMessage,
+    url: string,
+  ): Record<string, string> | null {
     const attributes: Record<string, string> = {};
     const attributes: Record<string, string> = {};
     let hasAnonymization = false;
     let hasAnonymization = false;
 
 

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-listing-api-handler.spec.ts

@@ -1,4 +1,4 @@
-import type { IncomingMessage } from 'http';
+import type { IncomingMessage } from 'node:http';
 
 
 import { beforeEach, describe, expect, it } from 'vitest';
 import { beforeEach, describe, expect, it } from 'vitest';
 
 

+ 5 - 2
apps/app/src/features/opentelemetry/server/anonymization/handlers/page-listing-api-handler.ts

@@ -1,5 +1,5 @@
+import type { IncomingMessage } from 'node:http';
 import { diag } from '@opentelemetry/api';
 import { diag } from '@opentelemetry/api';
-import type { IncomingMessage } from 'http';
 
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -28,7 +28,10 @@ export const pageListingApiModule: AnonymizationModule = {
   /**
   /**
    * Handle anonymization for page-listing API endpoints
    * Handle anonymization for page-listing API endpoints
    */
    */
-  handle(request: IncomingMessage, url: string): Record<string, string> | null {
+  handle(
+    _request: IncomingMessage,
+    url: string,
+  ): Record<string, string> | null {
     const attributes: Record<string, string> = {};
     const attributes: Record<string, string> = {};
     let hasAnonymization = false;
     let hasAnonymization = false;
 
 

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/handlers/search-api-handler.spec.ts

@@ -1,4 +1,4 @@
-import type { IncomingMessage } from 'http';
+import type { IncomingMessage } from 'node:http';
 
 
 import { beforeEach, describe, expect, it } from 'vitest';
 import { beforeEach, describe, expect, it } from 'vitest';
 
 

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/handlers/search-api-handler.ts

@@ -1,5 +1,5 @@
+import type { IncomingMessage } from 'node:http';
 import { diag } from '@opentelemetry/api';
 import { diag } from '@opentelemetry/api';
-import type { IncomingMessage } from 'http';
 
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';

+ 1 - 1
apps/app/src/features/opentelemetry/server/anonymization/interfaces/anonymization-module.ts

@@ -1,4 +1,4 @@
-import type { IncomingMessage } from 'http';
+import type { IncomingMessage } from 'node:http';
 
 
 /**
 /**
  * Interface for anonymization modules
  * Interface for anonymization modules

+ 1 - 1
apps/app/src/features/opentelemetry/server/custom-metrics/application-metrics.spec.ts

@@ -1,5 +1,5 @@
+import crypto from 'node:crypto';
 import { type Meter, metrics, type ObservableGauge } from '@opentelemetry/api';
 import { type Meter, metrics, type ObservableGauge } from '@opentelemetry/api';
-import crypto from 'crypto';
 import { mock } from 'vitest-mock-extended';
 import { mock } from 'vitest-mock-extended';
 
 
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';

+ 1 - 1
apps/app/src/features/opentelemetry/server/custom-metrics/application-metrics.ts

@@ -1,5 +1,5 @@
+import crypto from 'node:crypto';
 import { diag, metrics } from '@opentelemetry/api';
 import { diag, metrics } from '@opentelemetry/api';
-import crypto from 'crypto';
 
 
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';

+ 2 - 2
apps/app/src/features/opentelemetry/server/logger.ts

@@ -23,7 +23,7 @@ class DiagLoggerBunyanAdapter implements DiagLogger {
             ? data.message
             ? data.message
             : message;
             : message;
       }
       }
-    } catch (e) {
+    } catch (_e) {
       // do nothing if the message is not a JSON string
       // do nothing if the message is not a JSON string
     }
     }
 
 
@@ -35,7 +35,7 @@ class DiagLoggerBunyanAdapter implements DiagLogger {
           try {
           try {
             const parsed = JSON.parse(arg);
             const parsed = JSON.parse(arg);
             return { ...acc, ...parsed };
             return { ...acc, ...parsed };
-          } catch (e) {
+          } catch (_e) {
             return { ...acc, additionalInfo: arg };
             return { ...acc, additionalInfo: arg };
           }
           }
         }
         }

+ 1 - 1
apps/app/src/features/opentelemetry/server/node-sdk-configuration.ts

@@ -76,7 +76,7 @@ export const generateNodeSDKConfiguration = (opts?: Option): Configuration => {
  * This function should be called after database is available
  * This function should be called after database is available
  */
  */
 export const generateAdditionalResourceAttributes = async (
 export const generateAdditionalResourceAttributes = async (
-  opts?: Option,
+  _opts?: Option,
 ): Promise<Resource> => {
 ): Promise<Resource> => {
   if (resource == null) {
   if (resource == null) {
     throw new Error(
     throw new Error(

+ 1 - 1
apps/app/src/features/opentelemetry/server/node-sdk-resource.ts

@@ -23,7 +23,7 @@ export const setResource = (sdk: NodeSDK, resource: Resource): void => {
   // Verify that we can access the _resource property
   // Verify that we can access the _resource property
   try {
   try {
     getResource(sdk);
     getResource(sdk);
-  } catch (e) {
+  } catch (_e) {
     throw new Error('Failed to access SDK resource');
     throw new Error('Failed to access SDK resource');
   }
   }
 
 

+ 1 - 1
apps/app/src/features/page-bulk-export/client/components/PageBulkExportSelectModal.tsx

@@ -50,7 +50,7 @@ const PageBulkExportSelectModal = (): JSX.Element => {
           restartJob: true,
           restartJob: true,
         });
         });
         toastSuccess(t('page_export.bulk_export_started'));
         toastSuccess(t('page_export.bulk_export_started'));
-      } catch (e) {
+      } catch (_e) {
         toastError(t('page_export.failed_to_export'));
         toastError(t('page_export.failed_to_export'));
       }
       }
       setIsRestartModalOpened(false);
       setIsRestartModalOpened(false);

+ 3 - 3
apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/index.ts

@@ -1,9 +1,9 @@
+import fs from 'node:fs';
+import path from 'node:path';
+import type { Readable } from 'node:stream';
 import type { IUser } from '@growi/core';
 import type { IUser } from '@growi/core';
 import { getIdForRef, isPopulated } from '@growi/core';
 import { getIdForRef, isPopulated } from '@growi/core';
-import fs from 'fs';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
-import path from 'path';
-import type { Readable } from 'stream';
 
 
 import type { SupportedActionType } from '~/interfaces/activity';
 import type { SupportedActionType } from '~/interfaces/activity';
 import { SupportedAction, SupportedTargetModel } from '~/interfaces/activity';
 import { SupportedAction, SupportedTargetModel } from '~/interfaces/activity';

+ 2 - 2
apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/steps/create-page-snapshots-async.ts

@@ -1,8 +1,8 @@
+import { createHash } from 'node:crypto';
+import { pipeline, Writable } from 'node:stream';
 import type { IPage } from '@growi/core';
 import type { IPage } from '@growi/core';
 import { getIdForRef, getIdStringForRef } from '@growi/core';
 import { getIdForRef, getIdStringForRef } from '@growi/core';
-import { createHash } from 'crypto';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
-import { pipeline, Writable } from 'stream';
 
 
 import { PageBulkExportJobStatus } from '~/features/page-bulk-export/interfaces/page-bulk-export';
 import { PageBulkExportJobStatus } from '~/features/page-bulk-export/interfaces/page-bulk-export';
 import { SupportedAction } from '~/interfaces/activity';
 import { SupportedAction } from '~/interfaces/activity';

+ 3 - 3
apps/app/src/features/page-bulk-export/server/service/page-bulk-export-job-cron/steps/export-pages-to-fs-async.ts

@@ -1,15 +1,15 @@
+import fs from 'node:fs';
+import path from 'node:path';
+import { pipeline, Writable } from 'node:stream';
 import { dynamicImport } from '@cspell/dynamic-import';
 import { dynamicImport } from '@cspell/dynamic-import';
 import { isPopulated } from '@growi/core';
 import { isPopulated } from '@growi/core';
 import {
 import {
   getParentPath,
   getParentPath,
   normalizePath,
   normalizePath,
 } from '@growi/core/dist/utils/path-utils';
 } from '@growi/core/dist/utils/path-utils';
-import fs from 'fs';
 import type { Root } from 'mdast';
 import type { Root } from 'mdast';
-import path from 'path';
 import type * as RemarkHtml from 'remark-html';
 import type * as RemarkHtml from 'remark-html';
 import type * as RemarkParse from 'remark-parse';
 import type * as RemarkParse from 'remark-parse';
-import { pipeline, Writable } from 'stream';
 import type * as Unified from 'unified';
 import type * as Unified from 'unified';
 
 
 import {
 import {

+ 2 - 2
apps/app/src/features/templates/server/routes/apiv3/index.ts

@@ -1,3 +1,4 @@
+import path from 'node:path';
 import { GrowiPluginType } from '@growi/core';
 import { GrowiPluginType } from '@growi/core';
 import { SCOPE } from '@growi/core/dist/interfaces';
 import { SCOPE } from '@growi/core/dist/interfaces';
 import type { TemplateSummary } from '@growi/pluginkit/dist/v4';
 import type { TemplateSummary } from '@growi/pluginkit/dist/v4';
@@ -7,15 +8,14 @@ import {
 } from '@growi/pluginkit/dist/v4/server/index.cjs';
 } from '@growi/pluginkit/dist/v4/server/index.cjs';
 import express from 'express';
 import express from 'express';
 import { param, query } from 'express-validator';
 import { param, query } from 'express-validator';
-import path from 'path';
 import { PLUGIN_STORING_PATH } from '~/features/growi-plugin/server/consts';
 import { PLUGIN_STORING_PATH } from '~/features/growi-plugin/server/consts';
 import { GrowiPlugin } from '~/features/growi-plugin/server/models';
 import { GrowiPlugin } from '~/features/growi-plugin/server/models';
 import type Crowi from '~/server/crowi';
 import type Crowi from '~/server/crowi';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
-import { resolveFromRoot } from '~/utils/project-dir-utils';
 
 
 const logger = loggerFactory('growi:routes:apiv3:templates');
 const logger = loggerFactory('growi:routes:apiv3:templates');
 
 

+ 2 - 2
apps/app/src/migrations/20211227060705-revision-path-to-page-id-schema-migration--fixed-7549.js

@@ -1,6 +1,6 @@
+import { Writable } from 'node:stream';
+import { pipeline } from 'node:stream/promises';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
-import { Writable } from 'stream';
-import { pipeline } from 'stream/promises';
 
 
 import getPageModel from '~/server/models/page';
 import getPageModel from '~/server/models/page';
 import { Revision } from '~/server/models/revision';
 import { Revision } from '~/server/models/revision';

+ 1 - 1
apps/app/src/server/crowi/express-init.js

@@ -3,8 +3,8 @@ import csrf from 'csurf';
 import qs from 'qs';
 import qs from 'qs';
 
 
 import { PLUGIN_EXPRESS_STATIC_DIR, PLUGIN_STORING_PATH } from '~/features/growi-plugin/server/consts';
 import { PLUGIN_EXPRESS_STATIC_DIR, PLUGIN_STORING_PATH } from '~/features/growi-plugin/server/consts';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
-import { resolveFromRoot } from '~/utils/project-dir-utils';
 
 
 import registerSafeRedirectFactory from '../middlewares/safe-redirect';
 import registerSafeRedirectFactory from '../middlewares/safe-redirect';
 
 

+ 1 - 1
apps/app/src/server/crowi/index.js

@@ -18,9 +18,9 @@ import instanciatePageBulkExportJobCleanUpCronService, {
 } from '~/features/page-bulk-export/server/service/page-bulk-export-job-clean-up-cron';
 } from '~/features/page-bulk-export/server/service/page-bulk-export-job-clean-up-cron';
 import instanciatePageBulkExportJobCronService from '~/features/page-bulk-export/server/service/page-bulk-export-job-cron';
 import instanciatePageBulkExportJobCronService from '~/features/page-bulk-export/server/service/page-bulk-export-job-cron';
 import { startCron as startAccessTokenCron } from '~/server/service/access-token';
 import { startCron as startAccessTokenCron } from '~/server/service/access-token';
+import { projectRoot } from '~/server/util/project-dir-utils';
 import { getGrowiVersion } from '~/utils/growi-version';
 import { getGrowiVersion } from '~/utils/growi-version';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
-import { projectRoot } from '~/utils/project-dir-utils';
 
 
 import UserEvent from '../events/user';
 import UserEvent from '../events/user';
 import { accessTokenParser } from '../middlewares/access-token-parser';
 import { accessTokenParser } from '../middlewares/access-token-parser';

+ 1 - 1
apps/app/src/server/routes/ogp.ts

@@ -13,8 +13,8 @@ import { param, validationResult } from 'express-validator';
 import type { HydratedDocument } from 'mongoose';
 import type { HydratedDocument } from 'mongoose';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 
 
+import { projectRoot } from '~/server/util/project-dir-utils';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
-import { projectRoot } from '~/utils/project-dir-utils';
 
 
 import type Crowi from '../crowi';
 import type Crowi from '../crowi';
 import { Attachment } from '../models/attachment';
 import { Attachment } from '../models/attachment';

+ 1 - 1
apps/app/src/server/service/i18next.ts

@@ -7,7 +7,7 @@ import resourcesToBackend from 'i18next-resources-to-backend';
 
 
 import * as i18nextConfig from '^/config/i18next.config';
 import * as i18nextConfig from '^/config/i18next.config';
 
 
-import { resolveFromRoot } from '~/utils/project-dir-utils';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 
 
 import { configManager } from './config-manager';
 import { configManager } from './config-manager';
 
 

+ 3 - 4
apps/app/src/utils/project-dir-utils.ts → apps/app/src/server/util/project-dir-utils.ts

@@ -1,9 +1,8 @@
-/* eslint-disable import/prefer-default-export */
+import fs from 'node:fs';
+import path from 'node:path';
+import process from 'node:process';
 
 
 import { isServer } from '@growi/core/dist/utils/browser-utils';
 import { isServer } from '@growi/core/dist/utils/browser-utils';
-import fs from 'fs';
-import path from 'path';
-import process from 'process';
 
 
 const isCurrentDirRoot = isServer() && fs.existsSync('./next.config.js');
 const isCurrentDirRoot = isServer() && fs.existsSync('./next.config.js');
 
 

+ 1 - 2
apps/app/src/stores-universal/context.tsx

@@ -1,8 +1,7 @@
+import type EventEmitter from 'node:events';
 import type { ColorScheme, IUserHasId } from '@growi/core';
 import type { ColorScheme, IUserHasId } from '@growi/core';
-
 import { AcceptedUploadFileType } from '@growi/core';
 import { AcceptedUploadFileType } from '@growi/core';
 import { useSWRStatic } from '@growi/core/dist/swr';
 import { useSWRStatic } from '@growi/core/dist/swr';
-import type EventEmitter from 'events';
 import type { SWRResponse } from 'swr';
 import type { SWRResponse } from 'swr';
 import useSWR from 'swr';
 import useSWR from 'swr';
 import useSWRImmutable from 'swr/immutable';
 import useSWRImmutable from 'swr/immutable';

+ 1 - 0
apps/app/src/stores-universal/use-context-swr.tsx

@@ -1,4 +1,5 @@
 import { useSWRStatic } from '@growi/core/dist/swr';
 import { useSWRStatic } from '@growi/core/dist/swr';
+// biome-ignore lint/style/useNodejsImportProtocol: ignore
 import assert from 'assert';
 import assert from 'assert';
 import type { Key, SWRConfiguration, SWRResponse } from 'swr';
 import type { Key, SWRConfiguration, SWRResponse } from 'swr';
 
 

+ 2 - 2
apps/app/src/utils/next.config.utils.js

@@ -1,7 +1,7 @@
 // workaround by https://github.com/martpie/next-transpile-modules/issues/143#issuecomment-817467144
 // workaround by https://github.com/martpie/next-transpile-modules/issues/143#issuecomment-817467144
 
 
-const fs = require('fs');
-const path = require('path');
+const fs = require('node:fs');
+const path = require('node:path');
 
 
 const nodeModulesPaths = [
 const nodeModulesPaths = [
   path.resolve(__dirname, '../../node_modules'),
   path.resolve(__dirname, '../../node_modules'),

+ 1 - 1
apps/app/test/integration/models/page-redirect.test.js

@@ -3,7 +3,7 @@ import mongoose from 'mongoose';
 import { getInstance } from '../setup-crowi';
 import { getInstance } from '../setup-crowi';
 
 
 describe('PageRedirect', () => {
 describe('PageRedirect', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   let crowi;
   let PageRedirect;
   let PageRedirect;
 
 

+ 1 - 1
apps/app/test/integration/models/page.test.js

@@ -9,7 +9,7 @@ let testGroup0;
 let parentPage;
 let parentPage;
 
 
 describe('Page', () => {
 describe('Page', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   let crowi;
   let Page;
   let Page;
   let PageQueryBuilder;
   let PageQueryBuilder;

+ 1 - 1
apps/app/test/integration/models/user.test.js

@@ -3,7 +3,7 @@ const mongoose = require('mongoose');
 const { getInstance } = require('../setup-crowi');
 const { getInstance } = require('../setup-crowi');
 
 
 describe('User', () => {
 describe('User', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   let crowi;
   let User;
   let User;
 
 

+ 1 - 1
apps/app/test/integration/setup-crowi.ts

@@ -1,4 +1,4 @@
-import { Server } from 'http';
+import { Server } from 'node:http';
 
 
 import Crowi from '../../src/server/crowi';
 import Crowi from '../../src/server/crowi';
 import { setupModelsDependentOnCrowi } from '../../src/server/crowi/setup-models';
 import { setupModelsDependentOnCrowi } from '../../src/server/crowi/setup-models';

+ 1 - 1
apps/pdf-converter/package.json

@@ -48,7 +48,7 @@
     "@types/connect": "^3.4.38",
     "@types/connect": "^3.4.38",
     "@types/express": "^4.17.21",
     "@types/express": "^4.17.21",
     "@types/multer": "^1.4.12",
     "@types/multer": "^1.4.12",
-    "@types/node": "^22.5.4",
+    "@types/node": "^20.18.3",
     "@types/supertest": "^6.0.3",
     "@types/supertest": "^6.0.3",
     "supertest": "^7.1.1",
     "supertest": "^7.1.1",
     "unplugin-swc": "^1.5.3"
     "unplugin-swc": "^1.5.3"

+ 7 - 2
biome.json

@@ -14,6 +14,7 @@
       "!**/.vscode/**",
       "!**/.vscode/**",
       "!**/turbo.json",
       "!**/turbo.json",
       "!**/.next/**",
       "!**/.next/**",
+      "!**/.terraform/**",
       "!bin/**",
       "!bin/**",
       "!tsconfig.base.json",
       "!tsconfig.base.json",
       "!**/.devcontainer/**",
       "!**/.devcontainer/**",
@@ -37,7 +38,8 @@
       "!apps/app/src/stores/**",
       "!apps/app/src/stores/**",
       "!apps/app/src/styles/**",
       "!apps/app/src/styles/**",
       "!apps/app/test/integration/service/**",
       "!apps/app/test/integration/service/**",
-      "!apps/app/test-with-vite/**"
+      "!apps/app/test-with-vite/**",
+      "!apps/app/tmp/**"
     ]
     ]
   },
   },
   "formatter": {
   "formatter": {
@@ -67,7 +69,10 @@
   },
   },
   "overrides": [
   "overrides": [
     {
     {
-      "includes": ["apps/pdf-converter/**", "./apps/slackbot-proxy/**"],
+      "includes": [
+        "apps/pdf-converter/**",
+        "./apps/slackbot-proxy/**"
+      ],
       "linter": {
       "linter": {
         "rules": {
         "rules": {
           "style": {
           "style": {

+ 1 - 1
package.json

@@ -53,7 +53,7 @@
     "@types/css-modules": "^1.0.2",
     "@types/css-modules": "^1.0.2",
     "@types/eslint": "^8.37.0",
     "@types/eslint": "^8.37.0",
     "@types/estree": "^1.0.1",
     "@types/estree": "^1.0.1",
-    "@types/node": "^20.14.0",
+    "@types/node": "^20.18.3",
     "@types/path-browserify": "^1.0.0",
     "@types/path-browserify": "^1.0.0",
     "@typescript-eslint/eslint-plugin": "^5.59.7",
     "@typescript-eslint/eslint-plugin": "^5.59.7",
     "@typescript-eslint/parser": "^5.59.7",
     "@typescript-eslint/parser": "^5.59.7",

+ 126 - 126
pnpm-lock.yaml

@@ -47,8 +47,8 @@ importers:
         specifier: ^1.0.1
         specifier: ^1.0.1
         version: 1.0.8
         version: 1.0.8
       '@types/node':
       '@types/node':
-        specifier: ^20.14.0
-        version: 20.14.0
+        specifier: ^20.18.3
+        version: 20.19.17
       '@types/path-browserify':
       '@types/path-browserify':
         specifier: ^1.0.0
         specifier: ^1.0.0
         version: 1.0.0
         version: 1.0.0
@@ -60,7 +60,7 @@ importers:
         version: 5.59.7(eslint@8.41.0)(typescript@5.0.4)
         version: 5.59.7(eslint@8.41.0)(typescript@5.0.4)
       '@vitejs/plugin-react':
       '@vitejs/plugin-react':
         specifier: ^4.3.1
         specifier: ^4.3.1
-        version: 4.3.1(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))
+        version: 4.3.1(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))
       '@vitest/coverage-v8':
       '@vitest/coverage-v8':
         specifier: ^2.1.1
         specifier: ^2.1.1
         version: 2.1.1(vitest@2.1.1)
         version: 2.1.1(vitest@2.1.1)
@@ -156,7 +156,7 @@ importers:
         version: 6.2.0
         version: 6.2.0
       ts-node:
       ts-node:
         specifier: ^10.9.2
         specifier: ^10.9.2
-        version: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.14.0)(typescript@5.0.4)
+        version: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.19.17)(typescript@5.0.4)
       ts-patch:
       ts-patch:
         specifier: ^3.2.0
         specifier: ^3.2.0
         version: 3.2.0
         version: 3.2.0
@@ -177,16 +177,16 @@ importers:
         version: 3.4.7(typescript@5.0.4)
         version: 3.4.7(typescript@5.0.4)
       vite:
       vite:
         specifier: ^5.4.20
         specifier: ^5.4.20
-        version: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+        version: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
       vite-plugin-dts:
       vite-plugin-dts:
         specifier: ^3.9.1
         specifier: ^3.9.1
-        version: 3.9.1(@types/node@20.14.0)(rollup@4.50.1)(typescript@5.0.4)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))
+        version: 3.9.1(@types/node@20.19.17)(rollup@4.50.1)(typescript@5.0.4)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))
       vite-tsconfig-paths:
       vite-tsconfig-paths:
         specifier: ^5.0.1
         specifier: ^5.0.1
-        version: 5.0.1(typescript@5.0.4)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))
+        version: 5.0.1(typescript@5.0.4)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))
       vitest:
       vitest:
         specifier: ^2.1.1
         specifier: ^2.1.1
-        version: 2.1.1(@types/node@20.14.0)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
+        version: 2.1.1(@types/node@20.19.17)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
       vitest-mock-extended:
       vitest-mock-extended:
         specifier: ^2.0.2
         specifier: ^2.0.2
         version: 2.0.2(typescript@5.0.4)(vitest@2.1.1)
         version: 2.0.2(typescript@5.0.4)(vitest@2.1.1)
@@ -901,7 +901,7 @@ importers:
         version: 3.1.0
         version: 3.1.0
       eslint-plugin-jest:
       eslint-plugin-jest:
         specifier: ^26.5.3
         specifier: ^26.5.3
-        version: 26.9.0(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(jest@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)))(typescript@5.4.2)
+        version: 26.9.0(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(jest@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)))(typescript@5.4.2)
       fastest-levenshtein:
       fastest-levenshtein:
         specifier: ^1.0.16
         specifier: ^1.0.16
         version: 1.0.16
         version: 1.0.16
@@ -928,7 +928,7 @@ importers:
         version: 4.2.0
         version: 4.2.0
       jest:
       jest:
         specifier: ^29.5.0
         specifier: ^29.5.0
-        version: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+        version: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       jest-date-mock:
       jest-date-mock:
         specifier: ^1.0.8
         specifier: ^1.0.8
         version: 1.0.10
         version: 1.0.10
@@ -967,7 +967,7 @@ importers:
         version: 5.1.0(react@18.2.0)
         version: 5.1.0(react@18.2.0)
       react-dnd:
       react-dnd:
         specifier: ^14.0.5
         specifier: ^14.0.5
-        version: 14.0.5(@types/hoist-non-react-statics@3.3.5)(@types/node@22.15.21)(@types/react@18.3.3)(react@18.2.0)
+        version: 14.0.5(@types/hoist-non-react-statics@3.3.5)(@types/node@20.19.17)(@types/react@18.3.3)(react@18.2.0)
       react-dnd-html5-backend:
       react-dnd-html5-backend:
         specifier: ^14.1.0
         specifier: ^14.1.0
         version: 14.1.0
         version: 14.1.0
@@ -1099,8 +1099,8 @@ importers:
         specifier: ^1.4.12
         specifier: ^1.4.12
         version: 1.4.12
         version: 1.4.12
       '@types/node':
       '@types/node':
-        specifier: ^22.5.4
-        version: 22.15.21
+        specifier: ^20.18.3
+        version: 20.19.17
       '@types/supertest':
       '@types/supertest':
         specifier: ^6.0.3
         specifier: ^6.0.3
         version: 6.0.3
         version: 6.0.3
@@ -5688,8 +5688,8 @@ packages:
   '@types/node@18.19.46':
   '@types/node@18.19.46':
     resolution: {integrity: sha512-vnRgMS7W6cKa1/0G3/DTtQYpVrZ8c0Xm6UkLaVFrb9jtcVC3okokW09Ki1Qdrj9ISokszD69nY4WDLRlvHlhAA==}
     resolution: {integrity: sha512-vnRgMS7W6cKa1/0G3/DTtQYpVrZ8c0Xm6UkLaVFrb9jtcVC3okokW09Ki1Qdrj9ISokszD69nY4WDLRlvHlhAA==}
 
 
-  '@types/node@20.14.0':
-    resolution: {integrity: sha512-5cHBxFGJx6L4s56Bubp4fglrEpmyJypsqI6RgzMfBHWUJQGWAAi8cWcgetEbZXHYXo9C2Fa4EEds/uSyS4cxmA==}
+  '@types/node@20.19.17':
+    resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==}
 
 
   '@types/node@22.15.21':
   '@types/node@22.15.21':
     resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==}
     resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==}
@@ -17441,27 +17441,27 @@ snapshots:
   '@jest/console@29.7.0':
   '@jest/console@29.7.0':
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       jest-message-util: 29.7.0
       jest-message-util: 29.7.0
       jest-util: 29.7.0
       jest-util: 29.7.0
       slash: 3.0.0
       slash: 3.0.0
 
 
-  '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))':
+  '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))':
     dependencies:
     dependencies:
       '@jest/console': 29.7.0
       '@jest/console': 29.7.0
       '@jest/reporters': 29.7.0
       '@jest/reporters': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       ansi-escapes: 4.3.2
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       chalk: 4.1.2
       ci-info: 3.9.0
       ci-info: 3.9.0
       exit: 0.1.2
       exit: 0.1.2
       graceful-fs: 4.2.11
       graceful-fs: 4.2.11
       jest-changed-files: 29.7.0
       jest-changed-files: 29.7.0
-      jest-config: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      jest-config: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       jest-haste-map: 29.7.0
       jest-haste-map: 29.7.0
       jest-message-util: 29.7.0
       jest-message-util: 29.7.0
       jest-regex-util: 29.6.3
       jest-regex-util: 29.6.3
@@ -17490,7 +17490,7 @@ snapshots:
     dependencies:
     dependencies:
       '@jest/fake-timers': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-mock: 29.7.0
       jest-mock: 29.7.0
 
 
   '@jest/expect-utils@29.7.0':
   '@jest/expect-utils@29.7.0':
@@ -17508,7 +17508,7 @@ snapshots:
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       '@sinonjs/fake-timers': 10.3.0
       '@sinonjs/fake-timers': 10.3.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-message-util: 29.7.0
       jest-message-util: 29.7.0
       jest-mock: 29.7.0
       jest-mock: 29.7.0
       jest-util: 29.7.0
       jest-util: 29.7.0
@@ -17530,7 +17530,7 @@ snapshots:
       '@jest/transform': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       '@jridgewell/trace-mapping': 0.3.29
       '@jridgewell/trace-mapping': 0.3.29
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
       collect-v8-coverage: 1.0.2
       exit: 0.1.2
       exit: 0.1.2
@@ -17600,7 +17600,7 @@ snapshots:
       '@jest/schemas': 29.6.3
       '@jest/schemas': 29.6.3
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-reports': 3.0.4
       '@types/istanbul-reports': 3.0.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/yargs': 17.0.32
       '@types/yargs': 17.0.32
       chalk: 4.1.2
       chalk: 4.1.2
 
 
@@ -17886,23 +17886,23 @@ snapshots:
     dependencies:
     dependencies:
       langium: 3.3.1
       langium: 3.3.1
 
 
-  '@microsoft/api-extractor-model@7.28.13(@types/node@20.14.0)':
+  '@microsoft/api-extractor-model@7.28.13(@types/node@20.19.17)':
     dependencies:
     dependencies:
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc-config': 0.16.2
       '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 4.0.2(@types/node@20.14.0)
+      '@rushstack/node-core-library': 4.0.2(@types/node@20.19.17)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@types/node'
       - '@types/node'
 
 
-  '@microsoft/api-extractor@7.43.0(@types/node@20.14.0)':
+  '@microsoft/api-extractor@7.43.0(@types/node@20.19.17)':
     dependencies:
     dependencies:
-      '@microsoft/api-extractor-model': 7.28.13(@types/node@20.14.0)
+      '@microsoft/api-extractor-model': 7.28.13(@types/node@20.19.17)
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc': 0.14.2
       '@microsoft/tsdoc-config': 0.16.2
       '@microsoft/tsdoc-config': 0.16.2
-      '@rushstack/node-core-library': 4.0.2(@types/node@20.14.0)
+      '@rushstack/node-core-library': 4.0.2(@types/node@20.19.17)
       '@rushstack/rig-package': 0.5.2
       '@rushstack/rig-package': 0.5.2
-      '@rushstack/terminal': 0.10.0(@types/node@20.14.0)
-      '@rushstack/ts-command-line': 4.19.1(@types/node@20.14.0)
+      '@rushstack/terminal': 0.10.0(@types/node@20.19.17)
+      '@rushstack/ts-command-line': 4.19.1(@types/node@20.19.17)
       lodash: 4.17.21
       lodash: 4.17.21
       minimatch: 3.0.8
       minimatch: 3.0.8
       resolve: 1.22.8
       resolve: 1.22.8
@@ -19176,7 +19176,7 @@ snapshots:
 
 
   '@rushstack/eslint-patch@1.1.3': {}
   '@rushstack/eslint-patch@1.1.3': {}
 
 
-  '@rushstack/node-core-library@4.0.2(@types/node@20.14.0)':
+  '@rushstack/node-core-library@4.0.2(@types/node@20.19.17)':
     dependencies:
     dependencies:
       fs-extra: 7.0.1
       fs-extra: 7.0.1
       import-lazy: 4.0.0
       import-lazy: 4.0.0
@@ -19185,23 +19185,23 @@ snapshots:
       semver: 7.5.4
       semver: 7.5.4
       z-schema: 5.0.6
       z-schema: 5.0.6
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
 
 
   '@rushstack/rig-package@0.5.2':
   '@rushstack/rig-package@0.5.2':
     dependencies:
     dependencies:
       resolve: 1.22.8
       resolve: 1.22.8
       strip-json-comments: 3.1.1
       strip-json-comments: 3.1.1
 
 
-  '@rushstack/terminal@0.10.0(@types/node@20.14.0)':
+  '@rushstack/terminal@0.10.0(@types/node@20.19.17)':
     dependencies:
     dependencies:
-      '@rushstack/node-core-library': 4.0.2(@types/node@20.14.0)
+      '@rushstack/node-core-library': 4.0.2(@types/node@20.19.17)
       supports-color: 8.1.1
       supports-color: 8.1.1
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
 
 
-  '@rushstack/ts-command-line@4.19.1(@types/node@20.14.0)':
+  '@rushstack/ts-command-line@4.19.1(@types/node@20.19.17)':
     dependencies:
     dependencies:
-      '@rushstack/terminal': 0.10.0(@types/node@20.14.0)
+      '@rushstack/terminal': 0.10.0(@types/node@20.19.17)
       '@types/argparse': 1.0.38
       '@types/argparse': 1.0.38
       argparse: 1.0.10
       argparse: 1.0.10
       string-argv: 0.3.2
       string-argv: 0.3.2
@@ -19222,18 +19222,18 @@ snapshots:
 
 
   '@slack/logger@3.0.0':
   '@slack/logger@3.0.0':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@slack/logger@4.0.0':
   '@slack/logger@4.0.0':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@slack/oauth@3.0.3':
   '@slack/oauth@3.0.3':
     dependencies:
     dependencies:
       '@slack/logger': 4.0.0
       '@slack/logger': 4.0.0
       '@slack/web-api': 7.9.1
       '@slack/web-api': 7.9.1
       '@types/jsonwebtoken': 9.0.9
       '@types/jsonwebtoken': 9.0.9
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jsonwebtoken: 9.0.2
       jsonwebtoken: 9.0.2
       lodash.isstring: 4.0.1
       lodash.isstring: 4.0.1
     transitivePeerDependencies:
     transitivePeerDependencies:
@@ -19263,7 +19263,7 @@ snapshots:
     dependencies:
     dependencies:
       '@slack/logger': 4.0.0
       '@slack/logger': 4.0.0
       '@slack/types': 2.14.0
       '@slack/types': 2.14.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/retry': 0.12.0
       '@types/retry': 0.12.0
       axios: 1.9.0
       axios: 1.9.0
       eventemitter3: 5.0.1
       eventemitter3: 5.0.1
@@ -20745,7 +20745,7 @@ snapshots:
   '@types/body-parser@1.19.5':
   '@types/body-parser@1.19.5':
     dependencies:
     dependencies:
       '@types/connect': 3.4.38
       '@types/connect': 3.4.38
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/bunyan@1.8.11':
   '@types/bunyan@1.8.11':
     dependencies:
     dependencies:
@@ -20755,11 +20755,11 @@ snapshots:
 
 
   '@types/cli-progress@3.9.2':
   '@types/cli-progress@3.9.2':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/cli-spinner@0.2.1':
   '@types/cli-spinner@0.2.1':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/color-name@1.1.1': {}
   '@types/color-name@1.1.1': {}
 
 
@@ -20769,7 +20769,7 @@ snapshots:
 
 
   '@types/connect@3.4.38':
   '@types/connect@3.4.38':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/cookie@0.4.1': {}
   '@types/cookie@0.4.1': {}
 
 
@@ -20777,7 +20777,7 @@ snapshots:
 
 
   '@types/cors@2.8.17':
   '@types/cors@2.8.17':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/css-modules@1.0.2': {}
   '@types/css-modules@1.0.2': {}
 
 
@@ -20904,7 +20904,7 @@ snapshots:
 
 
   '@types/es-aggregate-error@1.0.6':
   '@types/es-aggregate-error@1.0.6':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/eslint-scope@3.7.7':
   '@types/eslint-scope@3.7.7':
     dependencies:
     dependencies:
@@ -20924,7 +20924,7 @@ snapshots:
 
 
   '@types/express-serve-static-core@4.19.5':
   '@types/express-serve-static-core@4.19.5':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/qs': 6.9.18
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
       '@types/send': 0.17.4
@@ -20939,18 +20939,18 @@ snapshots:
   '@types/fs-extra@11.0.4':
   '@types/fs-extra@11.0.4':
     dependencies:
     dependencies:
       '@types/jsonfile': 6.1.4
       '@types/jsonfile': 6.1.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/geojson@7946.0.16': {}
   '@types/geojson@7946.0.16': {}
 
 
   '@types/glob@7.2.0':
   '@types/glob@7.2.0':
     dependencies:
     dependencies:
       '@types/minimatch': 3.0.5
       '@types/minimatch': 3.0.5
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/graceful-fs@4.1.9':
   '@types/graceful-fs@4.1.9':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/hast@2.3.4':
   '@types/hast@2.3.4':
     dependencies:
     dependencies:
@@ -20974,7 +20974,7 @@ snapshots:
 
 
   '@types/is-stream@1.1.0':
   '@types/is-stream@1.1.0':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/istanbul-lib-coverage@2.0.6': {}
   '@types/istanbul-lib-coverage@2.0.6': {}
 
 
@@ -20999,12 +20999,12 @@ snapshots:
 
 
   '@types/jsonfile@6.1.4':
   '@types/jsonfile@6.1.4':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/jsonwebtoken@9.0.9':
   '@types/jsonwebtoken@9.0.9':
     dependencies:
     dependencies:
       '@types/ms': 0.7.31
       '@types/ms': 0.7.31
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/katex@0.16.7': {}
   '@types/katex@0.16.7': {}
 
 
@@ -21020,7 +21020,7 @@ snapshots:
 
 
   '@types/memcached@2.2.10':
   '@types/memcached@2.2.10':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/methods@1.1.4': {}
   '@types/methods@1.1.4': {}
 
 
@@ -21034,7 +21034,7 @@ snapshots:
 
 
   '@types/mkdirp@1.0.2':
   '@types/mkdirp@1.0.2':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/ms@0.7.31': {}
   '@types/ms@0.7.31': {}
 
 
@@ -21044,13 +21044,13 @@ snapshots:
 
 
   '@types/mysql@2.15.26':
   '@types/mysql@2.15.26':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/node-cron@3.0.11': {}
   '@types/node-cron@3.0.11': {}
 
 
   '@types/node-fetch@2.6.11':
   '@types/node-fetch@2.6.11':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       form-data: 4.0.4
       form-data: 4.0.4
 
 
   '@types/node@12.20.55': {}
   '@types/node@12.20.55': {}
@@ -21061,9 +21061,9 @@ snapshots:
     dependencies:
     dependencies:
       undici-types: 5.26.5
       undici-types: 5.26.5
 
 
-  '@types/node@20.14.0':
+  '@types/node@20.19.17':
     dependencies:
     dependencies:
-      undici-types: 5.26.5
+      undici-types: 6.21.0
 
 
   '@types/node@22.15.21':
   '@types/node@22.15.21':
     dependencies:
     dependencies:
@@ -21073,7 +21073,7 @@ snapshots:
 
 
   '@types/oracledb@6.5.2':
   '@types/oracledb@6.5.2':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/path-browserify@1.0.0': {}
   '@types/path-browserify@1.0.0': {}
 
 
@@ -21083,17 +21083,17 @@ snapshots:
 
 
   '@types/pg@8.15.1':
   '@types/pg@8.15.1':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       pg-protocol: 1.7.0
       pg-protocol: 1.7.0
       pg-types: 4.0.2
       pg-types: 4.0.2
 
 
   '@types/pixelmatch@5.2.4':
   '@types/pixelmatch@5.2.4':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/pngjs@6.0.1':
   '@types/pngjs@6.0.1':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/prop-types@15.7.12': {}
   '@types/prop-types@15.7.12': {}
 
 
@@ -21124,7 +21124,7 @@ snapshots:
 
 
   '@types/readdir-glob@1.1.5':
   '@types/readdir-glob@1.1.5':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/retry@0.12.0': {}
   '@types/retry@0.12.0': {}
 
 
@@ -21135,12 +21135,12 @@ snapshots:
   '@types/send@0.17.4':
   '@types/send@0.17.4':
     dependencies:
     dependencies:
       '@types/mime': 1.3.2
       '@types/mime': 1.3.2
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/serve-static@1.15.7':
   '@types/serve-static@1.15.7':
     dependencies:
     dependencies:
       '@types/http-errors': 2.0.4
       '@types/http-errors': 2.0.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/send': 0.17.4
       '@types/send': 0.17.4
 
 
   '@types/stack-utils@2.0.3': {}
   '@types/stack-utils@2.0.3': {}
@@ -21149,7 +21149,7 @@ snapshots:
     dependencies:
     dependencies:
       '@types/cookiejar': 2.1.5
       '@types/cookiejar': 2.1.5
       '@types/methods': 1.1.4
       '@types/methods': 1.1.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       form-data: 4.0.4
       form-data: 4.0.4
 
 
   '@types/supertest@6.0.3':
   '@types/supertest@6.0.3':
@@ -21159,7 +21159,7 @@ snapshots:
 
 
   '@types/tedious@4.0.14':
   '@types/tedious@4.0.14':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/testing-library__dom@7.5.0':
   '@types/testing-library__dom@7.5.0':
     dependencies:
     dependencies:
@@ -21169,7 +21169,7 @@ snapshots:
 
 
   '@types/through@0.0.33':
   '@types/through@0.0.33':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
 
   '@types/trusted-types@2.0.7':
   '@types/trusted-types@2.0.7':
     optional: true
     optional: true
@@ -21198,7 +21198,7 @@ snapshots:
 
 
   '@types/whatwg-url@8.2.1':
   '@types/whatwg-url@8.2.1':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/webidl-conversions': 6.1.1
       '@types/webidl-conversions': 6.1.1
 
 
   '@types/ws@8.18.1':
   '@types/ws@8.18.1':
@@ -21213,7 +21213,7 @@ snapshots:
 
 
   '@types/yauzl@2.10.3':
   '@types/yauzl@2.10.3':
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
     optional: true
     optional: true
 
 
   '@types/zen-observable@0.8.3': {}
   '@types/zen-observable@0.8.3': {}
@@ -21430,14 +21430,14 @@ snapshots:
 
 
   '@unts/get-tsconfig@4.1.1': {}
   '@unts/get-tsconfig@4.1.1': {}
 
 
-  '@vitejs/plugin-react@4.3.1(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))':
+  '@vitejs/plugin-react@4.3.1(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))':
     dependencies:
     dependencies:
       '@babel/core': 7.24.6
       '@babel/core': 7.24.6
       '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6)
       '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6)
       '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6)
       '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6)
       '@types/babel__core': 7.20.5
       '@types/babel__core': 7.20.5
       react-refresh: 0.14.2
       react-refresh: 0.14.2
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - supports-color
 
 
@@ -21455,7 +21455,7 @@ snapshots:
       std-env: 3.7.0
       std-env: 3.7.0
       test-exclude: 7.0.1
       test-exclude: 7.0.1
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
-      vitest: 2.1.1(@types/node@20.14.0)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
+      vitest: 2.1.1(@types/node@20.19.17)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - supports-color
 
 
@@ -21466,13 +21466,13 @@ snapshots:
       chai: 5.1.1
       chai: 5.1.1
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
 
 
-  '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))':
+  '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))':
     dependencies:
     dependencies:
       '@vitest/spy': 2.1.1
       '@vitest/spy': 2.1.1
       estree-walker: 3.0.3
       estree-walker: 3.0.3
       magic-string: 0.30.11
       magic-string: 0.30.11
     optionalDependencies:
     optionalDependencies:
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
 
 
   '@vitest/pretty-format@2.1.1':
   '@vitest/pretty-format@2.1.1':
     dependencies:
     dependencies:
@@ -21502,7 +21502,7 @@ snapshots:
       sirv: 2.0.4
       sirv: 2.0.4
       tinyglobby: 0.2.6
       tinyglobby: 0.2.6
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
-      vitest: 2.1.1(@types/node@20.14.0)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
+      vitest: 2.1.1(@types/node@20.19.17)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
 
 
   '@vitest/utils@2.1.1':
   '@vitest/utils@2.1.1':
     dependencies:
     dependencies:
@@ -21835,7 +21835,7 @@ snapshots:
       '@swc/helpers': 0.5.17
       '@swc/helpers': 0.5.17
       '@types/command-line-args': 5.2.3
       '@types/command-line-args': 5.2.3
       '@types/command-line-usage': 5.0.4
       '@types/command-line-usage': 5.0.4
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       command-line-args: 6.0.1
       command-line-args: 6.0.1
       command-line-usage: 7.0.3
       command-line-usage: 7.0.3
       flatbuffers: 24.12.23
       flatbuffers: 24.12.23
@@ -23134,13 +23134,13 @@ snapshots:
       isobject: 3.0.1
       isobject: 3.0.1
       lazy-cache: 2.0.2
       lazy-cache: 2.0.2
 
 
-  create-jest@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)):
+  create-jest@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)):
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       chalk: 4.1.2
       chalk: 4.1.2
       exit: 0.1.2
       exit: 0.1.2
       graceful-fs: 4.2.11
       graceful-fs: 4.2.11
-      jest-config: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      jest-config: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       jest-util: 29.7.0
       jest-util: 29.7.0
       prompts: 2.4.2
       prompts: 2.4.2
     transitivePeerDependencies:
     transitivePeerDependencies:
@@ -23855,7 +23855,7 @@ snapshots:
     dependencies:
     dependencies:
       '@types/cookie': 0.4.1
       '@types/cookie': 0.4.1
       '@types/cors': 2.8.17
       '@types/cors': 2.8.17
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       accepts: 1.3.8
       accepts: 1.3.8
       base64id: 2.0.0
       base64id: 2.0.0
       cookie: 0.7.2
       cookie: 0.7.2
@@ -24243,13 +24243,13 @@ snapshots:
       - typescript
       - typescript
     optional: true
     optional: true
 
 
-  eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(jest@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)))(typescript@5.4.2):
+  eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(jest@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)))(typescript@5.4.2):
     dependencies:
     dependencies:
       '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.4.2)
       '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.4.2)
       eslint: 8.41.0
       eslint: 8.41.0
     optionalDependencies:
     optionalDependencies:
       '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2)
       '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7(eslint@8.41.0)(typescript@5.4.2))(eslint@8.41.0)(typescript@5.4.2)
-      jest: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      jest: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - supports-color
       - typescript
       - typescript
@@ -26057,7 +26057,7 @@ snapshots:
       '@jest/expect': 29.7.0
       '@jest/expect': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       co: 4.6.0
       co: 4.6.0
       dedent: 1.5.3
       dedent: 1.5.3
@@ -26077,16 +26077,16 @@ snapshots:
       - babel-plugin-macros
       - babel-plugin-macros
       - supports-color
       - supports-color
 
 
-  jest-cli@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)):
+  jest-cli@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)):
     dependencies:
     dependencies:
-      '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       chalk: 4.1.2
       chalk: 4.1.2
-      create-jest: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      create-jest: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       exit: 0.1.2
       exit: 0.1.2
       import-local: 3.1.0
       import-local: 3.1.0
-      jest-config: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      jest-config: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       jest-util: 29.7.0
       jest-util: 29.7.0
       jest-validate: 29.7.0
       jest-validate: 29.7.0
       yargs: 17.7.2
       yargs: 17.7.2
@@ -26096,7 +26096,7 @@ snapshots:
       - supports-color
       - supports-color
       - ts-node
       - ts-node
 
 
-  jest-config@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)):
+  jest-config@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)):
     dependencies:
     dependencies:
       '@babel/core': 7.24.6
       '@babel/core': 7.24.6
       '@jest/test-sequencer': 29.7.0
       '@jest/test-sequencer': 29.7.0
@@ -26121,8 +26121,8 @@ snapshots:
       slash: 3.0.0
       slash: 3.0.0
       strip-json-comments: 3.1.1
       strip-json-comments: 3.1.1
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 22.15.21
-      ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)
+      '@types/node': 20.19.17
+      ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - babel-plugin-macros
       - babel-plugin-macros
       - supports-color
       - supports-color
@@ -26153,7 +26153,7 @@ snapshots:
       '@jest/environment': 29.7.0
       '@jest/environment': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-mock: 29.7.0
       jest-mock: 29.7.0
       jest-util: 29.7.0
       jest-util: 29.7.0
 
 
@@ -26163,7 +26163,7 @@ snapshots:
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       '@types/graceful-fs': 4.1.9
       '@types/graceful-fs': 4.1.9
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       anymatch: 3.1.2
       anymatch: 3.1.2
       fb-watchman: 2.0.2
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
       graceful-fs: 4.2.11
@@ -26204,7 +26204,7 @@ snapshots:
   jest-mock@29.7.0:
   jest-mock@29.7.0:
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-util: 29.7.0
       jest-util: 29.7.0
 
 
   jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
   jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -26239,7 +26239,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       emittery: 0.13.1
       emittery: 0.13.1
       graceful-fs: 4.2.11
       graceful-fs: 4.2.11
@@ -26267,7 +26267,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       cjs-module-lexer: 1.3.1
       cjs-module-lexer: 1.3.1
       collect-v8-coverage: 1.0.2
       collect-v8-coverage: 1.0.2
@@ -26313,7 +26313,7 @@ snapshots:
   jest-util@29.7.0:
   jest-util@29.7.0:
     dependencies:
     dependencies:
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       chalk: 4.1.2
       ci-info: 3.9.0
       ci-info: 3.9.0
       graceful-fs: 4.2.11
       graceful-fs: 4.2.11
@@ -26332,7 +26332,7 @@ snapshots:
     dependencies:
     dependencies:
       '@jest/test-result': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       ansi-escapes: 4.3.2
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       chalk: 4.1.2
       emittery: 0.13.1
       emittery: 0.13.1
@@ -26341,23 +26341,23 @@ snapshots:
 
 
   jest-worker@27.5.1:
   jest-worker@27.5.1:
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       merge-stream: 2.0.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
       supports-color: 8.1.1
 
 
   jest-worker@29.7.0:
   jest-worker@29.7.0:
     dependencies:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-util: 29.7.0
       jest-util: 29.7.0
       merge-stream: 2.0.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
       supports-color: 8.1.1
 
 
-  jest@29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2)):
+  jest@29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2)):
     dependencies:
     dependencies:
-      '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
       '@jest/types': 29.6.3
       '@jest/types': 29.6.3
       import-local: 3.1.0
       import-local: 3.1.0
-      jest-cli: 29.7.0(@types/node@22.15.21)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2))
+      jest-cli: 29.7.0(@types/node@20.19.17)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2))
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@types/node'
       - '@types/node'
       - babel-plugin-macros
       - babel-plugin-macros
@@ -28930,7 +28930,7 @@ snapshots:
       '@protobufjs/path': 1.1.2
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       long: 5.2.3
       long: 5.2.3
 
 
   proxy-addr@2.0.7:
   proxy-addr@2.0.7:
@@ -29127,7 +29127,7 @@ snapshots:
     dependencies:
     dependencies:
       dnd-core: 14.0.1
       dnd-core: 14.0.1
 
 
-  react-dnd@14.0.5(@types/hoist-non-react-statics@3.3.5)(@types/node@22.15.21)(@types/react@18.3.3)(react@18.2.0):
+  react-dnd@14.0.5(@types/hoist-non-react-statics@3.3.5)(@types/node@20.19.17)(@types/react@18.3.3)(react@18.2.0):
     dependencies:
     dependencies:
       '@react-dnd/invariant': 2.0.0
       '@react-dnd/invariant': 2.0.0
       '@react-dnd/shallowequal': 2.0.0
       '@react-dnd/shallowequal': 2.0.0
@@ -29137,7 +29137,7 @@ snapshots:
       react: 18.2.0
       react: 18.2.0
     optionalDependencies:
     optionalDependencies:
       '@types/hoist-non-react-statics': 3.3.5
       '@types/hoist-non-react-statics': 3.3.5
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/react': 18.3.3
       '@types/react': 18.3.3
 
 
   react-dom@18.2.0(react@18.2.0):
   react-dom@18.2.0(react@18.2.0):
@@ -31067,14 +31067,14 @@ snapshots:
 
 
   ts-interface-checker@0.1.13: {}
   ts-interface-checker@0.1.13: {}
 
 
-  ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.14.0)(typescript@5.0.4):
+  ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.19.17)(typescript@5.0.4):
     dependencies:
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.3
       '@tsconfig/node16': 1.0.3
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       acorn: 8.15.0
       acorn: 8.15.0
       acorn-walk: 8.3.2
       acorn-walk: 8.3.2
       arg: 4.1.3
       arg: 4.1.3
@@ -31087,14 +31087,14 @@ snapshots:
     optionalDependencies:
     optionalDependencies:
       '@swc/core': 1.10.7(@swc/helpers@0.5.15)
       '@swc/core': 1.10.7(@swc/helpers@0.5.15)
 
 
-  ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@22.15.21)(typescript@5.4.2):
+  ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.17))(@types/node@20.19.17)(typescript@5.4.2):
     dependencies:
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.3
       '@tsconfig/node16': 1.0.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       acorn: 8.15.0
       acorn: 8.15.0
       acorn-walk: 8.3.2
       acorn-walk: 8.3.2
       arg: 4.1.3
       arg: 4.1.3
@@ -31695,12 +31695,12 @@ snapshots:
       '@types/unist': 3.0.3
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
       vfile-message: 4.0.2
 
 
-  vite-node@2.1.1(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0):
+  vite-node@2.1.1(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0):
     dependencies:
     dependencies:
       cac: 6.7.14
       cac: 6.7.14
       debug: 4.4.1(supports-color@5.5.0)
       debug: 4.4.1(supports-color@5.5.0)
       pathe: 1.1.2
       pathe: 1.1.2
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@types/node'
       - '@types/node'
       - less
       - less
@@ -31712,9 +31712,9 @@ snapshots:
       - supports-color
       - supports-color
       - terser
       - terser
 
 
-  vite-plugin-dts@3.9.1(@types/node@20.14.0)(rollup@4.50.1)(typescript@5.0.4)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)):
+  vite-plugin-dts@3.9.1(@types/node@20.19.17)(rollup@4.50.1)(typescript@5.0.4)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)):
     dependencies:
     dependencies:
-      '@microsoft/api-extractor': 7.43.0(@types/node@20.14.0)
+      '@microsoft/api-extractor': 7.43.0(@types/node@20.19.17)
       '@rollup/pluginutils': 5.1.4(rollup@4.50.1)
       '@rollup/pluginutils': 5.1.4(rollup@4.50.1)
       '@vue/language-core': 1.8.27(typescript@5.0.4)
       '@vue/language-core': 1.8.27(typescript@5.0.4)
       debug: 4.4.1(supports-color@5.5.0)
       debug: 4.4.1(supports-color@5.5.0)
@@ -31723,30 +31723,30 @@ snapshots:
       typescript: 5.0.4
       typescript: 5.0.4
       vue-tsc: 1.8.27(typescript@5.0.4)
       vue-tsc: 1.8.27(typescript@5.0.4)
     optionalDependencies:
     optionalDependencies:
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - '@types/node'
       - '@types/node'
       - rollup
       - rollup
       - supports-color
       - supports-color
 
 
-  vite-tsconfig-paths@5.0.1(typescript@5.0.4)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)):
+  vite-tsconfig-paths@5.0.1(typescript@5.0.4)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)):
     dependencies:
     dependencies:
       debug: 4.4.1(supports-color@5.5.0)
       debug: 4.4.1(supports-color@5.5.0)
       globrex: 0.1.2
       globrex: 0.1.2
       tsconfck: 3.0.3(typescript@5.0.4)
       tsconfck: 3.0.3(typescript@5.0.4)
     optionalDependencies:
     optionalDependencies:
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - supports-color
       - typescript
       - typescript
 
 
-  vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0):
+  vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0):
     dependencies:
     dependencies:
       esbuild: 0.21.5
       esbuild: 0.21.5
       postcss: 8.5.6
       postcss: 8.5.6
       rollup: 4.50.1
       rollup: 4.50.1
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       fsevents: 2.3.3
       fsevents: 2.3.3
       sass: 1.77.6
       sass: 1.77.6
       terser: 5.44.0
       terser: 5.44.0
@@ -31755,12 +31755,12 @@ snapshots:
     dependencies:
     dependencies:
       ts-essentials: 10.0.2(typescript@5.0.4)
       ts-essentials: 10.0.2(typescript@5.0.4)
       typescript: 5.0.4
       typescript: 5.0.4
-      vitest: 2.1.1(@types/node@20.14.0)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
+      vitest: 2.1.1(@types/node@20.19.17)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0)
 
 
-  vitest@2.1.1(@types/node@20.14.0)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0):
+  vitest@2.1.1(@types/node@20.19.17)(@vitest/ui@2.1.1)(happy-dom@15.7.4)(sass@1.77.6)(terser@5.44.0):
     dependencies:
     dependencies:
       '@vitest/expect': 2.1.1
       '@vitest/expect': 2.1.1
-      '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0))
+      '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0))
       '@vitest/pretty-format': 2.1.1
       '@vitest/pretty-format': 2.1.1
       '@vitest/runner': 2.1.1
       '@vitest/runner': 2.1.1
       '@vitest/snapshot': 2.1.1
       '@vitest/snapshot': 2.1.1
@@ -31775,11 +31775,11 @@ snapshots:
       tinyexec: 0.3.0
       tinyexec: 0.3.0
       tinypool: 1.0.1
       tinypool: 1.0.1
       tinyrainbow: 1.2.0
       tinyrainbow: 1.2.0
-      vite: 5.4.20(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
-      vite-node: 2.1.1(@types/node@20.14.0)(sass@1.77.6)(terser@5.44.0)
+      vite: 5.4.20(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
+      vite-node: 2.1.1(@types/node@20.19.17)(sass@1.77.6)(terser@5.44.0)
       why-is-node-running: 2.3.0
       why-is-node-running: 2.3.0
     optionalDependencies:
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       '@vitest/ui': 2.1.1(vitest@2.1.1)
       '@vitest/ui': 2.1.1(vitest@2.1.1)
       happy-dom: 15.7.4
       happy-dom: 15.7.4
     transitivePeerDependencies:
     transitivePeerDependencies: