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

Merge branch 'support/apply-nextjs-to-PageComments' into support/delete-appcontainer-for-PageComments

ryoji-s 3 лет назад
Родитель
Сommit
10adbda6af
40 измененных файлов с 164 добавлено и 184 удалено
  1. 6 10
      packages/app/src/client/services/ContextExtractor.tsx
  2. 5 10
      packages/app/src/components/Page/RevisionLoader.jsx
  3. 1 2
      packages/app/src/components/Page/RevisionRenderer.tsx
  4. 4 4
      packages/app/src/components/SearchPage/SearchResultContent.tsx
  5. 5 12
      packages/app/src/components/Sidebar/CustomSidebar.tsx
  6. 6 8
      packages/app/src/interfaces/services/renderer.ts
  7. 2 1
      packages/app/src/migrations/20180927102719-init-serverurl.js
  8. 2 1
      packages/app/src/migrations/20190618055300-abolish-crowi-classic-auth.js
  9. 2 1
      packages/app/src/migrations/20190618104011-add-config-app-installed.js
  10. 2 1
      packages/app/src/migrations/20200420160390-remove-crowi-layout.js
  11. 2 1
      packages/app/src/migrations/20200512005851-remove-behavior-type.js
  12. 2 1
      packages/app/src/migrations/20200514001356-update-theme-color-for-dark.js
  13. 2 1
      packages/app/src/migrations/20200620203632-normalize-locale-id.js
  14. 2 1
      packages/app/src/migrations/20200827045151-remove-layout-setting.js
  15. 2 1
      packages/app/src/migrations/20200828024025-copy-aws-setting.js
  16. 2 1
      packages/app/src/migrations/20200901034313-update-mail-transmission.js
  17. 3 1
      packages/app/src/migrations/20200903080025-remove-timeline-type.js.js
  18. 3 1
      packages/app/src/migrations/20200915035234-rename-s3-config.js
  19. 2 1
      packages/app/src/migrations/20210830074539-update-configs-for-slackbot.js
  20. 3 2
      packages/app/src/migrations/20211005131430-config-without-proxy-command-permission-for-renaming.js
  21. 3 2
      packages/app/src/migrations/20220131001218-convert-redirect-to-pages-to-page-redirect-documents.js
  22. 16 17
      packages/app/src/pages/[[...path]].page.tsx
  23. 0 1
      packages/app/src/server/crowi/index.js
  24. 3 2
      packages/app/src/server/models/page.ts
  25. 3 3
      packages/app/src/server/service/activity.ts
  26. 7 7
      packages/app/src/server/service/search.ts
  27. 3 3
      packages/app/src/services/renderer/PreProcessor/XssFilter.ts
  28. 7 7
      packages/app/src/services/renderer/markdown-it/blockdiag.ts
  29. 3 3
      packages/app/src/services/renderer/markdown-it/drawio-viewer.js
  30. 2 2
      packages/app/src/services/renderer/markdown-it/emoji.js
  31. 1 1
      packages/app/src/services/renderer/markdown-it/footernote.js
  32. 1 1
      packages/app/src/services/renderer/markdown-it/link-by-relative-path.ts
  33. 1 1
      packages/app/src/services/renderer/markdown-it/mathjax.js
  34. 6 6
      packages/app/src/services/renderer/markdown-it/plantuml.ts
  35. 8 8
      packages/app/src/services/renderer/markdown-it/task-lists.js
  36. 10 10
      packages/app/src/services/renderer/markdown-it/toc-and-anchor.js
  37. 21 31
      packages/app/src/services/renderer/renderer.tsx
  38. 3 3
      packages/app/src/services/xss/xssOption.ts
  39. 2 2
      packages/app/src/stores/context.tsx
  40. 6 13
      packages/app/src/stores/renderer.tsx

+ 6 - 10
packages/app/src/client/services/ContextExtractor.tsx

@@ -6,7 +6,6 @@ import { pagePathUtils } from '@growi/core';
 import { CustomWindow } from '~/interfaces/global';
 import { IUserUISettings } from '~/interfaces/user-ui-settings';
 // import { generatePreviewRenderer } from '~/services/renderer/growi-renderer';
-import { useRendererSettings } from '~/stores/renderer';
 import {
   useIsDeviceSmallerThanMd, useIsDeviceSmallerThanLg,
   usePreferDrawerModeByUser, usePreferDrawerModeOnEditByUser, useSidebarCollapsed, useCurrentSidebarContents, useCurrentProductNavWidth,
@@ -23,7 +22,7 @@ import {
   useIsSearchPage, useIsForbidden, useIsIdenticalPath, useHasParent,
   useIsAclEnabled, useIsSearchServiceConfigured, useIsSearchServiceReachable, useIsEnabledAttachTitleHeader,
   useDefaultIndentSize, useIsIndentSizeForced, useCsrfToken, useGrowiVersion, useAuditLogEnabled,
-  useActivityExpirationSeconds, useAuditLogAvailableActions, useGrowiRendererConfig,
+  useActivityExpirationSeconds, useAuditLogAvailableActions, useRendererConfig,
 } from '../../stores/context';
 
 const { isTrashPage: _isTrashPage } = pagePathUtils;
@@ -120,22 +119,19 @@ const ContextExtractorOnce: FC = () => {
   useActivityExpirationSeconds(configByContextHydrate.activityExpirationSeconds);
   useAuditLogAvailableActions(configByContextHydrate.auditLogAvailableActions);
   useGrowiVersion(configByContextHydrate.crowi.version);
-  useRendererSettings({
+  useRendererConfig({
     isEnabledLinebreaks: configByContextHydrate.isEnabledLinebreaks,
     isEnabledLinebreaksInComments: configByContextHydrate.isEnabledLinebreaksInComments,
     adminPreferredIndentSize: configByContextHydrate.adminPreferredIndentSize,
     isIndentSizeForced: configByContextHydrate.isIndentSizeForced,
-  });
-  useGrowiRendererConfig({
+
     isEnabledXssPrevention: configByContextHydrate.isEnabledXssPrevention,
     attrWhiteList: configByContextHydrate.attrWhiteList,
     tagWhiteList: configByContextHydrate.tagWhiteList,
     highlightJsStyleBorder: configByContextHydrate.highlightJsStyleBorder,
-    env: {
-      MATHJAX: configByContextHydrate.env.MATHJAX,
-      PLANTUML_URI: configByContextHydrate.env.PLANTUML_URI,
-      BLOCKDIAG_URI: configByContextHydrate.env.BLOCKDIAG_URI,
-    },
+
+    plantumlUri: configByContextHydrate.env.PLANTUML_URI,
+    blockdiagUri: configByContextHydrate.env.BLOCKDIAG_URI,
   });
 
   // Page

+ 5 - 10
packages/app/src/components/Page/RevisionLoader.jsx

@@ -1,12 +1,11 @@
 import React from 'react';
 
-import PropTypes from 'prop-types';
 import { useTranslation } from 'next-i18next';
+import PropTypes from 'prop-types';
 import { Waypoint } from 'react-waypoint';
 
 import { apiv3Get } from '~/client/util/apiv3-client';
-import GrowiRenderer from '~/services/renderer/growi-renderer';
-import { useViewRenderer } from '~/stores/renderer';
+import { RendererOptions } from '~/services/renderer/renderer';
 import loggerFactory from '~/utils/logger';
 
 import RevisionRenderer from './RevisionRenderer';
@@ -110,7 +109,7 @@ class RevisionLoader extends React.Component {
 
     return (
       <RevisionRenderer
-        growiRenderer={this.props.growiRenderer}
+        rendererOptions={this.props.rendererOptions}
         markdown={markdown}
         pagePath={this.props.pagePath}
         highlightKeywords={this.props.highlightKeywords}
@@ -124,7 +123,7 @@ class RevisionLoader extends React.Component {
 RevisionLoader.propTypes = {
   t: PropTypes.func.isRequired,
 
-  growiRenderer: PropTypes.instanceOf(GrowiRenderer).isRequired,
+  rendererOptions: PropTypes.instanceOf(RendererOptions).isRequired,
   pageId: PropTypes.string.isRequired,
   pagePath: PropTypes.string.isRequired,
   revisionId: PropTypes.string.isRequired,
@@ -135,12 +134,8 @@ RevisionLoader.propTypes = {
 
 const RevisionLoaderWrapperFC = (props) => {
   const { t } = useTranslation();
-  const { data: growiRenderer } = useViewRenderer();
-  if (growiRenderer == null) {
-    return <></>;
-  }
 
-  return <RevisionLoader t={t} growiRenderer={growiRenderer} {...props} />;
+  return <RevisionLoader t={t} {...props} />;
 };
 
 export default RevisionLoaderWrapperFC;

+ 1 - 2
packages/app/src/components/Page/RevisionRenderer.tsx

@@ -5,8 +5,7 @@ import ReactMarkdown from 'react-markdown';
 import { blinkElem } from '~/client/util/blink-section-header';
 import { addSmoothScrollEvent } from '~/client/util/smooth-scroll';
 import { CustomWindow } from '~/interfaces/global';
-// import GrowiRenderer from '~/services/renderer/growi-renderer';
-import { RendererOptions } from '~/services/renderer/growi-renderer';
+import { RendererOptions } from '~/services/renderer/renderer';
 import { useCurrentPathname, useInterceptorManager } from '~/stores/context';
 import { useEditorSettings } from '~/stores/editor';
 import { useViewOptions } from '~/stores/renderer';

+ 4 - 4
packages/app/src/components/SearchPage/SearchResultContent.tsx

@@ -15,7 +15,7 @@ import {
   usePageDuplicateModal, usePageRenameModal, usePageDeleteModal,
 } from '~/stores/modal';
 import { useDescendantsPageListForCurrentPathTermManager, usePageTreeTermManager } from '~/stores/page-listing';
-import { useSearchResultRenderer } from '~/stores/renderer';
+import { useSearchResultOptions } from '~/stores/renderer';
 import { useFullTextSearchTermManager } from '~/stores/search';
 
 
@@ -120,7 +120,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
   const { open: openRenameModal } = usePageRenameModal();
   const { open: openDeleteModal } = usePageDeleteModal();
 
-  const { data: growiRenderer } = useSearchResultRenderer();
+  const { data: rendererOptions } = useSearchResultOptions();
 
   const duplicateItemClickedHandler = useCallback(async(pageToDuplicate) => {
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -194,7 +194,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
   }, [page, showPageControlDropdown, forceHideMenuItems, duplicateItemClickedHandler, renameItemClickedHandler, deleteItemClickedHandler]);
 
   // return if page or growiRenderer is null
-  if (page == null || growiRenderer == null) return <></>;
+  if (page == null || rendererOptions == null) return <></>;
 
   return (
     <div key={page._id} data-testid="search-result-content" className="search-result-content grw-page-path-text-muted-container d-flex flex-column">
@@ -208,7 +208,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
       </div>
       <div className="search-result-content-body-container" ref={scrollElementRef}>
         <RevisionLoader
-          growiRenderer={growiRenderer}
+          rendererOptions={rendererOptions}
           pageId={page._id}
           pagePath={page.path}
           revisionId={page.revision}

+ 5 - 12
packages/app/src/components/Sidebar/CustomSidebar.tsx

@@ -7,7 +7,7 @@ import { useSWRxPageByPath } from '~/stores/page';
 import { withUnstatedContainers } from '../UnstatedUtils';
 import RevisionRenderer from '../Page/RevisionRenderer';
 import { IRevision } from '~/interfaces/revision';
-import { useCustomSidebarRenderer } from '~/stores/renderer';
+import { useCustomSidebarOptions } from '~/stores/renderer';
 
 const logger = loggerFactory('growi:cli:CustomSidebar');
 
@@ -28,13 +28,11 @@ type Props = {
 
 const CustomSidebar: FC<Props> = (props: Props) => {
 
-  const { appContainer } = props;
-
-  const { data: renderer } = useCustomSidebarRenderer();
+  const { data: rendererOptions } = useCustomSidebarOptions();
 
   const { data: page, error, mutate } = useSWRxPageByPath('/Sidebar');
 
-  if (renderer == null) {
+  if (rendererOptions == null) {
     return <></>;
   }
 
@@ -65,7 +63,7 @@ const CustomSidebar: FC<Props> = (props: Props) => {
         (!isLoading && markdown != null) && (
           <div className="p-3">
             <RevisionRenderer
-              growiRenderer={renderer}
+              rendererOptions={rendererOptions}
               markdown={markdown}
               pagePath="/Sidebar"
               additionalClassName="grw-custom-sidebar-content"
@@ -83,9 +81,4 @@ const CustomSidebar: FC<Props> = (props: Props) => {
   );
 };
 
-/**
- * Wrapper component for using unstated
- */
-const CustomSidebarWrapper = withUnstatedContainers(CustomSidebar, [AppContainer]);
-
-export default CustomSidebarWrapper;
+export default CustomSidebar;

+ 6 - 8
packages/app/src/interfaces/services/renderer.ts

@@ -1,12 +1,5 @@
 import { XssOptionConfig } from '~/services/xss/xssOption';
 
-export type RendererSettings = {
-  isEnabledLinebreaks: boolean,
-  isEnabledLinebreaksInComments: boolean,
-  adminPreferredIndentSize: number,
-  isIndentSizeForced: boolean,
-};
-
 // export type GrowiHydratedEnv = {
 //   DRAWIO_URI: string | null,
 //   HACKMD_URI: string | null,
@@ -15,8 +8,13 @@ export type RendererSettings = {
 //   GROWI_APP_ID_FOR_GROWI_CLOUD: string | null,
 // }
 
-export type GrowiRendererConfig = {
+export type RendererConfig = {
+  isEnabledLinebreaks: boolean,
+  isEnabledLinebreaksInComments: boolean,
+  adminPreferredIndentSize: number,
+  isIndentSizeForced: boolean,
   highlightJsStyleBorder: boolean
+
   plantumlUri: string | null,
   blockdiagUri: string | null,
 } & XssOptionConfig;

+ 2 - 1
packages/app/src/migrations/20180927102719-init-serverurl.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20190618055300-abolish-crowi-classic-auth.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20190618104011-add-config-app-installed.js

@@ -1,6 +1,7 @@
+import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200420160390-remove-crowi-layout.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200512005851-remove-behavior-type.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200514001356-update-theme-color-for-dark.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200620203632-normalize-locale-id.js

@@ -1,6 +1,7 @@
+import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200827045151-remove-layout-setting.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200828024025-copy-aws-setting.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 2 - 1
packages/app/src/migrations/20200901034313-update-mail-transmission.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 3 - 1
packages/app/src/migrations/20200903080025-remove-timeline-type.js.js

@@ -1,7 +1,9 @@
 import { getMongoUri, mongoOptions } from '@growi/core';
-import loggerFactory from '~/utils/logger';
 
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
+import loggerFactory from '~/utils/logger';
+
 
 const logger = loggerFactory('growi:migrate:remove-timeline-type');
 

+ 3 - 1
packages/app/src/migrations/20200915035234-rename-s3-config.js

@@ -1,7 +1,9 @@
 import { getMongoUri, mongoOptions } from '@growi/core';
-import loggerFactory from '~/utils/logger';
 
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
+import loggerFactory from '~/utils/logger';
+
 
 const logger = loggerFactory('growi:migrate:remove-timeline-type');
 

+ 2 - 1
packages/app/src/migrations/20210830074539-update-configs-for-slackbot.js

@@ -1,6 +1,7 @@
+import { getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getMongoUri, mongoOptions } from '@growi/core';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
 import loggerFactory from '~/utils/logger';
 

+ 3 - 2
packages/app/src/migrations/20211005131430-config-without-proxy-command-permission-for-renaming.js

@@ -1,8 +1,9 @@
+import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
 import mongoose from 'mongoose';
 
-import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
-import loggerFactory from '~/utils/logger';
+// eslint-disable-next-line import/no-named-as-default
 import Config from '~/server/models/config';
+import loggerFactory from '~/utils/logger';
 
 
 const logger = loggerFactory('growi:migrate:slack-app-integration-rename-keys');

+ 3 - 2
packages/app/src/migrations/20220131001218-convert-redirect-to-pages-to-page-redirect-documents.js

@@ -1,9 +1,10 @@
-import mongoose from 'mongoose';
 import { getModelSafely, getMongoUri, mongoOptions } from '@growi/core';
+import mongoose from 'mongoose';
 
+// eslint-disable-next-line import/no-named-as-default
 import PageRedirectModel from '~/server/models/page-redirect';
-import loggerFactory from '~/utils/logger';
 import { createBatchStream } from '~/server/util/batch-stream';
+import loggerFactory from '~/utils/logger';
 
 const logger = loggerFactory('growi:migrate:convert-redirect-to-pages-to-page-redirect-documents');
 

+ 16 - 17
packages/app/src/pages/[[...path]].page.tsx

@@ -22,13 +22,12 @@ import { CrowiRequest } from '~/interfaces/crowi-request';
 // import { EditorMode, useEditorMode, useIsMobile } from '~/stores/ui';
 import { CustomWindow } from '~/interfaces/global';
 import { IPageWithMeta } from '~/interfaces/page';
-import { GrowiRendererConfig, RendererSettings } from '~/interfaces/services/renderer';
+import { RendererConfig } from '~/interfaces/services/renderer';
 import { ISidebarConfig } from '~/interfaces/sidebar-config';
 import { PageModel, PageDocument } from '~/server/models/page';
 import UserUISettings, { UserUISettingsDocument } from '~/server/models/user-ui-settings';
 import Xss from '~/services/xss';
 import { useSWRxCurrentPage, useSWRxPageInfo, useSWRxPage } from '~/stores/page';
-import { useRendererSettings } from '~/stores/renderer';
 import {
   usePreferDrawerModeByUser, usePreferDrawerModeOnEditByUser, useSidebarCollapsed, useCurrentSidebarContents, useCurrentProductNavWidth,
 } from '~/stores/ui';
@@ -49,13 +48,14 @@ import DisplaySwitcher from '../components/Page/DisplaySwitcher';
 
 import {
   useCurrentUser, useCurrentPagePath,
-  useOwnerOfCurrentPage, useIsLatestRevision,
-  useIsForbidden, useIsNotFound, useIsTrashPage, useShared, useShareLinkId, useIsSharedUser, useIsAbleToDeleteCompletely,
+  useIsLatestRevision,
+  useIsForbidden, useIsNotFound, useIsTrashPage, useIsSharedUser,
   useAppTitle, useSiteUrl, useConfidential, useIsEnabledStaleNotification, useIsIdenticalPath,
-  useIsSearchServiceConfigured, useIsSearchServiceReachable, useIsMailerSetup, useDisableLinkSharing,
-  useAclEnabled, useIsAclEnabled, useHasSlackConfig, useDrawioUri, useHackmdUri, useIsUserPage, useIsNotCreatable,
-  useNoCdn, useEditorConfig, useCsrfToken, useIsSearchScopeChildrenAsDefault, useCurrentPageId, useCurrentPathname,
-  useIsSlackConfigured, useGrowiRendererConfig, useIsBlinkedHeaderAtBoot,
+  useIsSearchServiceConfigured, useIsSearchServiceReachable, useDisableLinkSharing,
+  useHackmdUri,
+  useIsAclEnabled, useIsUserPage, useIsNotCreatable,
+  useCsrfToken, useIsSearchScopeChildrenAsDefault, useCurrentPageId, useCurrentPathname,
+  useIsSlackConfigured, useIsBlinkedHeaderAtBoot, useRendererConfig,
 } from '../stores/context';
 import { useXss } from '../stores/xss';
 
@@ -118,8 +118,7 @@ type Props = CommonProps & {
   // isIndentSizeForced: boolean,
   disableLinkSharing: boolean,
 
-  rendererSettings: RendererSettings,
-  growiRendererConfig: GrowiRendererConfig,
+  rendererConfig: RendererConfig,
 
   // UI
   userUISettings: UserUISettingsDocument | null
@@ -187,8 +186,7 @@ const GrowiPage: NextPage<Props> = (props: Props) => {
   // useIndentSize(props.adminPreferredIndentSize);
   useDisableLinkSharing(props.disableLinkSharing);
 
-  useRendererSettings(props.rendererSettings);
-  useGrowiRendererConfig(props.growiRendererConfig);
+  useRendererConfig(props.rendererConfig);
   // useRendererSettings(props.rendererSettingsStr != null ? JSON.parse(props.rendererSettingsStr) : undefined);
   // useGrowiRendererConfig(props.growiRendererConfigStr != null ? JSON.parse(props.growiRendererConfigStr) : undefined);
 
@@ -437,19 +435,20 @@ async function injectServerConfigurations(context: GetServerSidePropsContext, pr
   // props.adminPreferredIndentSize = configManager.getConfig('markdown', 'markdown:adminPreferredIndentSize');
   // props.isIndentSizeForced = configManager.getConfig('markdown', 'markdown:isIndentSizeForced');
 
-  props.rendererSettings = {
+  props.rendererConfig = {
     isEnabledLinebreaks: configManager.getConfig('markdown', 'markdown:isEnabledLinebreaks'),
     isEnabledLinebreaksInComments: configManager.getConfig('markdown', 'markdown:isEnabledLinebreaksInComments'),
     adminPreferredIndentSize: configManager.getConfig('markdown', 'markdown:adminPreferredIndentSize'),
     isIndentSizeForced: configManager.getConfig('markdown', 'markdown:isIndentSizeForced'),
-  };
-  props.growiRendererConfig = {
+
+    plantumlUri: process.env.PLANTUML_URI ?? null,
+    blockdiagUri: process.env.BLOCKDIAG_URI ?? null,
+
+    // XSS Options
     isEnabledXssPrevention: configManager.getConfig('markdown', 'markdown:xss:isEnabledPrevention'),
     attrWhiteList: crowi.xssService.getAttrWhiteList(),
     tagWhiteList: crowi.xssService.getTagWhiteList(),
     highlightJsStyleBorder: crowi.configManager.getConfig('crowi', 'customize:highlightJsStyleBorder'),
-    plantumlUri: process.env.PLANTUML_URI ?? null,
-    blockdiagUri: process.env.BLOCKDIAG_URI ?? null,
   };
 
   props.sidebarConfig = {

+ 0 - 1
packages/app/src/server/crowi/index.js

@@ -15,7 +15,6 @@ import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 
 import Activity from '../models/activity';
-import PageOperation, { PageActionType } from '../models/page-operation';
 import PageRedirect from '../models/page-redirect';
 import Tag from '../models/tag';
 import UserGroup from '../models/user-group';

+ 3 - 2
packages/app/src/server/models/page.ts

@@ -15,7 +15,6 @@ import { IUserHasId } from '~/interfaces/user';
 import { ObjectIdLike } from '~/server/interfaces/mongoose-utils';
 
 import loggerFactory from '../../utils/logger';
-import Crowi from '../crowi';
 
 import { getPageSchema, extractToAncestorsPaths, populateDataToShowRevision } from './obsolete-page';
 
@@ -957,7 +956,9 @@ export type PageCreateOptions = {
 /*
  * Merge obsolete page model methods and define new methods which depend on crowi instance
  */
-export default (crowi: Crowi): any => {
+// remove type for crowi to prevent 'import/no-cycle'
+// eslint-disable-next-line import/no-anonymous-default-export
+export default (crowi): any => {
   let pageEvent;
   if (crowi != null) {
     pageEvent = crowi.event('page');

+ 3 - 3
packages/app/src/server/service/activity.ts

@@ -1,7 +1,7 @@
 import mongoose from 'mongoose';
 
 import {
-  IActivity, SupportedAction, SupportedActionType, AllSupportedActions, ActionGroupSize,
+  IActivity, SupportedActionType, AllSupportedActions, ActionGroupSize,
   AllEssentialActions, AllSmallGroupActions, AllMediumGroupActions, AllLargeGroupActions,
 } from '~/interfaces/activity';
 import { IPage } from '~/interfaces/page';
@@ -96,11 +96,11 @@ class ActivityService {
     }
 
     return Array.from(availableActionsSet);
-  }
+  };
 
   shoudUpdateActivity = function(action: SupportedActionType): boolean {
     return this.getAvailableActions().includes(action);
-  }
+  };
 
   // for GET request
   createActivity = async function(parameters): Promise<void> {

+ 7 - 7
packages/app/src/server/service/search.ts

@@ -1,24 +1,24 @@
-import xss from 'xss';
 import mongoose from 'mongoose';
+import xss from 'xss';
 
 import { SearchDelegatorName } from '~/interfaces/named-query';
 import { IPageWithMeta } from '~/interfaces/page';
 import { IFormattedSearchResult, IPageSearchMeta, ISearchResult } from '~/interfaces/search';
 import loggerFactory from '~/utils/logger';
 
-import NamedQuery from '../models/named-query';
+import { ObjectIdLike } from '../interfaces/mongoose-utils';
 import {
   SearchDelegator, SearchQueryParser, SearchResolver, ParsedQuery, SearchableData, QueryTerms,
 } from '../interfaces/search';
-import ElasticsearchDelegator from './search-delegator/elasticsearch';
-import PrivateLegacyPagesDelegator from './search-delegator/private-legacy-pages';
-
+import NamedQuery from '../models/named-query';
 import { PageModel } from '../models/page';
 import { serializeUserSecurely } from '../models/serializers/user-serializer';
-
-import { ObjectIdLike } from '../interfaces/mongoose-utils';
 import { SearchError } from '../models/vo/search-error';
 
+import ElasticsearchDelegator from './search-delegator/elasticsearch';
+import PrivateLegacyPagesDelegator from './search-delegator/private-legacy-pages';
+
+
 // eslint-disable-next-line no-unused-vars
 const logger = loggerFactory('growi:service:search');
 

+ 3 - 3
packages/app/src/services/renderer/PreProcessor/XssFilter.ts

@@ -3,11 +3,11 @@ import XssOption, { XssOptionConfig } from '~/services/xss/xssOption';
 
 export default class XssFilter {
 
-  xssOption: XssOption
+  xssOption: XssOption;
 
-  xss
+  xss;
 
-  config: XssOptionConfig
+  config: XssOptionConfig;
 
   constructor(config: XssOptionConfig) {
     this.config = config;

+ 7 - 7
packages/app/src/services/renderer/markdown-it/blockdiag.ts

@@ -1,18 +1,18 @@
-import { GrowiRendererConfig } from '~/interfaces/services/renderer';
+import { RendererConfig } from '~/interfaces/services/renderer';
 
 export default class BlockdiagConfigurer {
 
   generateSourceUrl: string;
 
-  constructor(growiConfig: GrowiRendererConfig) {
-    this.generateSourceUrl = growiConfig.blockdiagUri || 'https://blockdiag-api.com/';
+  constructor(config: RendererConfig) {
+    this.generateSourceUrl = config.blockdiagUri || 'https://blockdiag-api.com/';
   }
 
   configure(md) {
-    md.use(require('markdown-it-blockdiag'), {
-      generateSourceUrl: this.generateSourceUrl,
-      marker: ':::',
-    });
+    // md.use(require('markdown-it-blockdiag'), {
+    //   generateSourceUrl: this.generateSourceUrl,
+    //   marker: ':::',
+    // });
   }
 
 }

+ 3 - 3
packages/app/src/services/renderer/markdown-it/drawio-viewer.js

@@ -1,9 +1,9 @@
 export default class DrawioViewerConfigurer {
 
   configure(md) {
-    md.use(require('markdown-it-drawio-viewer'), {
-      marker: ':::',
-    });
+    // md.use(require('markdown-it-drawio-viewer'), {
+    //   marker: ':::',
+    // });
   }
 
 }

+ 2 - 2
packages/app/src/services/renderer/markdown-it/emoji.js

@@ -1,4 +1,4 @@
-import markdownItEmojiMart from 'markdown-it-emoji-mart';
+// import markdownItEmojiMart from 'markdown-it-emoji-mart';
 
 import { emojiMartData } from './emoji-mart-data';
 
@@ -6,7 +6,7 @@ import { emojiMartData } from './emoji-mart-data';
 export default class EmojiConfigurer {
 
   configure(md) {
-    md.use(markdownItEmojiMart, { defs: emojiMartData });
+    // md.use(markdownItEmojiMart, { defs: emojiMartData });
   }
 
 }

+ 1 - 1
packages/app/src/services/renderer/markdown-it/footernote.js

@@ -1,7 +1,7 @@
 export default class FooternoteConfigurer {
 
   configure(md) {
-    md.use(require('markdown-it-footnote'));
+    // md.use(require('markdown-it-footnote'));
   }
 
 }

+ 1 - 1
packages/app/src/services/renderer/markdown-it/link-by-relative-path.ts

@@ -5,7 +5,7 @@ const PATTERN_RELATIVE_PATH = new RegExp(/^(\.{1,2})(\/.*)?$/);
 
 export default class LinkerByRelativePathConfigurer {
 
-  pagePath: string
+  pagePath: string;
 
   constructor(pagePath: string) {
     this.pagePath = pagePath;

+ 1 - 1
packages/app/src/services/renderer/markdown-it/mathjax.js

@@ -1,7 +1,7 @@
 export default class MathJaxConfigurer {
 
   configure(md) {
-    md.use(require('markdown-it-mathjax')());
+    // md.use(require('markdown-it-mathjax')());
   }
 
 }

+ 6 - 6
packages/app/src/services/renderer/markdown-it/plantuml.ts

@@ -1,23 +1,23 @@
 import plantumlEncoder from 'plantuml-encoder';
 import urljoin from 'url-join';
 
-import { GrowiRendererConfig } from '~/interfaces/services/renderer';
+import { RendererConfig } from '~/interfaces/services/renderer';
 
 export default class PlantUMLConfigurer {
 
   serverUrl: string;
 
-  constructor(growiConfig: GrowiRendererConfig) {
+  constructor(config: RendererConfig) {
     // Do NOT use HTTPS URL because plantuml.com refuse request except from members
-    this.serverUrl = growiConfig.plantumlUri || 'http://plantuml.com/plantuml';
+    this.serverUrl = config.plantumlUri || 'http://plantuml.com/plantuml';
 
     this.generateSource = this.generateSource.bind(this);
   }
 
   configure(md) {
-    md.use(require('markdown-it-plantuml'), {
-      generateSource: this.generateSource,
-    });
+    // md.use(require('markdown-it-plantuml'), {
+    //   generateSource: this.generateSource,
+    // });
   }
 
   generateSource(umlCode) {

+ 8 - 8
packages/app/src/services/renderer/markdown-it/task-lists.js

@@ -1,14 +1,14 @@
 export default class TaskListsConfigurer {
 
   configure(md) {
-    md.use(require('markdown-it-task-checkbox'), {
-      disabled: true,
-      divWrap: true,
-      divClass: 'checkbox checkbox-primary',
-      idPrefix: 'cbx_',
-      ulClass: 'task-list',
-      liClass: 'task-list-item',
-    });
+    // md.use(require('markdown-it-task-checkbox'), {
+    //   disabled: true,
+    //   divWrap: true,
+    //   divClass: 'checkbox checkbox-primary',
+    //   idPrefix: 'cbx_',
+    //   ulClass: 'task-list',
+    //   liClass: 'task-list-item',
+    // });
   }
 
 }

+ 10 - 10
packages/app/src/services/renderer/markdown-it/toc-and-anchor.js

@@ -1,19 +1,19 @@
-import markdownItEmojiMart from 'markdown-it-emoji-mart';
-import markdownItToc from 'markdown-it-toc-and-anchor-with-slugid';
+// import markdownItEmojiMart from 'markdown-it-emoji-mart';
+// import markdownItToc from 'markdown-it-toc-and-anchor-with-slugid';
 
 import { emojiMartData } from './emoji-mart-data';
 
 export default class TocAndAnchorConfigurer {
 
   configure(md) {
-    md.use(markdownItEmojiMart, { defs: emojiMartData })
-      .use(markdownItToc, {
-        tocLastLevel: 3,
-        anchorLinkBefore: false,
-        anchorLinkSymbol: '',
-        anchorLinkSymbolClassName: 'icon-link',
-        anchorClassName: 'revision-head-link',
-      });
+    // md.use(markdownItEmojiMart, { defs: emojiMartData })
+    //   .use(markdownItToc, {
+    //     tocLastLevel: 3,
+    //     anchorLinkBefore: false,
+    //     anchorLinkSymbol: '',
+    //     anchorLinkSymbolClassName: 'icon-link',
+    //     anchorClassName: 'revision-head-link',
+    //   });
 
     // set toc render function
     md.set({

+ 21 - 31
packages/app/src/services/renderer/growi-renderer.tsx → packages/app/src/services/renderer/renderer.tsx

@@ -8,7 +8,7 @@ import gfm from 'remark-gfm';
 
 import { Header } from '~/components/ReactMarkdownComponents/Header';
 import { NextLink } from '~/components/ReactMarkdownComponents/NextLink';
-import { GrowiRendererConfig, RendererSettings } from '~/interfaces/services/renderer';
+import { RendererConfig } from '~/interfaces/services/renderer';
 import loggerFactory from '~/utils/logger';
 
 // import CsvToTable from './PreProcessor/CsvToTable';
@@ -41,10 +41,10 @@ const logger = loggerFactory('growi:util:GrowiRenderer');
 
 // export default class GrowiRenderer {
 
-//   growiRendererConfig: GrowiRendererConfig;
+//   RendererConfig: RendererConfig;
 
-//   constructor(growiRendererConfig: GrowiRendererConfig, pagePath?: Nullable<string>) {
-//     this.growiRendererConfig = growiRendererConfig;
+//   constructor(RendererConfig: RendererConfig, pagePath?: Nullable<string>) {
+//     this.RendererConfig = RendererConfig;
 //     this.pagePath = pagePath;
 
 //     if (isClient() && (window as CustomWindow).growiRenderer != null) {
@@ -57,9 +57,9 @@ const logger = loggerFactory('growi:util:GrowiRenderer');
 //         new Linker(),
 //         new CsvToTable(),
 //         new XssFilter({
-//           isEnabledXssPrevention: this.growiRendererConfig.isEnabledXssPrevention,
-//           tagWhiteList: this.growiRendererConfig.tagWhiteList,
-//           attrWhiteList: this.growiRendererConfig.attrWhiteList,
+//           isEnabledXssPrevention: this.RendererConfig.isEnabledXssPrevention,
+//           tagWhiteList: this.RendererConfig.tagWhiteList,
+//           attrWhiteList: this.RendererConfig.attrWhiteList,
 //         }),
 //       ];
 //       this.postProcessors = [
@@ -109,8 +109,8 @@ const logger = loggerFactory('growi:util:GrowiRenderer');
 //       new EmojiConfigurer(),
 //       new MathJaxConfigurer(),
 //       new DrawioViewerConfigurer(),
-//       new PlantUMLConfigurer(this.growiRendererConfig),
-//       new BlockdiagConfigurer(this.growiRendererConfig),
+//       new PlantUMLConfigurer(this.RendererConfig),
+//       new BlockdiagConfigurer(this.RendererConfig),
 //     ];
 
 //     if (this.pagePath != null) {
@@ -165,7 +165,7 @@ const logger = loggerFactory('growi:util:GrowiRenderer');
 //   }
 
 //   codeRenderer(code, langExt) {
-//     const noborder = (!this.growiRendererConfig.highlightJsStyleBorder) ? 'hljs-no-border' : '';
+//     const noborder = (!this.RendererConfig.highlightJsStyleBorder) ? 'hljs-no-border' : '';
 
 //     let citeTag = '';
 //     let hljsLang = 'plaintext';
@@ -208,12 +208,10 @@ const logger = loggerFactory('growi:util:GrowiRenderer');
 export type RendererOptions = Partial<ReactMarkdownOptions>;
 
 export interface ReactMarkdownOptionsGenerator {
-  (growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings): RendererOptions
+  (config: RendererConfig): RendererOptions
 }
 
-const generateCommonOptions: ReactMarkdownOptionsGenerator = (
-    growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings,
-): RendererOptions => {
+const generateCommonOptions: ReactMarkdownOptionsGenerator = (config: RendererConfig): RendererOptions => {
   return {
     remarkPlugins: [gfm],
     rehypePlugins: [slug],
@@ -223,11 +221,9 @@ const generateCommonOptions: ReactMarkdownOptionsGenerator = (
   };
 };
 
-export const generateViewOptions: ReactMarkdownOptionsGenerator = (
-    growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings,
-): RendererOptions => {
+export const generateViewOptions: ReactMarkdownOptionsGenerator = (config: RendererConfig): RendererOptions => {
 
-  const options = generateCommonOptions(growiRendererConfig, rendererSettings);
+  const options = generateCommonOptions(config);
 
   const { remarkPlugins, rehypePlugins, components } = options;
 
@@ -235,7 +231,7 @@ export const generateViewOptions: ReactMarkdownOptionsGenerator = (
   if (remarkPlugins != null) {
     remarkPlugins.push(footnotes);
     remarkPlugins.push(emoji);
-    if (rendererSettings.isEnabledLinebreaks) {
+    if (config.isEnabledLinebreaks) {
       remarkPlugins.push(breaks);
     }
   }
@@ -271,10 +267,8 @@ export const generateViewOptions: ReactMarkdownOptionsGenerator = (
   return options;
 };
 
-export const generatePreviewOptions: ReactMarkdownOptionsGenerator = (
-    growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings,
-): RendererOptions => {
-  const options = generateCommonOptions(growiRendererConfig, rendererSettings);
+export const generatePreviewOptions: ReactMarkdownOptionsGenerator = (config: RendererConfig): RendererOptions => {
+  const options = generateCommonOptions(config);
 
   // // Add configurers for preview
   // renderer.addConfigurers([
@@ -289,10 +283,8 @@ export const generatePreviewOptions: ReactMarkdownOptionsGenerator = (
   return options;
 };
 
-export const generateCommentPreviewOptions: ReactMarkdownOptionsGenerator = (
-    growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings,
-): RendererOptions => {
-  const options = generateCommonOptions(growiRendererConfig, rendererSettings);
+export const generateCommentPreviewOptions: ReactMarkdownOptionsGenerator = (config: RendererConfig): RendererOptions => {
+  const options = generateCommonOptions(config);
 
   // renderer.addConfigurers([
   //   new TableConfigurer(),
@@ -304,10 +296,8 @@ export const generateCommentPreviewOptions: ReactMarkdownOptionsGenerator = (
   return options;
 };
 
-export const generateOthersOptions: ReactMarkdownOptionsGenerator = (
-    growiRendererConfig: GrowiRendererConfig, rendererSettings: RendererSettings,
-): RendererOptions => {
-  const options = generateCommonOptions(growiRendererConfig, rendererSettings);
+export const generateOthersOptions: ReactMarkdownOptionsGenerator = (config: RendererConfig): RendererOptions => {
+  const options = generateCommonOptions(config);
 
   // renderer.addConfigurers([
   //   new TableConfigurer(),

+ 3 - 3
packages/app/src/services/xss/xssOption.ts

@@ -6,11 +6,11 @@ export type XssOptionConfig = {
 
 export default class XssOption {
 
-  isEnabledXssPrevention: boolean
+  isEnabledXssPrevention: boolean;
 
-  tagWhiteList: any[]
+  tagWhiteList: any[];
 
-  attrWhiteList: any[]
+  attrWhiteList: any[];
 
   constructor(config: XssOptionConfig) {
     const recommendedWhitelist = require('~/services/xss/recommended-whitelist');

+ 2 - 2
packages/app/src/stores/context.tsx

@@ -6,7 +6,7 @@ import useSWRImmutable from 'swr/immutable';
 
 import { SupportedActionType } from '~/interfaces/activity';
 // import { CustomWindow } from '~/interfaces/global';
-import { GrowiRendererConfig } from '~/interfaces/services/renderer';
+import { RendererConfig } from '~/interfaces/services/renderer';
 import InterceptorManager from '~/services/interceptor-manager';
 
 import { TargetAndAncestors } from '../interfaces/page-listing-results';
@@ -214,7 +214,7 @@ export const useIsLatestRevision = (initialData?: boolean): SWRResponse<boolean,
   return useStaticSWR('isLatestRevision', initialData);
 };
 
-export const useGrowiRendererConfig = (initialData?: GrowiRendererConfig): SWRResponse<GrowiRendererConfig, any> => {
+export const useRendererConfig = (initialData?: RendererConfig): SWRResponse<RendererConfig, any> => {
   return useStaticSWR('growiRendererConfig', initialData);
 };
 

+ 6 - 13
packages/app/src/stores/renderer.tsx

@@ -1,34 +1,27 @@
 import { Key, SWRResponse } from 'swr';
 import useSWRImmutable from 'swr/immutable';
 
-import { RendererSettings } from '~/interfaces/services/renderer';
 import {
   ReactMarkdownOptionsGenerator, RendererOptions,
   generateViewOptions, generatePreviewOptions, generateCommentPreviewOptions, generateOthersOptions,
-} from '~/services/renderer/growi-renderer';
-import { useStaticSWR } from '~/stores/use-static-swr';
+} from '~/services/renderer/renderer';
 
-import { useCurrentPagePath, useGrowiRendererConfig } from './context';
-
-export const useRendererSettings = (initialData?: RendererSettings): SWRResponse<RendererSettings, Error> => {
-  return useStaticSWR('rendererSettings', initialData);
-};
+import { useRendererConfig } from './context';
 
 // The base hook with common processes
 const _useOptionsBase = (rendererId: string, generator: ReactMarkdownOptionsGenerator): SWRResponse<RendererOptions, Error> => {
-  const { data: rendererSettings } = useRendererSettings();
-  const { data: growiRendererConfig } = useGrowiRendererConfig();
+  const { data: rendererConfig } = useRendererConfig();
 
-  const isAllDataValid = rendererSettings != null && growiRendererConfig != null;
+  const isAllDataValid = rendererConfig != null;
 
   const key = isAllDataValid
-    ? [rendererId, rendererSettings, growiRendererConfig]
+    ? [rendererId, rendererConfig]
     : null;
 
   const swrResult = useSWRImmutable<RendererOptions, Error>(key);
 
   if (isAllDataValid && swrResult.data == null) {
-    swrResult.mutate(generator(growiRendererConfig, rendererSettings));
+    swrResult.mutate(generator(rendererConfig));
   }
 
   // call useSWRImmutable again to foce to update cache