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

Merge pull request #7477 from weseek/master

Release v6.0.10
Yuki Takei 3 лет назад
Родитель
Сommit
cdc7539be8
36 измененных файлов с 155 добавлено и 81 удалено
  1. 1 1
      lerna.json
  2. 1 1
      package.json
  3. 11 11
      packages/app/package.json
  4. 1 1
      packages/app/public/static/locales/en_US/admin.json
  5. 1 1
      packages/app/public/static/locales/ja_JP/admin.json
  6. 1 1
      packages/app/public/static/locales/zh_CN/admin.json
  7. 4 4
      packages/app/src/components/Admin/Security/SecuritySetting.jsx
  8. 4 1
      packages/app/src/components/InstallerForm.tsx
  9. 3 4
      packages/app/src/components/Layout/MainPane.tsx
  10. 2 2
      packages/app/src/components/Page/PageView.tsx
  11. 1 1
      packages/app/src/components/PageContentFooter.tsx
  12. 57 8
      packages/app/src/components/ReactMarkdownComponents/CodeBlock.tsx
  13. 17 0
      packages/app/src/components/ReactMarkdownComponents/NextLink.tsx
  14. 2 2
      packages/app/src/components/SearchPage/SearchPageBase.tsx
  15. 1 1
      packages/app/src/components/Sidebar/Tag.tsx
  16. 0 1
      packages/app/src/interfaces/search.ts
  17. 1 1
      packages/app/src/pages/me/[[...path]].page.tsx
  18. 1 1
      packages/app/src/pages/tags.page.tsx
  19. 1 1
      packages/app/src/pages/trash.page.tsx
  20. 8 3
      packages/app/src/server/service/search-delegator/elasticsearch.ts
  21. 2 3
      packages/app/src/server/service/search.ts
  22. 2 9
      packages/app/src/styles/_layout.scss
  23. 5 0
      packages/app/src/styles/theme/_apply-colors-dark.scss
  24. 1 1
      packages/codemirror-textlint/package.json
  25. 1 1
      packages/core/package.json
  26. 1 1
      packages/core/src/interfaces/page.ts
  27. 1 1
      packages/hackmd/package.json
  28. 2 2
      packages/presentation/package.json
  29. 1 1
      packages/preset-themes/package.json
  30. 1 1
      packages/remark-drawio/package.json
  31. 1 1
      packages/remark-growi-directive/package.json
  32. 4 4
      packages/remark-lsx/package.json
  33. 10 5
      packages/remark-lsx/src/server/routes/lsx.js
  34. 1 1
      packages/slack/package.json
  35. 2 2
      packages/slackbot-proxy/package.json
  36. 2 2
      packages/ui/package.json

+ 1 - 1
lerna.json

@@ -1,7 +1,7 @@
 {
   "npmClient": "yarn",
   "useWorkspaces": true,
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "packages": [
     "packages/*"
   ]

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "growi",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "Team collaboration software using markdown",
   "tags": [
     "wiki",

+ 11 - 11
packages/app/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/app",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "license": "MIT",
   "scripts": {
     "//// for production": "",
@@ -66,14 +66,14 @@
     "@elastic/elasticsearch7": "npm:@elastic/elasticsearch@^7.17.0",
     "@godaddy/terminus": "^4.9.0",
     "@google-cloud/storage": "^5.8.5",
-    "@growi/codemirror-textlint": "^6.0.9",
-    "@growi/core": "^6.0.9",
-    "@growi/hackmd": "^6.0.9",
-    "@growi/preset-themes": "^6.0.9",
-    "@growi/remark-drawio": "^6.0.9",
-    "@growi/remark-growi-directive": "^6.0.9",
-    "@growi/remark-lsx": "^6.0.9",
-    "@growi/slack": "^6.0.9",
+    "@growi/codemirror-textlint": "^6.0.10-RC.0",
+    "@growi/core": "^6.0.10-RC.0",
+    "@growi/hackmd": "^6.0.10-RC.0",
+    "@growi/preset-themes": "^6.0.10-RC.0",
+    "@growi/remark-drawio": "^6.0.10-RC.0",
+    "@growi/remark-growi-directive": "^6.0.10-RC.0",
+    "@growi/remark-lsx": "^6.0.10-RC.0",
+    "@growi/slack": "^6.0.10-RC.0",
     "@promster/express": "^7.0.6",
     "@promster/server": "^7.0.8",
     "@slack/web-api": "^6.2.4",
@@ -205,8 +205,8 @@
     "handsontable": "v7.0.0 or above is no loger MIT lisence."
   },
   "devDependencies": {
-    "@growi/presentation": "^6.0.9",
-    "@growi/ui": "^6.0.9",
+    "@growi/presentation": "^6.0.10-RC.0",
+    "@growi/ui": "^6.0.10-RC.0",
     "@handsontable/react": "=2.1.0",
     "@icon/themify-icons": "1.0.1-alpha.3",
     "@next/bundle-analyzer": "^13.2.3",

+ 1 - 1
packages/app/public/static/locales/en_US/admin.json

@@ -16,7 +16,7 @@
     "Guest Users Access": "Guest users access",
     "always_hidden": "Always hidden",
     "always_displayed": "Always displayed",
-    "displayed_or_hidden": "Displayed / Hidden",
+    "displayed_or_hidden": "Hidden / Displayed",
     "Fixed by env var": "This is fixed by the env var <code>{{key}}={{value}}</code>.",
     "register_limitation": "Register limitation",
     "register_limitation_desc": "Restriction of new users' registration",

+ 1 - 1
packages/app/public/static/locales/ja_JP/admin.json

@@ -24,7 +24,7 @@
     "Guest Users Access":"ゲストユーザーのアクセス",
     "always_hidden": "非表示 (固定)",
     "always_displayed": "表示 (固定)",
-    "displayed_or_hidden": "表示 / 表示",
+    "displayed_or_hidden": "表示 / 表示",
     "Fixed by env var": "環境変数 <code>{{forcewikimode}}={{wikimode}}</code> により固定されています。",
     "register_limitation": "登録の制限",
     "register_limitation_desc": "新しいユーザーを登録する方法を制限します。",

+ 1 - 1
packages/app/public/static/locales/zh_CN/admin.json

@@ -23,7 +23,7 @@
     "set_point": "设定值",
     "always_displayed": "始终显示",
     "always_hidden": "总是隐藏",
-    "displayed_or_hidden": "显示/隐藏",
+    "displayed_or_hidden": "隐藏 / 显示",
     "Guest Users Access": "来宾用户访问",
 		"Fixed by env var": "这是由env var<code>%s=%s</code>修复的。",
 		"register_limitation": "注册限制",

+ 4 - 4
packages/app/src/components/Admin/Security/SecuritySetting.jsx

@@ -347,11 +347,11 @@ class SecuritySetting extends React.Component {
             <tbody>
               <tr>
                 <th scope="row">{ t('public') }</th>
-                <td>{ t('security_settings.always_displayed') }</td>
+                <td><i className="icon-fw icon-check text-success"></i>{ t('security_settings.always_displayed') }</td>
               </tr>
               <tr>
                 <th scope="row">{ t('anyone_with_the_link') }</th>
-                <td>{ t('security_settings.always_hidden') }</td>
+                <td><i className="icon-fw icon-ban text-danger"></i>{ t('security_settings.always_hidden') }</td>
               </tr>
               <tr>
                 <th scope="row">{ t('only_me') }</th>
@@ -361,7 +361,7 @@ class SecuritySetting extends React.Component {
                       type="checkbox"
                       className="custom-control-input"
                       id="isShowRestrictedByOwner"
-                      checked={adminGeneralSecurityContainer.state.isShowRestrictedByOwner}
+                      checked={!adminGeneralSecurityContainer.state.isShowRestrictedByOwner}
                       onChange={() => { adminGeneralSecurityContainer.switchIsShowRestrictedByOwner() }}
                     />
                     <label className="custom-control-label" htmlFor="isShowRestrictedByOwner">
@@ -378,7 +378,7 @@ class SecuritySetting extends React.Component {
                       type="checkbox"
                       className="custom-control-input"
                       id="isShowRestrictedByGroup"
-                      checked={adminGeneralSecurityContainer.state.isShowRestrictedByGroup}
+                      checked={!adminGeneralSecurityContainer.state.isShowRestrictedByGroup}
                       onChange={() => { adminGeneralSecurityContainer.switchIsShowRestrictedByGroup() }}
                     />
                     <label className="custom-control-label" htmlFor="isShowRestrictedByGroup">

+ 4 - 1
packages/app/src/components/InstallerForm.tsx

@@ -2,6 +2,7 @@ import {
   FormEventHandler, memo, useCallback, useState,
 } from 'react';
 
+import { Lang, AllLang } from '@growi/core';
 import { useTranslation } from 'next-i18next';
 import { useRouter } from 'next/router';
 
@@ -15,9 +16,11 @@ const InstallerForm = memo((): JSX.Element => {
 
   const router = useRouter();
 
+  const isSupportedLang = AllLang.includes(i18n.language as Lang);
+
   const [isValidUserName, setValidUserName] = useState(true);
   const [isSubmittingDisabled, setSubmittingDisabled] = useState(false);
-  const [currentLocale, setCurrentLocale] = useState('en_US');
+  const [currentLocale, setCurrentLocale] = useState(isSupportedLang ? i18n.language : Lang.en_US);
 
   const checkUserName = useCallback(async(event) => {
     const axios = require('axios').create({

+ 3 - 4
packages/app/src/components/Layout/MainPane.tsx

@@ -2,7 +2,6 @@ import { ReactNode } from 'react';
 
 
 type Props = {
-  className?: string,
   children?: ReactNode,
   sideContents?: ReactNode,
   footerContents?: ReactNode,
@@ -10,14 +9,14 @@ type Props = {
 
 export const MainPane = (props: Props): JSX.Element => {
   const {
-    className, children, sideContents, footerContents,
+    children, sideContents, footerContents,
   } = props;
 
   return (
     <>
       <div className="flex-grow-1">
-        <div id="main" className={`main ${className}`}>
-          <div id="content-main" className="content-main grw-container-convertible">
+        <div id="main" className="main">
+          <div id="content-main" className="content-main container-lg grw-container-convertible">
             { sideContents != null
               ? (
                 <div className="d-flex flex-column flex-column-reverse flex-lg-row">

+ 2 - 2
packages/app/src/components/Page/PageView.tsx

@@ -124,7 +124,7 @@ export const PageView = (props: Props): JSX.Element => {
         <div id="comments-container" ref={commentsContainerRef}>
           <Comments pageId={page._id} pagePath={pagePath} revision={page.revision} onLoaded={() => setCommentsLoaded(true)} />
         </div>
-        { isUsersHomePagePath && (
+        { (isUsersHomePagePath && page.creator != null) && (
           <UsersHomePageFooter creatorId={page.creator._id}/>
         ) }
         <PageContentFooter page={page} />
@@ -158,7 +158,7 @@ export const PageView = (props: Props): JSX.Element => {
       { specialContents }
       { specialContents == null && (
         <>
-          { isUsersHomePagePath && <UserInfo author={page?.creator} /> }
+          { (isUsersHomePagePath && page?.creator != null) && <UserInfo author={page.creator} /> }
           <div className={`mb-5 ${isMobile ? `page-mobile ${styles['page-mobile']}` : ''}`}>
             <Contents />
           </div>

+ 1 - 1
packages/app/src/components/PageContentFooter.tsx

@@ -23,7 +23,7 @@ export const PageContentFooter = (props: PageContentFooterProps): JSX.Element =>
 
   return (
     <div className={`${styles['page-content-footer']} page-content-footer py-4 d-edit-none d-print-none}`}>
-      <div className="grw-container-convertible">
+      <div className="container-lg grw-container-convertible">
         <div className="page-meta">
           <AuthorInfo user={creator as IUser} date={createdAt} mode="create" locate="footer" />
           <AuthorInfo user={lastUpdateUser as IUser} date={updatedAt} mode="update" locate="footer" />

+ 57 - 8
packages/app/src/components/ReactMarkdownComponents/CodeBlock.tsx

@@ -1,3 +1,5 @@
+import { ReactNode } from 'react';
+
 import type { CodeComponent } from 'react-markdown/lib/ast-to-react';
 import { PrismAsyncLight } from 'react-syntax-highlighter';
 import { oneDark } from 'react-syntax-highlighter/dist/cjs/styles/prism';
@@ -5,6 +7,60 @@ import { oneDark } from 'react-syntax-highlighter/dist/cjs/styles/prism';
 import styles from './CodeBlock.module.scss';
 
 
+function extractChildrenToIgnoreReactNode(children: ReactNode): ReactNode {
+
+  if (children == null) {
+    return children;
+  }
+
+  // Single element array
+  if (Array.isArray(children) && children.length === 1) {
+    return extractChildrenToIgnoreReactNode(children[0]);
+  }
+
+  // Multiple element array
+  if (Array.isArray(children) && children.length > 1) {
+    return children.map(node => extractChildrenToIgnoreReactNode(node)).join('');
+  }
+
+  // object
+  if (typeof children === 'object') {
+    const grandChildren = (children as any).children ?? (children as any).props.children;
+    return extractChildrenToIgnoreReactNode(grandChildren);
+  }
+
+  return String(children).replace(/\n$/, '');
+}
+
+function CodeBlockSubstance({ lang, children }: { lang: string, children: ReactNode }): JSX.Element {
+  // return alternative element
+  //   in order to fix "CodeBlock string is be [object Object] if searched"
+  // see: https://github.com/weseek/growi/pull/7484
+  //
+  // Note: You can also remove this code if the user requests to see the code highlighted in Prism as-is.
+  const isSimpleString = Array.isArray(children) && children.length === 1 && typeof children[0] === 'string';
+  if (!isSimpleString) {
+    return (
+      <div className="code-highlighted" style={oneDark['pre[class*="language-"]']}>
+        <code className={`language-${lang}`} style={oneDark['code[class*="language-"]']}>
+          {children}
+        </code>
+      </div>
+    );
+  }
+
+  return (
+    <PrismAsyncLight
+      className="code-highlighted"
+      PreTag="div"
+      style={oneDark}
+      language={lang}
+    >
+      {extractChildrenToIgnoreReactNode(children)}
+    </PrismAsyncLight>
+  );
+}
+
 export const CodeBlock: CodeComponent = ({ inline, className, children }) => {
 
   if (inline) {
@@ -22,14 +78,7 @@ export const CodeBlock: CodeComponent = ({ inline, className, children }) => {
       {name != null && (
         <cite className={`code-highlighted-title ${styles['code-highlighted-title']}`}>{name}</cite>
       )}
-      <PrismAsyncLight
-        className="code-highlighted"
-        PreTag="div"
-        style={oneDark}
-        language={lang}
-      >
-        {String(children).replace(/\n$/, '')}
-      </PrismAsyncLight>
+      <CodeBlockSubstance lang={lang}>{children}</CodeBlockSubstance>
     </>
   );
 };

+ 17 - 0
packages/app/src/components/ReactMarkdownComponents/NextLink.tsx

@@ -22,6 +22,10 @@ const isExternalLink = (href: string, siteUrl: string | undefined): boolean => {
   }
 };
 
+const isAttached = (href: string): boolean => {
+  return href.startsWith('/attachment/');
+};
+
 type Props = Omit<LinkProps, 'href'> & {
   children: React.ReactNode,
   href?: string,
@@ -59,6 +63,19 @@ export const NextLink = (props: Props): JSX.Element => {
     );
   }
 
+  // when href is an attachment file
+  if (isAttached(href)) {
+    const dlhref = href.replace('/attachment/', '/download/');
+    return (
+      <span>
+        <a href={href} className={className} target="_blank" rel="noopener noreferrer" {...dataAttributes}>
+          {children}
+        </a>&nbsp;
+        <a href={dlhref} className="attachment-download"><i className='icon-cloud-download'></i></a>
+      </span>
+    );
+  }
+
   return (
     <Link {...rest} href={href} prefetch={false} legacyBehavior>
       <a href={href} className={className} {...dataAttributes}>{children}</a>

+ 2 - 2
packages/app/src/components/SearchPage/SearchPageBase.tsx

@@ -127,7 +127,7 @@ const SearchPageBaseSubstance: ForwardRefRenderFunction<ISelectableAll & IReturn
 
   if (!isSearchServiceConfigured) {
     return (
-      <div className="grw-container-convertible">
+      <div className="container-lg grw-container-convertible">
         <div className="row mt-5">
           <div className="col text-muted">
             <h1>Search service is not configured in this system.</h1>
@@ -139,7 +139,7 @@ const SearchPageBaseSubstance: ForwardRefRenderFunction<ISelectableAll & IReturn
 
   if (!isSearchServiceReachable) {
     return (
-      <div className="grw-container-convertible">
+      <div className="container-lg grw-container-convertible">
         <div className="row mt-5">
           <div className="col text-muted">
             <h1>Search service occures errors. Please contact to administrators of this system.</h1>

+ 1 - 1
packages/app/src/components/Sidebar/Tag.tsx

@@ -44,7 +44,7 @@ const Tag: FC = () => {
 
   // todo: adjust design by XD
   return (
-    <div className="grw-container-convertible px-4 mb-5 pb-5" data-testid="grw-sidebar-content-tags">
+    <div className="grw-container-convertible container-lg px-4 mb-5 pb-5" data-testid="grw-sidebar-content-tags">
       <div className="grw-sidebar-content-header py-3 d-flex">
         <h3 className="mb-0">{t('Tags')}</h3>
         <SidebarHeaderReloadButton onClick={() => onReload()}/>

+ 0 - 1
packages/app/src/interfaces/search.ts

@@ -5,7 +5,6 @@ export type IPageSearchMeta = {
   elasticSearchResult?: {
     snippet?: string | null;
     highlightedPath?: string | null;
-    isHtmlInPath: boolean;
   };
 }
 

+ 1 - 1
packages/app/src/pages/me/[[...path]].page.tsx

@@ -116,7 +116,7 @@ const MePage: NextPageWithLayout<Props> = (props: Props) => {
         <div id="grw-fav-sticky-trigger" className="sticky-top"></div>
 
         <div id="main" className='main'>
-          <div id="content-main" className="content-main grw-container-convertible">
+          <div id="content-main" className="content-main container-lg grw-container-convertible">
             {targetPage.component}
           </div>
         </div>

+ 1 - 1
packages/app/src/pages/tags.page.tsx

@@ -74,7 +74,7 @@ const TagPage: NextPageWithLayout<CommonProps> = (props: Props) => {
         <title>{title}</title>
       </Head>
       <div className="dynamic-layout-root">
-        <div className="grw-container-convertible mb-5 pb-5" data-testid="tags-page">
+        <div className="grw-container-convertible container-lg mb-5 pb-5" data-testid="tags-page">
           <h2 className="my-3">{`${t('Tags')}(${totalCount})`}</h2>
           <div className="px-3 mb-5 text-center">
             <TagCloudBox tags={tagData} minSize={20} />

+ 1 - 1
packages/app/src/pages/trash.page.tsx

@@ -78,7 +78,7 @@ const TrashPage: NextPageWithLayout<CommonProps> = (props: Props) => {
           />
         </header>
 
-        <div className="content-main grw-container-convertible mb-5 pb-5">
+        <div className="content-main container-lg grw-container-convertible mb-5 pb-5">
           <TrashPageList />
         </div>
 

+ 8 - 3
packages/app/src/server/service/search-delegator/elasticsearch.ts

@@ -943,12 +943,17 @@ class ElasticsearchDelegator implements SearchDelegator<Data, ESTermsKey, ESQuer
 
   appendHighlight(query) {
     query.body.highlight = {
+      fragmenter: 'simple',
+      pre_tags: ["<em class='highlighted-keyword'>"],
+      post_tags: ['</em>'],
       fields: {
         '*': {
           fragment_size: 40,
-          fragmenter: 'simple',
-          pre_tags: ["<em class='highlighted-keyword'>"],
-          post_tags: ['</em>'],
+        },
+        'path.*': {
+          // No fragments are generated
+          // see: https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html#highlighting-settings
+          number_of_fragments: 0,
         },
       },
     };

+ 2 - 3
packages/app/src/server/service/search.ts

@@ -450,15 +450,14 @@ class SearchService implements SearchQueryParser, SearchResolver {
       const highlightData = data._highlight;
       if (highlightData != null) {
         const snippet = this.canShowSnippet(pageData, user, userGroups)
-          ? highlightData['body.en'] || highlightData['body.ja'] || highlightData['comments.en'] || highlightData['comments.ja']
+          // eslint-disable-next-line max-len
+          ? highlightData.body || highlightData['body.en'] || highlightData['body.ja'] || highlightData.comments || highlightData['comments.en'] || highlightData['comments.ja']
           : null;
         const pathMatch = highlightData['path.en'] || highlightData['path.ja'];
-        const isHtmlInPath = highlightData['path.en'] != null || highlightData['path.ja'] != null;
 
         elasticSearchResult = {
           snippet: snippet != null && typeof snippet[0] === 'string' ? filterXss.process(snippet) : null,
           highlightedPath: pathMatch != null && typeof pathMatch[0] === 'string' ? filterXss.process(pathMatch) : null,
-          isHtmlInPath,
         };
       }
 

+ 2 - 9
packages/app/src/styles/_layout.scss

@@ -1,12 +1,9 @@
 @use './variables' as var;
 @use './bootstrap/init' as bs;
 
-.dynamic-layout-root:not(.growi-layout-fluid) .grw-container-convertible {
-  @extend .container-lg;
-}
-
 .dynamic-layout-root.growi-layout-fluid .grw-container-convertible {
-  @extend .container-fluid;
+  width: 100%;
+  max-width: none;
 }
 
 .grw-bg-image-wrapper {
@@ -20,10 +17,6 @@
   }
 }
 
-body.not-found-page .grw-container-convertible {
-  @extend .container-lg;
-}
-
 .grw-modal-head {
   border-bottom: 1px solid transparent;
 }

+ 5 - 0
packages/app/src/styles/theme/_apply-colors-dark.scss

@@ -504,6 +504,11 @@
   /*
   * GROWI HandsontableModal
   */
+
+  .handsontable td {
+    color: black;
+  }
+
   .grw-hot-modal-navbar {
     background-color: var(--dark);
   }

+ 1 - 1
packages/codemirror-textlint/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/codemirror-textlint",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "license": "MIT",
   "main": "dist/index.js",
   "scripts": {

+ 1 - 1
packages/core/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/core",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "GROWI Core Libraries",
   "license": "MIT",
   "keywords": [

+ 1 - 1
packages/core/src/interfaces/page.ts

@@ -40,7 +40,7 @@ export type IPagePopulatedToList = Omit<IPageHasId, 'lastUpdateUser'> & {
 
 export type IPagePopulatedToShowRevision = Omit<IPageHasId, 'lastUpdateUser'|'creator'|'deleteUser'|'grantedGroup'|'revision'|'author'> & {
   lastUpdateUser: IUserHasId,
-  creator: IUserHasId,
+  creator: IUserHasId | null,
   deleteUser: IUserHasId,
   grantedGroup: IUserGroupHasId,
   revision: IRevisionHasId,

+ 1 - 1
packages/hackmd/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/hackmd",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "GROWI js and css files to use hackmd",
   "license": "MIT",
   "main": "dist/index.js",

+ 2 - 2
packages/presentation/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/presentation",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "GROWI plugin for presentation",
   "license": "MIT",
   "keywords": ["growi", "growi-plugin"],
@@ -15,7 +15,7 @@
     "test": ""
   },
   "dependencies": {
-    "@growi/core": "^6.0.9"
+    "@growi/core": "^6.0.10-RC.0"
   },
   "devDependencies": {
     "@marp-team/marp-core": "^3.4.2",

+ 1 - 1
packages/preset-themes/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@growi/preset-themes",
   "description": "GROWI preset themes",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "license": "MIT",
   "main": "dist/libs/index.js",
   "files": [

+ 1 - 1
packages/remark-drawio/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/remark-drawio",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "remark plugin to draw diagrams with draw.io (diagrams.net)",
   "license": "MIT",
   "keywords": [

+ 1 - 1
packages/remark-growi-directive/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/remark-growi-directive",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "remark plugin to support GROWI plugin (forked from remark-directive@2.0.1)",
   "license": "MIT",
   "keywords": [

+ 4 - 4
packages/remark-lsx/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/remark-lsx",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "GROWI plugin to list pages",
   "license": "MIT",
   "keywords": ["growi", "growi-plugin"],
@@ -20,9 +20,9 @@
     "test": ""
   },
   "dependencies": {
-    "@growi/core": "^6.0.9",
-    "@growi/remark-growi-directive": "^6.0.9",
-    "@growi/ui": "^6.0.9",
+    "@growi/core": "^6.0.10-RC.0",
+    "@growi/remark-growi-directive": "^6.0.10-RC.0",
+    "@growi/ui": "^6.0.10-RC.0",
     "swr": "^2.0.3"
   },
   "devDependencies": {

+ 10 - 5
packages/remark-lsx/src/server/routes/lsx.js

@@ -104,12 +104,17 @@ class Lsx {
     }
 
     let filterPath = '';
-    if (optionsFilter.charAt(0) === '^') {
-      // move '^' to the first of path
-      filterPath = new RegExp(`^${addTrailingSlash(pagePath)}${optionsFilter.slice(1, optionsFilter.length)}`);
+    try {
+      if (optionsFilter.charAt(0) === '^') {
+        // move '^' to the first of path
+        filterPath = new RegExp(`^${addTrailingSlash(pagePath)}${optionsFilter.slice(1, optionsFilter.length)}`);
+      }
+      else {
+        filterPath = new RegExp(`^${addTrailingSlash(pagePath)}.*${optionsFilter}`);
+      }
     }
-    else {
-      filterPath = new RegExp(`^${addTrailingSlash(pagePath)}.*${optionsFilter}`);
+    catch (err) {
+      throw createError(400, err);
     }
 
     if (isExceptFilter) {

+ 1 - 1
packages/slack/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/slack",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "license": "MIT",
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",

+ 2 - 2
packages/slackbot-proxy/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/slackbot-proxy",
-  "version": "6.0.9",
+  "version": "6.0.10-slackbot-proxy.0",
   "license": "MIT",
   "scripts": {
     "build": "yarn tsc && tsc-alias -p tsconfig.build.json",
@@ -26,7 +26,7 @@
   },
   "dependencies": {
     "@godaddy/terminus": "^4.9.0",
-    "@growi/slack": "^6.0.9",
+    "@growi/slack": "^6.0.10-RC.0",
     "@slack/oauth": "^2.0.1",
     "@slack/web-api": "^6.2.4",
     "@tsed/common": "^6.43.0",

+ 2 - 2
packages/ui/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@growi/ui",
-  "version": "6.0.9",
+  "version": "6.0.10-RC.0",
   "description": "GROWI UI Libraries",
   "license": "MIT",
   "keywords": ["growi"],
@@ -17,7 +17,7 @@
     "test": "jest --verbose"
   },
   "dependencies": {
-    "@growi/core": "^6.0.9"
+    "@growi/core": "^6.0.10-RC.0"
   },
   "devDependencies": {
     "eslint-plugin-regex": "^1.8.0",