Browse Source

clean code

Yuki Takei 2 years ago
parent
commit
592924a0b1
40 changed files with 45 additions and 126 deletions
  1. 10 0
      apps/app/.eslintrc.js
  2. 0 2
      apps/app/src/components/Admin/Common/AdminInstallButtonRow.tsx
  3. 1 1
      apps/app/src/components/Admin/G2GDataTransfer.tsx
  4. 1 1
      apps/app/src/components/Admin/LegacySlackIntegration/LegacySlackIntegration.jsx
  5. 0 2
      apps/app/src/components/Admin/Security/SecurityManagement.tsx
  6. 0 1
      apps/app/src/components/Admin/SlackIntegration/CustomBotWithoutProxySecretTokenSection.jsx
  7. 0 2
      apps/app/src/components/Admin/Users/UserInviteModal.jsx
  8. 1 1
      apps/app/src/components/Bookmarks/BookmarkFolderNameInput.tsx
  9. 0 1
      apps/app/src/components/CompleteUserRegistration.tsx
  10. 1 1
      apps/app/src/components/CompleteUserRegistrationForm.tsx
  11. 1 5
      apps/app/src/components/DescendantsPageList.tsx
  12. 3 2
      apps/app/src/components/Hotkeys/Subscribers/EditPage.jsx
  13. 1 1
      apps/app/src/components/Hotkeys/Subscribers/FocusToGlobalSearch.jsx
  14. 0 1
      apps/app/src/components/Hotkeys/Subscribers/ShowStaffCredit.jsx
  15. 1 1
      apps/app/src/components/StaffCredit/StaffCredit.tsx
  16. 1 1
      apps/app/src/components/TableOfContents.tsx
  17. 3 5
      apps/app/src/server/models/attachment.js
  18. 1 0
      apps/app/src/server/models/named-query.ts
  19. 0 1
      apps/app/src/server/models/page-operation.ts
  20. 0 65
      apps/app/src/server/routes/admin.js
  21. 1 1
      apps/app/src/server/routes/apiv3/bookmarks.js
  22. 1 0
      apps/app/src/server/routes/apiv3/installer.ts
  23. 1 1
      apps/app/src/server/routes/apiv3/page.js
  24. 2 4
      apps/app/src/server/routes/apiv3/slack-integration-legacy-settings.js
  25. 1 2
      apps/app/src/server/routes/apiv3/slack-integration-settings.js
  26. 1 1
      apps/app/src/server/routes/apiv3/slack-integration.js
  27. 1 1
      apps/app/src/server/routes/apiv3/user-activation.ts
  28. 0 3
      apps/app/src/server/routes/apiv3/user-group.js
  29. 0 1
      apps/app/src/server/routes/index.js
  30. 0 1
      apps/app/src/server/routes/me.js
  31. 0 1
      apps/app/src/server/routes/page.js
  32. 0 1
      apps/app/src/server/service/customize.ts
  33. 1 1
      apps/app/src/server/service/search.ts
  34. 2 0
      apps/app/src/server/service/slack-command-handler/create-page-service.js
  35. 0 2
      apps/app/src/server/service/slack-command-handler/search.js
  36. 1 1
      apps/app/src/server/service/slack-command-handler/togetter.js
  37. 0 1
      apps/app/src/server/service/user-notification/index.ts
  38. 2 1
      apps/app/src/services/renderer/renderer.tsx
  39. 6 8
      apps/app/src/stores/in-app-notification.ts
  40. 0 1
      apps/app/test/integration/models/page-redirect.test.js

+ 10 - 0
apps/app/.eslintrc.js

@@ -33,12 +33,22 @@ module.exports = {
     '@typescript-eslint/no-this-alias': ['warn'],
   },
   overrides: [
+    {
+      // enable the rule specifically for JavaScript files
+      files: ['*.js', '*.jsx'],
+      rules: {
+        // 'no-unused-vars': ['error'],
+        // set 'warn' temporarily -- 2022.07.25 Yuki Takei
+        'no-unused-vars': ['warn'],
+      },
+    },
     {
       // enable the rule specifically for TypeScript files
       files: ['*.ts', '*.tsx'],
       rules: {
         // '@typescript-eslint/explicit-module-boundary-types': ['error'],
         // set 'warn' temporarily -- 2022.07.25 Yuki Takei
+        'no-unused-vars': 'off',
         '@typescript-eslint/explicit-module-boundary-types': ['warn'],
       },
     },

+ 0 - 2
apps/app/src/components/Admin/Common/AdminInstallButtonRow.tsx

@@ -7,8 +7,6 @@ type Props = {
 }
 
 export const AdminInstallButtonRow = (props: Props): JSX.Element => {
-  // TODO: const { t } = useTranslation('admin');
-
   return (
     <div className="row my-3">
       <div className="mx-auto">

+ 1 - 1
apps/app/src/components/Admin/G2GDataTransfer.tsx

@@ -1,5 +1,5 @@
 import React, {
-  ChangeEvent, useCallback, useEffect, useState,
+  useCallback, useEffect, useState,
 } from 'react';
 
 import { useTranslation } from 'next-i18next';

+ 1 - 1
apps/app/src/components/Admin/LegacySlackIntegration/LegacySlackIntegration.jsx

@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useState } from 'react';
+import React, { useEffect } from 'react';
 
 import { useTranslation } from 'next-i18next';
 import PropTypes from 'prop-types';

+ 0 - 2
apps/app/src/components/Admin/Security/SecurityManagement.tsx

@@ -1,7 +1,5 @@
 import React, { useEffect, useCallback } from 'react';
 
-import PropTypes from 'prop-types';
-
 import AdminGeneralSecurityContainer from '~/client/services/AdminGeneralSecurityContainer';
 import { toastError } from '~/client/util/toastr';
 import { toArrayIfNot } from '~/utils/array-utils';

+ 0 - 1
apps/app/src/components/Admin/SlackIntegration/CustomBotWithoutProxySecretTokenSection.jsx

@@ -6,7 +6,6 @@ import PropTypes from 'prop-types';
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { toastSuccess, toastError } from '~/client/util/toastr';
 
-import { withUnstatedContainers } from '../../UnstatedUtils';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 
 

+ 0 - 2
apps/app/src/components/Admin/Users/UserInviteModal.jsx

@@ -208,8 +208,6 @@ class UserInviteModal extends React.Component {
 
   async handleSubmit() {
     const { adminUsersContainer } = this.props;
-    // eslint-disable-next-line no-unused-vars
-    const { isCreateUserButtonPushed } = this.state;
 
     this.setState({ isCreateUserButtonPushed: true });
 

+ 1 - 1
apps/app/src/components/Bookmarks/BookmarkFolderNameInput.tsx

@@ -1,6 +1,6 @@
 import { useTranslation } from 'next-i18next';
 
-import { inputValidator, ValidationTarget } from '~/client/util/input-validator';
+import { ValidationTarget } from '~/client/util/input-validator';
 import ClosableTextInput from '~/components/Common/ClosableTextInput';
 
 

+ 0 - 1
apps/app/src/components/CompleteUserRegistration.tsx

@@ -1,7 +1,6 @@
 import React, { FC } from 'react';
 
 import { useTranslation } from 'next-i18next';
-import Link from 'next/link';
 
 export const CompleteUserRegistration: FC = () => {
   const { t } = useTranslation();

+ 1 - 1
apps/app/src/components/CompleteUserRegistrationForm.tsx

@@ -170,7 +170,7 @@ const CompleteUserRegistrationForm: React.FC<Props> = (props: Props) => {
               </div>
 
               <div className="input-group justify-content-center d-flex mt-5">
-                <button disabled={forceDisableForm || disableForm} className="btn btn-fill" id="register">
+                <button type="button" disabled={forceDisableForm || disableForm} className="btn btn-fill" id="register">
                   <div className="eff"></div>
                   <span className="btn-label"><i className="icon-user-follow"></i></span>
                   <span className="btn-label-text">{t('Create')}</span>

+ 1 - 5
apps/app/src/components/DescendantsPageList.tsx

@@ -82,10 +82,6 @@ const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element => {
     }
   }, [onPagePutBacked, t]);
 
-  function setPageNumber(selectedPageNumber) {
-    setActivePage(selectedPageNumber);
-  }
-
   if (pagingResult == null) {
     return (
       <div className="wiki">
@@ -113,7 +109,7 @@ const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element => {
         <div className="my-4">
           <PaginationWrapper
             activePage={activePage}
-            changePage={setPageNumber}
+            changePage={selectedPageNumber => setActivePage(selectedPageNumber)}
             totalItemsCount={pagingResult.totalCount}
             pagingLimit={pagingResult.limit}
             align="center"

+ 3 - 2
apps/app/src/components/Hotkeys/Subscribers/EditPage.jsx

@@ -1,8 +1,9 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
+
 import PropTypes from 'prop-types';
 
-import { EditorMode, useEditorMode } from '~/stores/ui';
 import { useIsEditable } from '~/stores/context';
+import { EditorMode, useEditorMode } from '~/stores/ui';
 
 const EditPage = (props) => {
   const { data: isEditable } = useIsEditable();

+ 1 - 1
apps/app/src/components/Hotkeys/Subscribers/FocusToGlobalSearch.jsx

@@ -1,4 +1,4 @@
-import { FC, useEffect } from 'react';
+import { useEffect } from 'react';
 
 import { useIsEditable } from '~/stores/context';
 import { useGlobalSearchFormRef } from '~/stores/ui';

+ 0 - 1
apps/app/src/components/Hotkeys/Subscribers/ShowStaffCredit.jsx

@@ -1,4 +1,3 @@
-import React from 'react';
 import PropTypes from 'prop-types';
 
 import StaffCredit from '../../StaffCredit/StaffCredit';

+ 1 - 1
apps/app/src/components/StaffCredit/StaffCredit.tsx

@@ -13,7 +13,7 @@ import loggerFactory from '~/utils/logger';
 import styles from './StaffCredit.module.scss';
 
 
-// eslint-disable-next-line no-unused-vars
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:cli:StaffCredit');
 
 

+ 1 - 1
apps/app/src/components/TableOfContents.tsx

@@ -13,7 +13,7 @@ import styles from './TableOfContents.module.scss';
 
 const { isUserPage: _isUserPage } = pagePathUtils;
 
-// eslint-disable-next-line no-unused-vars
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:TableOfContents');
 
 const TableOfContents = (): JSX.Element => {

+ 3 - 5
apps/app/src/server/models/attachment.js

@@ -1,12 +1,9 @@
+import path from 'path';
+
 import loggerFactory from '~/utils/logger';
 
 import { AttachmentType } from '../interfaces/attachment';
 
-// disable no-return-await for model functions
-/* eslint-disable no-return-await */
-
-// eslint-disable-next-line no-unused-vars
-const path = require('path');
 
 const { addSeconds } = require('date-fns');
 const mongoose = require('mongoose');
@@ -60,6 +57,7 @@ module.exports = function(crowi) {
 
 
   attachmentSchema.statics.createWithoutSave = function(pageId, user, fileStream, originalName, fileFormat, fileSize, attachmentType) {
+    // eslint-disable-next-line @typescript-eslint/no-this-alias
     const Attachment = this;
 
     const extname = path.extname(originalName);

+ 1 - 0
apps/app/src/server/models/named-query.ts

@@ -10,6 +10,7 @@ import loggerFactory from '../../utils/logger';
 import { getOrCreateModel } from '../util/mongoose-utils';
 
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:models:named-query');
 
 export interface NamedQueryDocument extends INamedQuery, Document {}

+ 0 - 1
apps/app/src/server/models/page-operation.ts

@@ -17,7 +17,6 @@ const TIME_TO_ADD_SEC = 10;
 
 const logger = loggerFactory('growi:models:page-operation');
 
-type IObjectId = mongoose.Types.ObjectId;
 const ObjectId = mongoose.Schema.Types.ObjectId;
 
 /*

+ 0 - 65
apps/app/src/server/routes/admin.js

@@ -1,29 +1,19 @@
 import { SupportedAction } from '~/interfaces/activity';
-import UserGroup from '~/server/models/user-group';
 import loggerFactory from '~/utils/logger';
 
 const logger = loggerFactory('growi:routes:admin');
-const debug = require('debug')('growi:routes:admin');
 
 /* eslint-disable no-use-before-define */
 module.exports = function(crowi, app) {
 
-  const models = crowi.models;
-  const UserGroupRelation = models.UserGroupRelation;
-  const GlobalNotificationSetting = models.GlobalNotificationSetting;
-
   const {
     configManager,
-    aclService,
-    slackIntegrationService,
     exportService,
   } = crowi;
 
-  const recommendedWhitelist = require('~/services/xss/recommended-whitelist');
   const ApiResponse = require('../util/apiResponse');
   const importer = require('../util/importer')(crowi);
 
-  const MAX_PAGE_LIST = 50;
   const actions = {};
 
   const { check, param } = require('express-validator');
@@ -32,61 +22,6 @@ module.exports = function(crowi, app) {
 
   const api = {};
 
-  function createPager(total, limit, page, pagesCount, maxPageList) {
-    const pager = {
-      page,
-      pagesCount,
-      pages: [],
-      total,
-      previous: null,
-      previousDots: false,
-      next: null,
-      nextDots: false,
-    };
-
-    if (page > 1) {
-      pager.previous = page - 1;
-    }
-
-    if (page < pagesCount) {
-      pager.next = page + 1;
-    }
-
-    let pagerMin = Math.max(1, Math.ceil(page - maxPageList / 2));
-    let pagerMax = Math.min(pagesCount, Math.floor(page + maxPageList / 2));
-    if (pagerMin === 1) {
-      if (MAX_PAGE_LIST < pagesCount) {
-        pagerMax = MAX_PAGE_LIST;
-      }
-      else {
-        pagerMax = pagesCount;
-      }
-    }
-    if (pagerMax === pagesCount) {
-      if ((pagerMax - MAX_PAGE_LIST) < 1) {
-        pagerMin = 1;
-      }
-      else {
-        pagerMin = pagerMax - MAX_PAGE_LIST;
-      }
-    }
-
-    pager.previousDots = null;
-    if (pagerMin > 1) {
-      pager.previousDots = true;
-    }
-
-    pager.nextDots = null;
-    if (pagerMax < pagesCount) {
-      pager.nextDots = true;
-    }
-
-    for (let i = pagerMin; i <= pagerMax; i++) {
-      pager.pages.push(i);
-    }
-
-    return pager;
-  }
 
   // Importer management
   actions.importer = {};

+ 1 - 1
apps/app/src/server/routes/apiv3/bookmarks.js

@@ -79,7 +79,7 @@ module.exports = (crowi) => {
 
   const activityEvent = crowi.event('activity');
 
-  const { Page, Bookmark, User } = crowi.models;
+  const { Page, Bookmark } = crowi.models;
 
   const validator = {
     bookmarks: [

+ 1 - 0
apps/app/src/server/routes/apiv3/installer.ts

@@ -13,6 +13,7 @@ import { InstallerService, FailedToCreateAdminUserError } from '../../service/in
 import { ApiV3Response } from './interfaces/apiv3-response';
 
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:routes:apiv3:installer');
 
 

+ 1 - 1
apps/app/src/server/routes/apiv3/page.js

@@ -168,7 +168,7 @@ module.exports = (crowi) => {
   const configManager = crowi.configManager;
 
   const globalNotificationService = crowi.getGlobalNotificationService();
-  const { Page, GlobalNotificationSetting, Bookmark } = crowi.models;
+  const { Page, GlobalNotificationSetting } = crowi.models;
   const { pageService, exportService } = crowi;
 
   const activityEvent = crowi.event('activity');

+ 2 - 4
apps/app/src/server/routes/apiv3/slack-integration-legacy-settings.js

@@ -1,4 +1,6 @@
 import { ErrorV3 } from '@growi/core/dist/models';
+import express from 'express';
+import { body } from 'express-validator';
 
 import { SupportedAction } from '~/interfaces/activity';
 import loggerFactory from '~/utils/logger';
@@ -10,12 +12,8 @@ import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:routes:apiv3:slack-integration-legacy-setting');
 
-const express = require('express');
-
 const router = express.Router();
 
-const { body } = require('express-validator');
-
 const validator = {
   slackConfiguration: [
     body('webhookUrl').if(value => value != null).isString().trim(),

+ 1 - 2
apps/app/src/server/routes/apiv3/slack-integration-settings.js

@@ -17,8 +17,7 @@ import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
 
 const axios = require('axios');
 const express = require('express');
-const { body, query, param } = require('express-validator');
-const mongoose = require('mongoose');
+const { body, param } = require('express-validator');
 const urljoin = require('url-join');
 
 const logger = loggerFactory('growi:routes:apiv3:slack-integration-settings');

+ 1 - 1
apps/app/src/server/routes/apiv3/slack-integration.js

@@ -142,7 +142,7 @@ module.exports = (crowi) => {
     // for without proxy
     res.send();
 
-    const { interactionPayload, interactionPayloadAccessor } = req;
+    const { interactionPayloadAccessor } = req;
     const siteUrl = crowi.appService.getSiteUrl();
 
     const { actionId, callbackId } = interactionPayloadAccessor.getActionIdAndCallbackIdFromPayLoad();

+ 1 - 1
apps/app/src/server/routes/apiv3/user-activation.ts

@@ -50,7 +50,7 @@ export const validateCompleteRegistration = (req, res, next) => {
 };
 
 async function sendEmailToAllAdmins(userData, admins, appTitle, mailService, template, url) {
-  const promises = admins.map((admin) => {
+  admins.map((admin) => {
     return mailService.send({
       to: admin.email,
       subject: `[${appTitle}:admin] A New User Created and Waiting for Activation`,

+ 0 - 3
apps/app/src/server/routes/apiv3/user-group.js

@@ -17,13 +17,10 @@ const router = express.Router();
 
 const { body, param, query } = require('express-validator');
 const { sanitizeQuery } = require('express-validator');
-const mongoose = require('mongoose');
 
 const { serializeUserSecurely } = require('../../models/serializers/user-serializer');
 const { toPagingLimit, toPagingOffset } = require('../../util/express-validator/sanitizer');
 
-const { ObjectId } = mongoose.Types;
-
 
 /**
  * @swagger

+ 0 - 1
apps/app/src/server/routes/index.js

@@ -43,7 +43,6 @@ module.exports = function(crowi, app) {
   const loginPassport = require('./login-passport')(crowi, app);
   const me = require('./me')(crowi, app);
   const admin = require('./admin')(crowi, app);
-  const user = require('./user')(crowi, app);
   const attachment = require('./attachment')(crowi, app);
   const comment = require('./comment')(crowi, app);
   const tag = require('./tag')(crowi, app);

+ 0 - 1
apps/app/src/server/routes/me.js

@@ -51,7 +51,6 @@
 module.exports = function(crowi, app) {
   const models = crowi.models;
   const UserGroupRelation = models.UserGroupRelation;
-  const ExternalAccount = models.ExternalAccount;
   const ApiResponse = require('../util/apiResponse');
 
   // , pluginService = require('../service/plugin')

+ 0 - 1
apps/app/src/server/routes/page.js

@@ -833,7 +833,6 @@ module.exports = function(crowi, app) {
     };
 
     let page;
-    let descendantPages;
     try {
       page = await Page.findByIdAndViewer(pageId, req.user);
       if (page == null) {

+ 0 - 1
apps/app/src/server/service/customize.ts

@@ -1,4 +1,3 @@
-// eslint-disable-next-line no-unused-vars
 import { ColorScheme } from '@growi/core';
 import { DevidedPagePath } from '@growi/core/dist/models';
 import { getForcedColorScheme } from '@growi/core/dist/utils';

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

@@ -19,7 +19,7 @@ import ElasticsearchDelegator from './search-delegator/elasticsearch';
 import PrivateLegacyPagesDelegator from './search-delegator/private-legacy-pages';
 
 
-// eslint-disable-next-line no-unused-vars
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:service:search');
 
 const nonNullable = <T>(value: T): value is NonNullable<T> => value != null;

+ 2 - 0
apps/app/src/server/service/slack-command-handler/create-page-service.js

@@ -3,7 +3,9 @@ import { reshapeContentsBody } from '@growi/slack/dist/utils/reshape-contents-bo
 
 import loggerFactory from '~/utils/logger';
 
+// eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:service:CreatePageService');
+
 const { pathUtils } = require('@growi/core/dist/utils');
 const mongoose = require('mongoose');
 

+ 0 - 2
apps/app/src/server/service/slack-command-handler/search.js

@@ -8,8 +8,6 @@ import loggerFactory from '~/utils/logger';
 
 const logger = loggerFactory('growi:service:SlackCommandHandler:search');
 
-const { formatDistanceStrict } = require('date-fns');
-
 const PAGINGLIMIT = 7;
 
 

+ 1 - 1
apps/app/src/server/service/slack-command-handler/togetter.js

@@ -5,9 +5,9 @@ import { respond, deleteOriginal } from '@growi/slack/dist/utils/response-url';
 
 import loggerFactory from '~/utils/logger';
 
+// eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:service:SlackBotService:togetter');
 
-const axios = require('axios');
 const { parse, format } = require('date-fns');
 
 const { SlackCommandHandlerError } = require('../../models/vo/slack-command-handler-error');

+ 0 - 1
apps/app/src/server/service/user-notification/index.ts

@@ -1,4 +1,3 @@
-import UpdatePost from '~/server/models/update-post';
 import { toArrayFromCsv } from '~/utils/to-array-from-csv';
 
 

+ 2 - 1
apps/app/src/services/renderer/renderer.tsx

@@ -29,6 +29,7 @@ import * as xsvToTable from './remark-plugins/xsv-to-table';
 // import EasyGrid from './PreProcessor/EasyGrid';
 
 
+// eslint-disable-next-line @typescript-eslint/no-unused-vars
 const logger = loggerFactory('growi:services:renderer');
 
 
@@ -125,7 +126,7 @@ export const generateSSRViewOptions = (
 ): RendererOptions => {
   const options = generateCommonOptions(pagePath);
 
-  const { remarkPlugins, rehypePlugins, components } = options;
+  const { remarkPlugins, rehypePlugins } = options;
 
   // add remark plugins
   remarkPlugins.push(

+ 6 - 8
apps/app/src/stores/in-app-notification.ts

@@ -12,12 +12,11 @@ const logger = loggerFactory('growi:cli:InAppNotification');
 
 type inAppNotificationPaginateResult = PaginateResult<IInAppNotification>
 
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-export const useSWRxInAppNotifications = <Data, Error>(
-  limit: number,
-  offset?: number,
-  status?: InAppNotificationStatuses,
-  config?: SWRConfiguration,
+export const useSWRxInAppNotifications = (
+    limit: number,
+    offset?: number,
+    status?: InAppNotificationStatuses,
+    config?: SWRConfiguration,
 ): SWRResponse<PaginateResult<IInAppNotification>, Error> => {
   return useSWR(
     ['/in-app-notification/list', limit, offset, status],
@@ -46,8 +45,7 @@ export const useSWRxInAppNotifications = <Data, Error>(
   );
 };
 
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-export const useSWRxInAppNotificationStatus = <Data, Error>(
+export const useSWRxInAppNotificationStatus = (
 ): SWRResponse<number, Error> => {
   return useSWR(
     '/in-app-notification/status',

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

@@ -1,6 +1,5 @@
 import mongoose from 'mongoose';
 
-import { IPageRedirect, PageRedirectModel } from '../../../src/server/models/page-redirect';
 import { getInstance } from '../setup-crowi';
 
 describe('PageRedirect', () => {