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

configure biome for stores-universal

Futa Arai 7 месяцев назад
Родитель
Сommit
166bb2f810

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

@@ -39,6 +39,7 @@ module.exports = {
     'src/features/external-user-group/**',
     'src/features/page-bulk-export/**',
     'src/features/opentelemetry/**',
+    'src/stores-universal/**',
     'src/interfaces/**',
   ],
   settings: {

+ 246 - 81
apps/app/src/stores-universal/context.tsx

@@ -1,8 +1,8 @@
-import type EventEmitter from 'events';
+import type { ColorScheme, IUserHasId } from '@growi/core';
 
 import { AcceptedUploadFileType } from '@growi/core';
-import type { ColorScheme, IUserHasId } 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';
@@ -19,219 +19,359 @@ declare global {
 
 type Nullable<T> = T | null;
 
-
-export const useCsrfToken = (initialData?: string): SWRResponse<string, Error> => {
+export const useCsrfToken = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR<string, Error>('csrfToken', initialData);
 };
 
-export const useAppTitle = (initialData?: string): SWRResponse<string, Error> => {
+export const useAppTitle = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('appTitle', initialData);
 };
 
-export const useSiteUrl = (initialData?: string): SWRResponse<string, Error> => {
+export const useSiteUrl = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR<string, Error>('siteUrl', initialData);
 };
 
-export const useConfidential = (initialData?: string): SWRResponse<string, Error> => {
+export const useConfidential = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('confidential', initialData);
 };
 
-export const useCurrentUser = (initialData?: Nullable<IUserHasId>): SWRResponse<Nullable<IUserHasId>, Error> => {
+export const useCurrentUser = (
+  initialData?: Nullable<IUserHasId>,
+): SWRResponse<Nullable<IUserHasId>, Error> => {
   return useContextSWR('currentUser', initialData);
 };
 
-export const useCurrentPathname = (initialData?: string): SWRResponse<string, Error> => {
+export const useCurrentPathname = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('currentPathname', initialData);
 };
 
-export const useIsIdenticalPath = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isIdenticalPath', initialData, { fallbackData: false });
+export const useIsIdenticalPath = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('isIdenticalPath', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useIsForbidden = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isForbidden', initialData, { fallbackData: false });
+export const useIsForbidden = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('isForbidden', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useIsNotCreatable = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isNotCreatable', initialData, { fallbackData: false });
+export const useIsNotCreatable = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('isNotCreatable', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useIsSharedUser = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsSharedUser = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR<boolean, Error>('isSharedUser', initialData);
 };
 
-export const useShareLinkId = (initialData?: string): SWRResponse<string, Error> => {
+export const useShareLinkId = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('shareLinkId', initialData);
 };
 
-export const useDisableLinkSharing = (initialData?: Nullable<boolean>): SWRResponse<Nullable<boolean>, Error> => {
-  return useContextSWR<Nullable<boolean>, Error>('disableLinkSharing', initialData);
+export const useDisableLinkSharing = (
+  initialData?: Nullable<boolean>,
+): SWRResponse<Nullable<boolean>, Error> => {
+  return useContextSWR<Nullable<boolean>, Error>(
+    'disableLinkSharing',
+    initialData,
+  );
 };
 
-export const useRegistrationWhitelist = (initialData?: Nullable<string[]>): SWRResponse<Nullable<string[]>, Error> => {
-  return useContextSWR<Nullable<string[]>, Error>('registrationWhitelist', initialData);
+export const useRegistrationWhitelist = (
+  initialData?: Nullable<string[]>,
+): SWRResponse<Nullable<string[]>, Error> => {
+  return useContextSWR<Nullable<string[]>, Error>(
+    'registrationWhitelist',
+    initialData,
+  );
 };
 
-export const useIsSearchPage = (initialData?: Nullable<boolean>) : SWRResponse<Nullable<boolean>, Error> => {
+export const useIsSearchPage = (
+  initialData?: Nullable<boolean>,
+): SWRResponse<Nullable<boolean>, Error> => {
   return useContextSWR<Nullable<any>, Error>('isSearchPage', initialData);
 };
 
-export const useIsAclEnabled = (initialData?: boolean) : SWRResponse<boolean, Error> => {
+export const useIsAclEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR<boolean, Error>('isAclEnabled', initialData);
 };
 
-export const useIsSearchServiceConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isSearchServiceConfigured', initialData);
+export const useIsSearchServiceConfigured = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>(
+    'isSearchServiceConfigured',
+    initialData,
+  );
 };
 
-export const useIsSearchServiceReachable = (initialData?: boolean) : SWRResponse<boolean, Error> => {
+export const useIsSearchServiceReachable = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR<boolean, Error>('isSearchServiceReachable', initialData);
 };
 
-export const useElasticsearchMaxBodyLengthToIndex = (initialData?: number) : SWRResponse<number, Error> => {
+export const useElasticsearchMaxBodyLengthToIndex = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR('elasticsearchMaxBodyLengthToIndex', initialData);
 };
 
-export const useIsMailerSetup = (initialData?: boolean): SWRResponse<boolean, any> => {
+export const useIsMailerSetup = (
+  initialData?: boolean,
+): SWRResponse<boolean, any> => {
   return useContextSWR('isMailerSetup', initialData);
 };
 
-export const useIsSearchScopeChildrenAsDefault = (initialData?: boolean) : SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isSearchScopeChildrenAsDefault', initialData, { fallbackData: false });
+export const useIsSearchScopeChildrenAsDefault = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>(
+    'isSearchScopeChildrenAsDefault',
+    initialData,
+    { fallbackData: false },
+  );
 };
 
-export const useShowPageSideAuthors = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR('showPageSideAuthors', initialData, { fallbackData: false });
+export const useShowPageSideAuthors = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR('showPageSideAuthors', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useIsEnabledMarp = (initialData?: boolean) : SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isEnabledMarp', initialData, { fallbackData: false });
+export const useIsEnabledMarp = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('isEnabledMarp', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useIsSlackConfigured = (initialData?: boolean) : SWRResponse<boolean, Error> => {
+export const useIsSlackConfigured = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR<boolean, Error>('isSlackConfigured', initialData);
 };
 
-export const useIsEnabledAttachTitleHeader = (initialData?: boolean) : SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isEnabledAttachTitleHeader', initialData);
+export const useIsEnabledAttachTitleHeader = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>(
+    'isEnabledAttachTitleHeader',
+    initialData,
+  );
 };
 
-export const useIsIndentSizeForced = (initialData?: boolean) : SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('isIndentSizeForced', initialData, { fallbackData: false });
+export const useIsIndentSizeForced = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('isIndentSizeForced', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useDefaultIndentSize = (initialData?: number) : SWRResponse<number, Error> => {
-  return useContextSWR<number, Error>('defaultIndentSize', initialData, { fallbackData: 4 });
+export const useDefaultIndentSize = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
+  return useContextSWR<number, Error>('defaultIndentSize', initialData, {
+    fallbackData: 4,
+  });
 };
 
-export const useAuditLogEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useContextSWR<boolean, Error>('auditLogEnabled', initialData, { fallbackData: false });
+export const useAuditLogEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useContextSWR<boolean, Error>('auditLogEnabled', initialData, {
+    fallbackData: false,
+  });
 };
 
-export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse<number, Error> => {
+export const useActivityExpirationSeconds = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR<number, Error>('activityExpirationSeconds', initialData);
 };
 
-export const useAuditLogAvailableActions = (initialData?: Array<SupportedActionType>) : SWRResponse<Array<SupportedActionType>, Error> => {
-  return useContextSWR<Array<SupportedActionType>, Error>('auditLogAvailableActions', initialData);
+export const useAuditLogAvailableActions = (
+  initialData?: Array<SupportedActionType>,
+): SWRResponse<Array<SupportedActionType>, Error> => {
+  return useContextSWR<Array<SupportedActionType>, Error>(
+    'auditLogAvailableActions',
+    initialData,
+  );
 };
 
-export const useGrowiVersion = (initialData?: string): SWRResponse<string, any> => {
+export const useGrowiVersion = (
+  initialData?: string,
+): SWRResponse<string, any> => {
   return useContextSWR('growiVersion', initialData);
 };
 
-export const useIsEnabledStaleNotification = (initialData?: boolean): SWRResponse<boolean, any> => {
+export const useIsEnabledStaleNotification = (
+  initialData?: boolean,
+): SWRResponse<boolean, any> => {
   return useContextSWR('isEnabledStaleNotification', initialData);
 };
 
-export const useRendererConfig = (initialData?: RendererConfig): SWRResponse<RendererConfig, any> => {
+export const useRendererConfig = (
+  initialData?: RendererConfig,
+): SWRResponse<RendererConfig, any> => {
   return useContextSWR('growiRendererConfig', initialData);
 };
 
-export const useIsAllReplyShown = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsAllReplyShown = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isAllReplyShown', initialData);
 };
 
-export const useIsBlinkedHeaderAtBoot = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsBlinkedHeaderAtBoot = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isBlinkedAtBoot', initialData, { fallbackData: false });
 };
 
-export const useIsUploadEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsUploadEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isUploadEnabled', initialData);
 };
 
-export const useIsUploadAllFileAllowed = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsUploadAllFileAllowed = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isUploadAllFileAllowed', initialData);
 };
 
-export const useIsBulkExportPagesEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsBulkExportPagesEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isBulkExportPagesEnabled', initialData);
 };
 
-export const useIsPdfBulkExportEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsPdfBulkExportEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isPdfBulkExportEnabled', initialData);
 };
 
-export const useShowPageLimitationL = (initialData?: number): SWRResponse<number, Error> => {
+export const useShowPageLimitationL = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR('showPageLimitationL', initialData);
 };
 
-export const useShowPageLimitationXL = (initialData?: number): SWRResponse<number, Error> => {
+export const useShowPageLimitationXL = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR('showPageLimitationXL', initialData);
 };
 
-export const useCustomizeTitle = (initialData?: string): SWRResponse<string, Error> => {
+export const useCustomizeTitle = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('CustomizeTitle', initialData);
 };
 
-export const useIsDefaultLogo = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsDefaultLogo = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isDefaultLogo', initialData);
 };
 
-export const useIsCustomizedLogoUploaded = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsCustomizedLogoUploaded = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useSWRStatic('isCustomizedLogoUploaded', initialData);
 };
 
-export const useForcedColorScheme = (initialData?: ColorScheme): SWRResponse<ColorScheme, Error> => {
+export const useForcedColorScheme = (
+  initialData?: ColorScheme,
+): SWRResponse<ColorScheme, Error> => {
   return useContextSWR('forcedColorScheme', initialData);
 };
 
-export const useGrowiCloudUri = (initialData?: string): SWRResponse<string, Error> => {
+export const useGrowiCloudUri = (
+  initialData?: string,
+): SWRResponse<string, Error> => {
   return useContextSWR('growiCloudUri', initialData);
 };
 
-export const useGrowiAppIdForGrowiCloud = (initialData?: number): SWRResponse<number, Error> => {
+export const useGrowiAppIdForGrowiCloud = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR('growiAppIdForGrowiCloud', initialData);
 };
 
-export const useIsContainerFluid = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsContainerFluid = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isContainerFluid', initialData);
 };
 
-export const useIsLocalAccountRegistrationEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsLocalAccountRegistrationEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isLocalAccountRegistrationEnabled', initialData);
 };
 
-export const useIsRomUserAllowedToComment = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsRomUserAllowedToComment = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isRomUserAllowedToComment', initialData);
 };
 
-export const useIsAiEnabled = (initialData?: boolean): SWRResponse<boolean, Error> => {
+export const useIsAiEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
   return useContextSWR('isAiEnabled', initialData);
 };
 
-export const useLimitLearnablePageCountPerAssistant = (initialData?: number): SWRResponse<number, Error> => {
+export const useLimitLearnablePageCountPerAssistant = (
+  initialData?: number,
+): SWRResponse<number, Error> => {
   return useContextSWR('limitLearnablePageCountPerAssistant', initialData);
 };
 
-
-export const useIsUsersHomepageDeletionEnabled = (initialData?: boolean): SWRResponse<boolean, false> => {
+export const useIsUsersHomepageDeletionEnabled = (
+  initialData?: boolean,
+): SWRResponse<boolean, false> => {
   return useContextSWR('isUsersHomepageDeletionEnabled', initialData);
 };
 
-export const useIsEnableUnifiedMergeView = (initialData?: boolean): SWRResponse<boolean, Error> => {
-  return useSWRStatic<boolean, Error>('isEnableUnifiedMergeView', initialData, { fallbackData: false });
-
+export const useIsEnableUnifiedMergeView = (
+  initialData?: boolean,
+): SWRResponse<boolean, Error> => {
+  return useSWRStatic<boolean, Error>('isEnableUnifiedMergeView', initialData, {
+    fallbackData: false,
+  });
 };
 
 /** **********************************************************
@@ -249,7 +389,8 @@ export const useIsGuestUser = (): SWRResponse<boolean, Error> => {
 };
 
 export const useIsReadOnlyUser = (): SWRResponse<boolean, Error> => {
-  const { data: currentUser, isLoading: isCurrentUserLoading } = useCurrentUser();
+  const { data: currentUser, isLoading: isCurrentUserLoading } =
+    useCurrentUser();
   const { data: isGuestUser, isLoading: isGuestUserLoding } = useIsGuestUser();
 
   const isLoading = isCurrentUserLoading || isGuestUserLoding;
@@ -287,14 +428,37 @@ export const useIsEditable = (): SWRResponse<boolean, Error> => {
   const { data: isIdenticalPath } = useIsIdenticalPath();
 
   return useSWRImmutable(
-    ['isEditable', isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath],
-    ([, isGuestUser, isReadOnlyUser, isForbidden, isNotCreatable, isIdenticalPath]) => {
-      return (!isForbidden && !isIdenticalPath && !isNotCreatable && !isGuestUser && !isReadOnlyUser);
+    [
+      'isEditable',
+      isGuestUser,
+      isReadOnlyUser,
+      isForbidden,
+      isNotCreatable,
+      isIdenticalPath,
+    ],
+    ([
+      ,
+      isGuestUser,
+      isReadOnlyUser,
+      isForbidden,
+      isNotCreatable,
+      isIdenticalPath,
+    ]) => {
+      return (
+        !isForbidden &&
+        !isIdenticalPath &&
+        !isNotCreatable &&
+        !isGuestUser &&
+        !isReadOnlyUser
+      );
     },
   );
 };
 
-export const useAcceptedUploadFileType = (): SWRResponse<AcceptedUploadFileType, Error> => {
+export const useAcceptedUploadFileType = (): SWRResponse<
+  AcceptedUploadFileType,
+  Error
+> => {
   const { data: isUploadEnabled } = useIsUploadEnabled();
   const { data: isUploadAllFileAllowed } = useIsUploadAllFileAllowed();
 
@@ -319,9 +483,10 @@ export const useGrowiDocumentationUrl = () => {
   return useSWR(
     ['documentationUrl', growiCloudUri],
     ([, growiCloudUri]) => {
-      const url = growiCloudUri != null
-        ? new URL('/help', growiCloudUri)
-        : new URL('https://docs.growi.org');
+      const url =
+        growiCloudUri != null
+          ? new URL('/help', growiCloudUri)
+          : new URL('https://docs.growi.org');
       return url.toString();
     },
     {

+ 35 - 19
apps/app/src/stores-universal/ui.tsx

@@ -2,24 +2,24 @@
  *                          Unions
  *********************************************************** */
 
-import { useCallback } from 'react';
-
 import type { SWRResponseWithUtils } from '@growi/core/dist/swr';
 import { isServer } from '@growi/core/dist/utils';
+import { useCallback } from 'react';
 import useSWRImmutable from 'swr/immutable';
 
 import { useIsNotFound } from '~/stores/page';
 
 import { useIsEditable } from './context';
 
-
 export const EditorMode = {
   View: 'view',
   Editor: 'editor',
 } as const;
-export type EditorMode = typeof EditorMode[keyof typeof EditorMode];
+export type EditorMode = (typeof EditorMode)[keyof typeof EditorMode];
 
-const getClassNamesByEditorMode = (editorMode: EditorMode | undefined): string[] => {
+const getClassNamesByEditorMode = (
+  editorMode: EditorMode | undefined,
+): string[] => {
   const classNames: string[] = [];
   switch (editorMode) {
     case EditorMode.Editor:
@@ -34,17 +34,26 @@ export const EditorModeHash = {
   View: '',
   Edit: '#edit',
 } as const;
-export type EditorModeHash = typeof EditorModeHash[keyof typeof EditorModeHash];
+export type EditorModeHash =
+  (typeof EditorModeHash)[keyof typeof EditorModeHash];
 
 const updateHashByEditorMode = (newEditorMode: EditorMode) => {
   const { pathname, search } = window.location;
 
   switch (newEditorMode) {
     case EditorMode.View:
-      window.history.replaceState(null, '', `${pathname}${search}${EditorModeHash.View}`);
+      window.history.replaceState(
+        null,
+        '',
+        `${pathname}${search}${EditorModeHash.View}`,
+      );
       break;
     case EditorMode.Editor:
-      window.history.replaceState(null, '', `${pathname}${search}${EditorModeHash.Edit}`);
+      window.history.replaceState(
+        null,
+        '',
+        `${pathname}${search}${EditorModeHash.Edit}`,
+      );
       break;
   }
 };
@@ -65,10 +74,13 @@ export const determineEditorModeByHash = (): EditorMode => {
 };
 
 type EditorModeUtils = {
-  getClassNamesByEditorMode: () => string[],
-}
+  getClassNamesByEditorMode: () => string[];
+};
 
-export const useEditorMode = (): SWRResponseWithUtils<EditorModeUtils, EditorMode> => {
+export const useEditorMode = (): SWRResponseWithUtils<
+  EditorModeUtils,
+  EditorMode
+> => {
   const { data: _isEditable } = useIsEditable();
   const { data: isNotFound } = useIsNotFound();
 
@@ -76,7 +88,8 @@ export const useEditorMode = (): SWRResponseWithUtils<EditorModeUtils, EditorMod
 
   const isLoading = _isEditable === undefined;
   const isEditable = !isLoading && _isEditable;
-  const preventModeEditor = !isEditable || isNotFound === undefined || isNotFound === true;
+  const preventModeEditor =
+    !isEditable || isNotFound === undefined || isNotFound === true;
   const initialData = preventModeEditor ? EditorMode.View : editorModeByHash;
 
   const swrResponse = useSWRImmutable(
@@ -87,13 +100,16 @@ export const useEditorMode = (): SWRResponseWithUtils<EditorModeUtils, EditorMod
 
   // construct overriding mutate method
   const mutateOriginal = swrResponse.mutate;
-  const mutate = useCallback((editorMode: EditorMode, shouldRevalidate?: boolean) => {
-    if (preventModeEditor) {
-      return Promise.resolve(EditorMode.View); // fixed if not editable
-    }
-    updateHashByEditorMode(editorMode);
-    return mutateOriginal(editorMode, shouldRevalidate);
-  }, [preventModeEditor, mutateOriginal]);
+  const mutate = useCallback(
+    (editorMode: EditorMode, shouldRevalidate?: boolean) => {
+      if (preventModeEditor) {
+        return Promise.resolve(EditorMode.View); // fixed if not editable
+      }
+      updateHashByEditorMode(editorMode);
+      return mutateOriginal(editorMode, shouldRevalidate);
+    },
+    [preventModeEditor, mutateOriginal],
+  );
 
   const getClassNames = useCallback(() => {
     return getClassNamesByEditorMode(swrResponse.data);

+ 28 - 13
apps/app/src/stores-universal/use-context-swr.tsx

@@ -1,29 +1,44 @@
-import assert from 'assert';
-
 import { useSWRStatic } from '@growi/core/dist/swr';
-import type {
-  Key, SWRConfiguration, SWRResponse,
-} from 'swr';
-
+import assert from 'assert';
+import type { Key, SWRConfiguration, SWRResponse } from 'swr';
 
 export function useContextSWR<Data, Error>(key: Key): SWRResponse<Data, Error>;
-export function useContextSWR<Data, Error>(key: Key, data: Data | undefined): SWRResponse<Data, Error>;
-export function useContextSWR<Data, Error>(key: Key, data: Data | undefined,
-  configuration: SWRConfiguration<Data, Error> | undefined): SWRResponse<Data, Error>;
+export function useContextSWR<Data, Error>(
+  key: Key,
+  data: Data | undefined,
+): SWRResponse<Data, Error>;
+export function useContextSWR<Data, Error>(
+  key: Key,
+  data: Data | undefined,
+  configuration: SWRConfiguration<Data, Error> | undefined,
+): SWRResponse<Data, Error>;
 
 export function useContextSWR<Data, Error>(
-    ...args: readonly [Key]
+  ...args:
+    | readonly [Key]
     | readonly [Key, Data | undefined]
-    | readonly [Key, Data | undefined, SWRConfiguration<Data, Error> | undefined]
+    | readonly [
+        Key,
+        Data | undefined,
+        SWRConfiguration<Data, Error> | undefined,
+      ]
 ): SWRResponse<Data, Error> {
   const [key, data, configuration] = args;
 
-  assert.notStrictEqual(configuration?.fetcher, null, 'useContextSWR does not support \'configuration.fetcher\'');
+  assert.notStrictEqual(
+    configuration?.fetcher,
+    null,
+    "useContextSWR does not support 'configuration.fetcher'",
+  );
 
   const swrResponse = useSWRStatic(key, data, configuration);
 
   // overwrite mutate
-  const result = Object.assign(swrResponse, { mutate: () => { throw Error('mutate can not be used in context') } });
+  const result = Object.assign(swrResponse, {
+    mutate: () => {
+      throw Error('mutate can not be used in context');
+    },
+  });
 
   return result;
 }

+ 21 - 13
apps/app/src/stores-universal/use-next-themes.tsx

@@ -9,31 +9,37 @@ export const Themes = {
   ...ColorScheme,
   SYSTEM: 'system',
 } as const;
-export type Themes = typeof Themes[keyof typeof Themes];
-
+export type Themes = (typeof Themes)[keyof typeof Themes];
 
 const ATTRIBUTE = 'data-bs-theme';
 
 export const NextThemesProvider: React.FC<ThemeProviderProps> = (props) => {
   const { data: forcedColorScheme } = useForcedColorScheme();
 
-  return <ThemeProvider {...props} forcedTheme={forcedColorScheme} attribute={ATTRIBUTE} />;
+  return (
+    <ThemeProvider
+      {...props}
+      forcedTheme={forcedColorScheme}
+      attribute={ATTRIBUTE}
+    />
+  );
 };
 
-type UseThemeExtendedProps = Omit<UseThemeProps, 'theme'|'resolvedTheme'> & {
-  theme: Themes,
-  resolvedTheme: ColorScheme,
-  useOsSettings: boolean,
-  isDarkMode: boolean,
-  isForcedByGrowiTheme: boolean,
-  resolvedThemeByAttributes?: ColorScheme,
-}
+type UseThemeExtendedProps = Omit<UseThemeProps, 'theme' | 'resolvedTheme'> & {
+  theme: Themes;
+  resolvedTheme: ColorScheme;
+  useOsSettings: boolean;
+  isDarkMode: boolean;
+  isForcedByGrowiTheme: boolean;
+  resolvedThemeByAttributes?: ColorScheme;
+};
 
 export const useNextThemes = (): UseThemeProps & UseThemeExtendedProps => {
   const props = useTheme();
   const { data: forcedColorScheme } = useForcedColorScheme();
 
-  const resolvedTheme = forcedColorScheme ?? props.resolvedTheme as ColorScheme;
+  const resolvedTheme =
+    forcedColorScheme ?? (props.resolvedTheme as ColorScheme);
 
   return Object.assign(props, {
     theme: props.theme as Themes,
@@ -41,6 +47,8 @@ export const useNextThemes = (): UseThemeProps & UseThemeExtendedProps => {
     useOsSettings: props.theme === Themes.SYSTEM,
     isDarkMode: resolvedTheme === ColorScheme.DARK,
     isForcedByGrowiTheme: forcedColorScheme != null,
-    resolvedThemeByAttributes: isClient() ? document.documentElement.getAttribute(ATTRIBUTE) as ColorScheme : undefined,
+    resolvedThemeByAttributes: isClient()
+      ? (document.documentElement.getAttribute(ATTRIBUTE) as ColorScheme)
+      : undefined,
   });
 };

+ 0 - 1
biome.json

@@ -35,7 +35,6 @@
       "!apps/app/src/server/**",
       "!apps/app/src/services/**",
       "!apps/app/src/stores/**",
-      "!apps/app/src/stores-universal/**",
       "!apps/app/src/styles/**",
       "!apps/app/src/utils/**",
       "!apps/app/test/integration/service/**",