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

Merge branch 'master' into support/investigate-memory-leak-by-yuki

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

+ 1 - 1
.github/mergify.yml

@@ -13,7 +13,7 @@ queue_rules:
       - check-success ~= ci-app-test
       - check-success ~= ci-app-launch-dev
       - check-success = test-prod-node20 / build-prod
-      - check-success = test-prod-node20 / launch-prod
+      - check-success ~= test-prod-node20 / launch-prod
       - check-success ~= test-prod-node20 / run-playwright
       - -check-failure ~= ci-app-
       - -check-failure ~= ci-slackbot-

+ 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';
 

+ 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 { writeFileSync } from 'fs';
 
 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 { tmpdir } from 'os';
-import path from 'path';
 import { describe, expect, it } from 'vitest';
 
 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]
  */
 
-import { get } from 'http';
+import { get } from 'node:http';
 
 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 { URL } = require('url');
+const { URL } = require('node:url');
 
 const { getMongoUri, mongoOptions } = isProduction
   ? // 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';
 
+// biome-ignore lint/style/useNodejsImportProtocol: ignore
 const path = require('path');
 
 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
  */
 
-const path = require('path');
+const path = require('node:path');
 
 const { withSuperjson } = require('next-superjson');
 const {
@@ -93,7 +93,7 @@ const optimizePackageImports = [
   '@growi/ui',
 ];
 
-module.exports = async (phase, { defaultConfig }) => {
+module.exports = async (phase) => {
   const { i18n, localePath } = require('./config/next-i18next.config');
 
   /** @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();

+ 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.body.password,
         );
-      } catch (e) {
+      } catch (_e) {
         return res.apiv3Err(
           new ErrorV3(
             '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');
 

+ 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';
 

+ 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 {
   getUsernameByPath,
   isCreatablePage,
@@ -7,8 +9,6 @@ import {
   isUsersTopPage,
 } from '@growi/core/dist/utils/page-path-utils';
 import { diag } from '@opentelemetry/api';
-import { createHash } from 'crypto';
-import type { IncomingMessage } from 'http';
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -132,7 +132,10 @@ export const pageAccessModule: AnonymizationModule = {
   /**
    * 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 {
       const parsedUrl = new URL(url, 'http://localhost');
       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';
 

+ 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 type { IncomingMessage } from 'http';
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -28,7 +28,10 @@ export const pageApiModule: AnonymizationModule = {
   /**
    * 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> = {};
     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';
 

+ 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 type { IncomingMessage } from 'http';
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 import type { AnonymizationModule } from '../interfaces/anonymization-module';
@@ -28,7 +28,10 @@ export const pageListingApiModule: AnonymizationModule = {
   /**
    * 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> = {};
     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';
 

+ 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 type { IncomingMessage } from 'http';
 
 import { ATTR_HTTP_TARGET } from '../../semconv';
 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

+ 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 crypto from 'crypto';
 import { mock } from 'vitest-mock-extended';
 
 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 crypto from 'crypto';
 
 import { configManager } from '~/server/service/config-manager';
 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
             : message;
       }
-    } catch (e) {
+    } catch (_e) {
       // do nothing if the message is not a JSON string
     }
 
@@ -35,7 +35,7 @@ class DiagLoggerBunyanAdapter implements DiagLogger {
           try {
             const parsed = JSON.parse(arg);
             return { ...acc, ...parsed };
-          } catch (e) {
+          } catch (_e) {
             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
  */
 export const generateAdditionalResourceAttributes = async (
-  opts?: Option,
+  _opts?: Option,
 ): Promise<Resource> => {
   if (resource == null) {
     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
   try {
     getResource(sdk);
-  } catch (e) {
+  } catch (_e) {
     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,
         });
         toastSuccess(t('page_export.bulk_export_started'));
-      } catch (e) {
+      } catch (_e) {
         toastError(t('page_export.failed_to_export'));
       }
       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 { getIdForRef, isPopulated } from '@growi/core';
-import fs from 'fs';
 import mongoose from 'mongoose';
-import path from 'path';
-import type { Readable } from 'stream';
 
 import type { SupportedActionType } 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 { getIdForRef, getIdStringForRef } from '@growi/core';
-import { createHash } from 'crypto';
 import mongoose from 'mongoose';
-import { pipeline, Writable } from 'stream';
 
 import { PageBulkExportJobStatus } from '~/features/page-bulk-export/interfaces/page-bulk-export';
 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 { isPopulated } from '@growi/core';
 import {
   getParentPath,
   normalizePath,
 } from '@growi/core/dist/utils/path-utils';
-import fs from 'fs';
 import type { Root } from 'mdast';
-import path from 'path';
 import type * as RemarkHtml from 'remark-html';
 import type * as RemarkParse from 'remark-parse';
-import { pipeline, Writable } from 'stream';
 import type * as Unified from 'unified';
 
 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 { SCOPE } from '@growi/core/dist/interfaces';
 import type { TemplateSummary } from '@growi/pluginkit/dist/v4';
@@ -7,15 +8,14 @@ import {
 } from '@growi/pluginkit/dist/v4/server/index.cjs';
 import express from 'express';
 import { param, query } from 'express-validator';
-import path from 'path';
 import { PLUGIN_STORING_PATH } from '~/features/growi-plugin/server/consts';
 import { GrowiPlugin } from '~/features/growi-plugin/server/models';
 import type Crowi from '~/server/crowi';
 import { accessTokenParser } from '~/server/middlewares/access-token-parser';
 import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
 import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 import loggerFactory from '~/utils/logger';
-import { resolveFromRoot } from '~/utils/project-dir-utils';
 
 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 { Writable } from 'stream';
-import { pipeline } from 'stream/promises';
 
 import getPageModel from '~/server/models/page';
 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 { 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 { resolveFromRoot } from '~/utils/project-dir-utils';
 
 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';
 import instanciatePageBulkExportJobCronService from '~/features/page-bulk-export/server/service/page-bulk-export-job-cron';
 import { startCron as startAccessTokenCron } from '~/server/service/access-token';
+import { projectRoot } from '~/server/util/project-dir-utils';
 import { getGrowiVersion } from '~/utils/growi-version';
 import loggerFactory from '~/utils/logger';
-import { projectRoot } from '~/utils/project-dir-utils';
 
 import UserEvent from '../events/user';
 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 mongoose from 'mongoose';
 
+import { projectRoot } from '~/server/util/project-dir-utils';
 import loggerFactory from '~/utils/logger';
-import { projectRoot } from '~/utils/project-dir-utils';
 
 import type Crowi from '../crowi';
 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 { resolveFromRoot } from '~/utils/project-dir-utils';
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 
 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 fs from 'fs';
-import path from 'path';
-import process from 'process';
 
 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 { AcceptedUploadFileType } from '@growi/core';
 import { useSWRStatic } from '@growi/core/dist/swr';
-import type EventEmitter from 'events';
 import type { SWRResponse } from 'swr';
 import useSWR from 'swr';
 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';
+// biome-ignore lint/style/useNodejsImportProtocol: ignore
 import assert from 'assert';
 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
 
-const fs = require('fs');
-const path = require('path');
+const fs = require('node:fs');
+const path = require('node:path');
 
 const nodeModulesPaths = [
   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';
 
 describe('PageRedirect', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   let PageRedirect;
 

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

@@ -9,7 +9,7 @@ let testGroup0;
 let parentPage;
 
 describe('Page', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   let Page;
   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');
 
 describe('User', () => {
-  // eslint-disable-next-line no-unused-vars
+  // biome-ignore lint/correctness/noUnusedVariables: ignore
   let crowi;
   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 { setupModelsDependentOnCrowi } from '../../src/server/crowi/setup-models';

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

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

+ 7 - 2
biome.json

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

+ 1 - 1
package.json

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

+ 126 - 126
pnpm-lock.yaml

@@ -47,8 +47,8 @@ importers:
         specifier: ^1.0.1
         version: 1.0.8
       '@types/node':
-        specifier: ^20.14.0
-        version: 20.14.0
+        specifier: ^20.18.3
+        version: 20.19.17
       '@types/path-browserify':
         specifier: ^1.0.0
         version: 1.0.0
@@ -60,7 +60,7 @@ importers:
         version: 5.59.7(eslint@8.41.0)(typescript@5.0.4)
       '@vitejs/plugin-react':
         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':
         specifier: ^2.1.1
         version: 2.1.1(vitest@2.1.1)
@@ -156,7 +156,7 @@ importers:
         version: 6.2.0
       ts-node:
         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:
         specifier: ^3.2.0
         version: 3.2.0
@@ -177,16 +177,16 @@ importers:
         version: 3.4.7(typescript@5.0.4)
       vite:
         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:
         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:
         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:
         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:
         specifier: ^2.0.2
         version: 2.0.2(typescript@5.0.4)(vitest@2.1.1)
@@ -901,7 +901,7 @@ importers:
         version: 3.1.0
       eslint-plugin-jest:
         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:
         specifier: ^1.0.16
         version: 1.0.16
@@ -928,7 +928,7 @@ importers:
         version: 4.2.0
       jest:
         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:
         specifier: ^1.0.8
         version: 1.0.10
@@ -967,7 +967,7 @@ importers:
         version: 5.1.0(react@18.2.0)
       react-dnd:
         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:
         specifier: ^14.1.0
         version: 14.1.0
@@ -1099,8 +1099,8 @@ importers:
         specifier: ^1.4.12
         version: 1.4.12
       '@types/node':
-        specifier: ^22.5.4
-        version: 22.15.21
+        specifier: ^20.18.3
+        version: 20.19.17
       '@types/supertest':
         specifier: ^6.0.3
         version: 6.0.3
@@ -5691,8 +5691,8 @@ packages:
   '@types/node@18.19.46':
     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':
     resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==}
@@ -17436,27 +17436,27 @@ snapshots:
   '@jest/console@29.7.0':
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       jest-message-util: 29.7.0
       jest-util: 29.7.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:
       '@jest/console': 29.7.0
       '@jest/reporters': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       ci-info: 3.9.0
       exit: 0.1.2
       graceful-fs: 4.2.11
       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-message-util: 29.7.0
       jest-regex-util: 29.6.3
@@ -17485,7 +17485,7 @@ snapshots:
     dependencies:
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-mock: 29.7.0
 
   '@jest/expect-utils@29.7.0':
@@ -17503,7 +17503,7 @@ snapshots:
     dependencies:
       '@jest/types': 29.6.3
       '@sinonjs/fake-timers': 10.3.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-message-util: 29.7.0
       jest-mock: 29.7.0
       jest-util: 29.7.0
@@ -17525,7 +17525,7 @@ snapshots:
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jridgewell/trace-mapping': 0.3.29
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
       exit: 0.1.2
@@ -17595,7 +17595,7 @@ snapshots:
       '@jest/schemas': 29.6.3
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-reports': 3.0.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/yargs': 17.0.32
       chalk: 4.1.2
 
@@ -17895,23 +17895,23 @@ snapshots:
     dependencies:
       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:
       '@microsoft/tsdoc': 0.14.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:
       - '@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:
-      '@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-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/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
       minimatch: 3.0.8
       resolve: 1.22.8
@@ -19185,7 +19185,7 @@ snapshots:
 
   '@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:
       fs-extra: 7.0.1
       import-lazy: 4.0.0
@@ -19194,23 +19194,23 @@ snapshots:
       semver: 7.5.4
       z-schema: 5.0.6
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
 
   '@rushstack/rig-package@0.5.2':
     dependencies:
       resolve: 1.22.8
       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:
-      '@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
     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:
-      '@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
       argparse: 1.0.10
       string-argv: 0.3.2
@@ -19231,18 +19231,18 @@ snapshots:
 
   '@slack/logger@3.0.0':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@slack/logger@4.0.0':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@slack/oauth@3.0.3':
     dependencies:
       '@slack/logger': 4.0.0
       '@slack/web-api': 7.9.1
       '@types/jsonwebtoken': 9.0.9
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jsonwebtoken: 9.0.2
       lodash.isstring: 4.0.1
     transitivePeerDependencies:
@@ -19272,7 +19272,7 @@ snapshots:
     dependencies:
       '@slack/logger': 4.0.0
       '@slack/types': 2.14.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/retry': 0.12.0
       axios: 1.9.0
       eventemitter3: 5.0.1
@@ -20754,7 +20754,7 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/bunyan@1.8.11':
     dependencies:
@@ -20764,11 +20764,11 @@ snapshots:
 
   '@types/cli-progress@3.9.2':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/cli-spinner@0.2.1':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/color-name@1.1.1': {}
 
@@ -20778,7 +20778,7 @@ snapshots:
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/cookie@0.4.1': {}
 
@@ -20786,7 +20786,7 @@ snapshots:
 
   '@types/cors@2.8.17':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/css-modules@1.0.2': {}
 
@@ -20913,7 +20913,7 @@ snapshots:
 
   '@types/es-aggregate-error@1.0.6':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/eslint-scope@3.7.7':
     dependencies:
@@ -20933,7 +20933,7 @@ snapshots:
 
   '@types/express-serve-static-core@4.19.5':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/qs': 6.9.18
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -20948,18 +20948,18 @@ snapshots:
   '@types/fs-extra@11.0.4':
     dependencies:
       '@types/jsonfile': 6.1.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/geojson@7946.0.16': {}
 
   '@types/glob@7.2.0':
     dependencies:
       '@types/minimatch': 3.0.5
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/graceful-fs@4.1.9':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/hast@2.3.4':
     dependencies:
@@ -20983,7 +20983,7 @@ snapshots:
 
   '@types/is-stream@1.1.0':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/istanbul-lib-coverage@2.0.6': {}
 
@@ -21008,12 +21008,12 @@ snapshots:
 
   '@types/jsonfile@6.1.4':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/jsonwebtoken@9.0.9':
     dependencies:
       '@types/ms': 0.7.31
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/katex@0.16.7': {}
 
@@ -21029,7 +21029,7 @@ snapshots:
 
   '@types/memcached@2.2.10':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/methods@1.1.4': {}
 
@@ -21043,7 +21043,7 @@ snapshots:
 
   '@types/mkdirp@1.0.2':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/ms@0.7.31': {}
 
@@ -21053,13 +21053,13 @@ snapshots:
 
   '@types/mysql@2.15.26':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/node-cron@3.0.11': {}
 
   '@types/node-fetch@2.6.11':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       form-data: 4.0.4
 
   '@types/node@12.20.55': {}
@@ -21070,9 +21070,9 @@ snapshots:
     dependencies:
       undici-types: 5.26.5
 
-  '@types/node@20.14.0':
+  '@types/node@20.19.17':
     dependencies:
-      undici-types: 5.26.5
+      undici-types: 6.21.0
 
   '@types/node@22.15.21':
     dependencies:
@@ -21082,7 +21082,7 @@ snapshots:
 
   '@types/oracledb@6.5.2':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/path-browserify@1.0.0': {}
 
@@ -21092,17 +21092,17 @@ snapshots:
 
   '@types/pg@8.15.1':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       pg-protocol: 1.7.0
       pg-types: 4.0.2
 
   '@types/pixelmatch@5.2.4':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/pngjs@6.0.1':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/prop-types@15.7.12': {}
 
@@ -21133,7 +21133,7 @@ snapshots:
 
   '@types/readdir-glob@1.1.5':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/retry@0.12.0': {}
 
@@ -21144,12 +21144,12 @@ snapshots:
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.2
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/send': 0.17.4
 
   '@types/stack-utils@2.0.3': {}
@@ -21158,7 +21158,7 @@ snapshots:
     dependencies:
       '@types/cookiejar': 2.1.5
       '@types/methods': 1.1.4
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       form-data: 4.0.4
 
   '@types/supertest@6.0.3':
@@ -21168,7 +21168,7 @@ snapshots:
 
   '@types/tedious@4.0.14':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/testing-library__dom@7.5.0':
     dependencies:
@@ -21178,7 +21178,7 @@ snapshots:
 
   '@types/through@0.0.33':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
 
   '@types/trusted-types@2.0.7':
     optional: true
@@ -21207,7 +21207,7 @@ snapshots:
 
   '@types/whatwg-url@8.2.1':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/webidl-conversions': 6.1.1
 
   '@types/ws@8.18.1':
@@ -21222,7 +21222,7 @@ snapshots:
 
   '@types/yauzl@2.10.3':
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
     optional: true
 
   '@types/zen-observable@0.8.3': {}
@@ -21439,14 +21439,14 @@ snapshots:
 
   '@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:
       '@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)
       '@types/babel__core': 7.20.5
       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:
       - supports-color
 
@@ -21464,7 +21464,7 @@ snapshots:
       std-env: 3.7.0
       test-exclude: 7.0.1
       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:
       - supports-color
 
@@ -21475,13 +21475,13 @@ snapshots:
       chai: 5.1.1
       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:
       '@vitest/spy': 2.1.1
       estree-walker: 3.0.3
       magic-string: 0.30.11
     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':
     dependencies:
@@ -21511,7 +21511,7 @@ snapshots:
       sirv: 2.0.4
       tinyglobby: 0.2.6
       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':
     dependencies:
@@ -21844,7 +21844,7 @@ snapshots:
       '@swc/helpers': 0.5.17
       '@types/command-line-args': 5.2.3
       '@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-usage: 7.0.3
       flatbuffers: 24.12.23
@@ -23143,13 +23143,13 @@ snapshots:
       isobject: 3.0.1
       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:
       '@jest/types': 29.6.3
       chalk: 4.1.2
       exit: 0.1.2
       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
       prompts: 2.4.2
     transitivePeerDependencies:
@@ -23864,7 +23864,7 @@ snapshots:
     dependencies:
       '@types/cookie': 0.4.1
       '@types/cors': 2.8.17
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       accepts: 1.3.8
       base64id: 2.0.0
       cookie: 0.7.2
@@ -24252,13 +24252,13 @@ snapshots:
       - typescript
     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:
       '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.4.2)
       eslint: 8.41.0
     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)
-      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:
       - supports-color
       - typescript
@@ -26066,7 +26066,7 @@ snapshots:
       '@jest/expect': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       co: 4.6.0
       dedent: 1.5.3
@@ -26086,16 +26086,16 @@ snapshots:
       - babel-plugin-macros
       - 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:
-      '@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/types': 29.6.3
       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
       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-validate: 29.7.0
       yargs: 17.7.2
@@ -26105,7 +26105,7 @@ snapshots:
       - supports-color
       - 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:
       '@babel/core': 7.24.6
       '@jest/test-sequencer': 29.7.0
@@ -26130,8 +26130,8 @@ snapshots:
       slash: 3.0.0
       strip-json-comments: 3.1.1
     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:
       - babel-plugin-macros
       - supports-color
@@ -26162,7 +26162,7 @@ snapshots:
       '@jest/environment': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-mock: 29.7.0
       jest-util: 29.7.0
 
@@ -26172,7 +26172,7 @@ snapshots:
     dependencies:
       '@jest/types': 29.6.3
       '@types/graceful-fs': 4.1.9
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       anymatch: 3.1.2
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
@@ -26213,7 +26213,7 @@ snapshots:
   jest-mock@29.7.0:
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-util: 29.7.0
 
   jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -26248,7 +26248,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       emittery: 0.13.1
       graceful-fs: 4.2.11
@@ -26276,7 +26276,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       cjs-module-lexer: 1.3.1
       collect-v8-coverage: 1.0.2
@@ -26322,7 +26322,7 @@ snapshots:
   jest-util@29.7.0:
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       chalk: 4.1.2
       ci-info: 3.9.0
       graceful-fs: 4.2.11
@@ -26341,7 +26341,7 @@ snapshots:
     dependencies:
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       emittery: 0.13.1
@@ -26350,23 +26350,23 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
   jest-worker@29.7.0:
     dependencies:
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       jest-util: 29.7.0
       merge-stream: 2.0.0
       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:
-      '@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
       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:
       - '@types/node'
       - babel-plugin-macros
@@ -28936,7 +28936,7 @@ snapshots:
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       long: 5.2.3
 
   proxy-addr@2.0.7:
@@ -29133,7 +29133,7 @@ snapshots:
     dependencies:
       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:
       '@react-dnd/invariant': 2.0.0
       '@react-dnd/shallowequal': 2.0.0
@@ -29143,7 +29143,7 @@ snapshots:
       react: 18.2.0
     optionalDependencies:
       '@types/hoist-non-react-statics': 3.3.5
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       '@types/react': 18.3.3
 
   react-dom@18.2.0(react@18.2.0):
@@ -31073,14 +31073,14 @@ snapshots:
 
   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:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.3
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       acorn: 8.15.0
       acorn-walk: 8.3.2
       arg: 4.1.3
@@ -31093,14 +31093,14 @@ snapshots:
     optionalDependencies:
       '@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:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.9
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.3
-      '@types/node': 22.15.21
+      '@types/node': 20.19.17
       acorn: 8.15.0
       acorn-walk: 8.3.2
       arg: 4.1.3
@@ -31701,12 +31701,12 @@ snapshots:
       '@types/unist': 3.0.3
       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:
       cac: 6.7.14
       debug: 4.4.1(supports-color@5.5.0)
       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:
       - '@types/node'
       - less
@@ -31718,9 +31718,9 @@ snapshots:
       - supports-color
       - 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:
-      '@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)
       '@vue/language-core': 1.8.27(typescript@5.0.4)
       debug: 4.4.1(supports-color@5.5.0)
@@ -31729,30 +31729,30 @@ snapshots:
       typescript: 5.0.4
       vue-tsc: 1.8.27(typescript@5.0.4)
     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:
       - '@types/node'
       - rollup
       - 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:
       debug: 4.4.1(supports-color@5.5.0)
       globrex: 0.1.2
       tsconfck: 3.0.3(typescript@5.0.4)
     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:
       - supports-color
       - 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:
       esbuild: 0.21.5
       postcss: 8.5.6
       rollup: 4.50.1
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       fsevents: 2.3.3
       sass: 1.77.6
       terser: 5.44.0
@@ -31761,12 +31761,12 @@ snapshots:
     dependencies:
       ts-essentials: 10.0.2(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:
       '@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/runner': 2.1.1
       '@vitest/snapshot': 2.1.1
@@ -31781,11 +31781,11 @@ snapshots:
       tinyexec: 0.3.0
       tinypool: 1.0.1
       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
     optionalDependencies:
-      '@types/node': 20.14.0
+      '@types/node': 20.19.17
       '@vitest/ui': 2.1.1(vitest@2.1.1)
       happy-dom: 15.7.4
     transitivePeerDependencies: