├── .devcontainer ├── .gitignore ├── app │ └── initializeCommand.sh └── pdf-converter │ └── initializeCommand.sh ├── .serena └── .gitignore ├── apps ├── app │ ├── tmp │ │ ├── cache │ │ │ └── .keep │ │ ├── downloads │ │ │ └── .keep │ │ ├── imports │ │ │ └── .keep │ │ ├── plugins │ │ │ └── .keep │ │ ├── uploads │ │ │ └── .keep │ │ └── googlecache │ │ │ └── .keep │ ├── playwright │ │ ├── .auth │ │ │ └── .gitkeep │ │ ├── .gitignore │ │ ├── 23-editor │ │ │ └── assets │ │ │ │ └── example.txt │ │ ├── utils │ │ │ └── index.ts │ │ ├── auth.setup.ts │ │ └── .eslintrc.mjs │ ├── src │ │ ├── client │ │ │ ├── dev.js │ │ │ ├── components │ │ │ │ ├── Sidebar │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── PageTree │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── Custom │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── CustomSidebarSubstance.module.scss │ │ │ │ │ ├── SidebarNav │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── SkeletonItem.tsx │ │ │ │ │ │ └── SkeletonItem.module.scss │ │ │ │ │ ├── _variables.scss │ │ │ │ │ ├── PageTreeItem │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── RecentChanges │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ResizableArea │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── props.d.ts │ │ │ │ │ ├── SidebarHead │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── InAppNotification │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── PageCreateButton │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── Tag.module.scss │ │ │ │ ├── LoginForm │ │ │ │ │ └── index.ts │ │ │ │ ├── AuthorInfo │ │ │ │ │ └── index.ts │ │ │ │ ├── Maintenance │ │ │ │ │ └── index.ts │ │ │ │ ├── PageControls │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── user-list-popover.module.scss │ │ │ │ │ ├── SearchButton.module.scss │ │ │ │ │ └── SubscribeButton.module.scss │ │ │ │ ├── PageHeader │ │ │ │ │ ├── index.ts │ │ │ │ │ └── PageHeader.module.scss │ │ │ │ ├── TemplateModal │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── TemplateModal.module.scss │ │ │ │ ├── Common │ │ │ │ │ ├── CopyDropdown │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── DrawerToggler │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SubmittableInput │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── types.d.ts │ │ │ │ │ └── RendererErrorMessage.tsx │ │ │ │ ├── PagePathNavSticky │ │ │ │ │ ├── index.ts │ │ │ │ │ └── CollapsedParentsDropdown.module.scss │ │ │ │ ├── PageSideContents │ │ │ │ │ └── index.ts │ │ │ │ ├── PageAccessoriesModal │ │ │ │ │ ├── ShareLink │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── PageEditor │ │ │ │ │ ├── EditorNavbar │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── EditingUserList.module.scss │ │ │ │ │ │ └── EditorNavbar.module.scss │ │ │ │ │ ├── _page-editor-inheritance.scss │ │ │ │ │ ├── EditorNavbarBottom │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ConflictDiffModal.module.scss │ │ │ │ │ └── LinkEditPreview.module.scss │ │ │ │ ├── TreeItem │ │ │ │ │ ├── NewPageInput │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── NewPageInput.module.scss │ │ │ │ │ ├── _tree-item-variables.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ └── SimpleItemContent.module.scss │ │ │ │ ├── IdenticalPathPage.module.scss │ │ │ │ ├── PageList │ │ │ │ │ ├── PageList.module.scss │ │ │ │ │ └── PageListItemS.module.scss │ │ │ │ ├── PageTags │ │ │ │ │ └── index.ts │ │ │ │ ├── SearchPage │ │ │ │ │ ├── SortControl.module.scss │ │ │ │ │ ├── SearchControl.module.scss │ │ │ │ │ └── SearchResultContent.module.scss │ │ │ │ ├── ItemsTree │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ItemsTree.module.scss │ │ │ │ │ └── ItemsTreeContentSkeleton.module.scss │ │ │ │ ├── .eslintrc.js │ │ │ │ ├── Admin │ │ │ │ │ ├── UserGroupDetail │ │ │ │ │ │ └── UserGroupDetailPage.module.scss │ │ │ │ │ ├── Users │ │ │ │ │ │ ├── UserMenu.module.scss │ │ │ │ │ │ └── ExternalAccountTable.module.scss │ │ │ │ │ ├── Customize │ │ │ │ │ │ └── ThemeColorBox.module.scss │ │ │ │ │ ├── SlackIntegration │ │ │ │ │ │ └── slack-integration-util.ts │ │ │ │ │ ├── App │ │ │ │ │ │ └── MaskedInput.module.scss │ │ │ │ │ └── NotFoundPage.tsx │ │ │ │ ├── PageComment │ │ │ │ │ ├── CommentPreview.module.scss │ │ │ │ │ ├── ReplyComments.module.scss │ │ │ │ │ └── DeleteCommentModal.module.scss │ │ │ │ ├── PageHistory │ │ │ │ │ ├── PageRevisionTable.module.scss │ │ │ │ │ ├── Revision.module.scss │ │ │ │ │ └── RevisionDiff.module.scss │ │ │ │ ├── ExpandOrContractButton.module.scss │ │ │ │ ├── InAppNotification │ │ │ │ │ └── ModelNotification │ │ │ │ │ │ └── ModelNotification.module.scss │ │ │ │ ├── Skeleton.module.scss │ │ │ │ ├── PageCreateModal.module.scss │ │ │ │ ├── ReactMarkdownComponents │ │ │ │ │ └── RichAttachment.module.scss │ │ │ │ ├── PageAttachment │ │ │ │ │ └── DeleteAttachmentModal.module.scss │ │ │ │ ├── InstallerForm.module.scss │ │ │ │ ├── Me │ │ │ │ │ └── UISettings.module.scss │ │ │ │ ├── SystemVersion.module.scss │ │ │ │ ├── CompleteUserRegistrationForm.module.scss │ │ │ │ ├── Bookmarks │ │ │ │ │ └── BookmarkFolderMenu.module.scss │ │ │ │ ├── PageTimeline.module.scss │ │ │ │ ├── SearchPage.module.scss │ │ │ │ ├── Presentation │ │ │ │ │ ├── Slides.tsx │ │ │ │ │ └── Presentation.tsx │ │ │ │ └── CustomNavigation │ │ │ │ │ └── CustomNav.module.scss │ │ │ ├── services │ │ │ │ ├── upload-attachments │ │ │ │ │ └── index.ts │ │ │ │ ├── AdminSocketIoContainer.js │ │ │ │ ├── update-page │ │ │ │ │ ├── index.ts │ │ │ │ │ └── update-page.ts │ │ │ │ └── create-page │ │ │ │ │ ├── index.ts │ │ │ │ │ └── create-page.ts │ │ │ ├── interfaces │ │ │ │ ├── clearable.ts │ │ │ │ ├── focusable.ts │ │ │ │ ├── in-app-notification-openable.ts │ │ │ │ ├── notification.ts │ │ │ │ └── selectable-all.ts │ │ │ └── util │ │ │ │ └── t-with-opt.ts │ │ ├── interfaces │ │ │ ├── apiv3 │ │ │ │ └── index.ts │ │ │ ├── admin.ts │ │ │ ├── errors │ │ │ │ ├── v3-error.ts │ │ │ │ ├── login-error.ts │ │ │ │ ├── v5-conversion-error.ts │ │ │ │ ├── user-activation.ts │ │ │ │ ├── external-account-login-error.ts │ │ │ │ └── forgot-password.ts │ │ │ ├── template.ts │ │ │ ├── paging-result.ts │ │ │ ├── user-trigger-notification.ts │ │ │ ├── indeterminate-input-elm.ts │ │ │ ├── sidebar-config.ts │ │ │ ├── transfer-key.ts │ │ │ ├── theme.ts │ │ │ ├── ldap.ts │ │ │ ├── common.ts │ │ │ ├── page-tag-relation.ts │ │ │ ├── registration-mode.ts │ │ │ ├── user-ui-settings.ts │ │ │ ├── yjs.ts │ │ │ ├── customize.ts │ │ │ ├── external-auth-provider.ts │ │ │ ├── mongoose-utils.ts │ │ │ ├── named-query.ts │ │ │ ├── cdn.ts │ │ │ ├── page-listing-results.ts │ │ │ ├── access-token.ts │ │ │ └── share-link.ts │ │ ├── server │ │ │ ├── service │ │ │ │ ├── yjs │ │ │ │ │ └── index.ts │ │ │ │ ├── growi-info │ │ │ │ │ └── index.ts │ │ │ │ ├── socket-io │ │ │ │ │ ├── index.ts │ │ │ │ │ └── helper.ts │ │ │ │ ├── file-uploader │ │ │ │ │ └── utils │ │ │ │ │ │ └── index.ts │ │ │ │ ├── page-listing │ │ │ │ │ └── index.ts │ │ │ │ ├── config-manager │ │ │ │ │ └── index.ts │ │ │ │ ├── access-token │ │ │ │ │ └── index.ts │ │ │ │ ├── page │ │ │ │ │ └── consts.ts │ │ │ │ ├── search-delegator │ │ │ │ │ └── elasticsearch-client-delegator │ │ │ │ │ │ └── index.ts │ │ │ │ ├── interfaces │ │ │ │ │ ├── search.ts │ │ │ │ │ └── export.ts │ │ │ │ ├── s2s-messaging │ │ │ │ │ ├── handlable.ts │ │ │ │ │ └── redis.ts │ │ │ │ └── import │ │ │ │ │ └── import-settings.ts │ │ │ ├── routes │ │ │ │ ├── avoid-session-routes.js │ │ │ │ ├── attachment │ │ │ │ │ └── index.ts │ │ │ │ └── apiv3 │ │ │ │ │ ├── interfaces │ │ │ │ │ └── apiv3-response.ts │ │ │ │ │ └── user │ │ │ │ │ └── index.ts │ │ │ ├── middlewares │ │ │ │ ├── certify-shared-page-attachment │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── validate-referer │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── interfaces.ts │ │ │ │ ├── inject-currentuser-to-localvars.js │ │ │ │ ├── certify-brand-logo.ts │ │ │ │ ├── access-token-parser │ │ │ │ │ └── extract-bearer-token.ts │ │ │ │ └── auto-reconnect-to-s2s-msg-server.js │ │ │ ├── interfaces │ │ │ │ ├── slack-integration │ │ │ │ │ └── events.ts │ │ │ │ └── mongoose-utils.ts │ │ │ ├── util │ │ │ │ ├── express-validator │ │ │ │ │ └── validator.js │ │ │ │ ├── formUtil.js │ │ │ │ ├── createApiRouter.ts │ │ │ │ └── getToday.js │ │ │ ├── models │ │ │ │ ├── serializers │ │ │ │ │ └── index.ts │ │ │ │ ├── openapi │ │ │ │ │ └── object-id.ts │ │ │ │ ├── .eslintrc.js │ │ │ │ └── vo │ │ │ │ │ └── collection-progress.ts │ │ │ └── events │ │ │ │ ├── admin.js │ │ │ │ └── tag.js │ │ ├── features │ │ │ ├── plantuml │ │ │ │ ├── index.ts │ │ │ │ ├── services │ │ │ │ │ └── index.ts │ │ │ │ └── themes │ │ │ │ │ └── .eslintrc.js │ │ │ ├── rate-limiter │ │ │ │ ├── index.ts │ │ │ │ └── middleware │ │ │ │ │ └── index.ts │ │ │ ├── comment │ │ │ │ └── server │ │ │ │ │ ├── models │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── events │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── event-emitter.ts │ │ │ │ │ └── consts.ts │ │ │ ├── opentelemetry │ │ │ │ └── server │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── anonymization │ │ │ │ │ └── index.ts │ │ │ │ │ └── custom-resource-attributes │ │ │ │ │ └── index.ts │ │ │ ├── templates │ │ │ │ └── stores │ │ │ │ │ └── index.ts │ │ │ ├── growi-plugin │ │ │ │ ├── interfaces │ │ │ │ │ └── index.ts │ │ │ │ ├── server │ │ │ │ │ ├── models │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── services │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── growi-plugin │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── consts │ │ │ │ │ │ └── index.ts │ │ │ │ └── client │ │ │ │ │ └── components │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Admin │ │ │ │ │ ├── index.ts │ │ │ │ │ └── PluginsExtensionPageContents │ │ │ │ │ └── index.ts │ │ │ ├── openai │ │ │ │ ├── server │ │ │ │ │ ├── services │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── editor-assistant │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── normalize-data │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── normalize-thread-relation-expired-at │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── assistant │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── assistant-types.ts │ │ │ │ │ │ ├── client-delegator │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── is-ai-enabled.ts │ │ │ │ │ │ └── client.ts │ │ │ │ │ └── routes │ │ │ │ │ │ └── message │ │ │ │ │ │ └── index.ts │ │ │ │ ├── client │ │ │ │ │ ├── services │ │ │ │ │ │ ├── editor-assistant │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── thread.ts │ │ │ │ │ └── components │ │ │ │ │ │ └── AiAssistant │ │ │ │ │ │ ├── AiAssistantSidebar │ │ │ │ │ │ └── ThreadList.module.scss │ │ │ │ │ │ └── AiAssistantManagementModal │ │ │ │ │ │ └── AiAssistantManagementPageTreeSelection.module.scss │ │ │ │ ├── interfaces │ │ │ │ │ ├── vector-store.ts │ │ │ │ │ ├── ai.ts │ │ │ │ │ ├── message-error.ts │ │ │ │ │ └── selectable-page.ts │ │ │ │ └── utils │ │ │ │ │ ├── handle-if-successfully-parsed.ts │ │ │ │ │ └── remove-glob-path.ts │ │ │ ├── callout │ │ │ │ ├── components │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── services │ │ │ │ │ └── index.ts │ │ │ ├── mermaid │ │ │ │ ├── components │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── services │ │ │ │ │ └── index.ts │ │ │ └── search │ │ │ │ ├── utils │ │ │ │ └── ai.ts │ │ │ │ └── client │ │ │ │ └── interfaces │ │ │ │ └── downshift.ts │ │ ├── styles │ │ │ ├── molecules │ │ │ │ ├── toastr.scss │ │ │ │ └── duplicated-paths-table.scss │ │ │ ├── atoms │ │ │ │ ├── _tooltip.scss │ │ │ │ ├── mixins │ │ │ │ │ └── _code.scss │ │ │ │ └── _code.scss │ │ │ ├── _mirror_mode.scss │ │ │ ├── _override-simplebar.scss │ │ │ ├── mixins │ │ │ │ ├── _fluid-layout.scss │ │ │ │ └── _share-link.scss │ │ │ ├── _variables.scss │ │ │ ├── _share-link.scss │ │ │ ├── _installer.scss │ │ │ └── vendor.scss │ │ ├── components │ │ │ ├── PageView │ │ │ │ ├── PageAlerts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── ShareLinkPageView │ │ │ │ └── index.ts │ │ │ ├── Common │ │ │ │ ├── PagePathNavTitle │ │ │ │ │ ├── index.ts │ │ │ │ │ └── PagePathNavTitle.module.scss │ │ │ │ ├── PagePathHierarchicalLink │ │ │ │ │ ├── index.ts │ │ │ │ │ └── PagePathHierarchicalLink.module.scss │ │ │ │ └── PagePathNav │ │ │ │ │ ├── Separator.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Separator.tsx │ │ │ ├── Script │ │ │ │ └── DrawioViewerScript │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-viewer-min-js-url.ts │ │ │ ├── FontFamily │ │ │ │ └── types.d.ts │ │ │ ├── Navbar │ │ │ │ └── GroundGlassBar.module.scss │ │ │ └── Admin │ │ │ │ └── Common │ │ │ │ └── AdminNavigation.module.scss │ │ ├── services │ │ │ ├── general-xss-filter │ │ │ │ └── index.ts │ │ │ ├── layout │ │ │ │ └── use-editor-mode-class-name.ts │ │ │ └── renderer │ │ │ │ └── markdown-it │ │ │ │ └── PreProcessor │ │ │ │ └── EasyGrid.js │ │ ├── linter-checker │ │ │ └── .stylelintrc.json │ │ ├── utils │ │ │ ├── growi-version.ts │ │ │ ├── process-utils.ts │ │ │ ├── rand.ts │ │ │ ├── array-utils.ts │ │ │ ├── to-array-from-csv.ts │ │ │ ├── object-utils.ts │ │ │ ├── page-operation.ts │ │ │ ├── gravatar.ts │ │ │ └── swr-utils.ts │ │ ├── @types │ │ │ └── i18next.d.ts │ │ ├── stores │ │ │ ├── use-static-swr.ts │ │ │ ├── page-redirect.tsx │ │ │ ├── staff.tsx │ │ │ └── use-editing-clients.ts │ │ ├── models │ │ │ ├── admin │ │ │ │ └── import-mode.ts │ │ │ ├── cdn-resource.js │ │ │ └── vo │ │ │ │ └── external-account-login-error.ts │ │ └── pages │ │ │ └── login │ │ │ └── index.module.scss │ ├── config │ │ ├── ci │ │ │ ├── .env.local.for-ci │ │ │ ├── .env.local.for-auto-install-with-allowing-guest │ │ │ └── .env.local.for-auto-install │ │ └── logger │ │ │ └── config.prod.js │ ├── test-with-vite │ │ ├── setup │ │ │ └── jest-dom.ts │ │ ├── .eslintrc.cjs │ │ ├── package.json │ │ └── tsconfig.json │ ├── public │ │ ├── favicon.ico │ │ └── images │ │ │ ├── icons │ │ │ ├── vim.png │ │ │ ├── emacs.png │ │ │ ├── vscode.png │ │ │ ├── favicon │ │ │ │ └── apple-icon.png │ │ │ └── slack │ │ │ │ ├── slack-logo-background.svg │ │ │ │ └── slack-logo-dark-background.svg │ │ │ ├── file-not-found.png │ │ │ └── slack-integration │ │ │ ├── possible.png │ │ │ ├── impossible.png │ │ │ ├── click-add-to-slack.png │ │ │ ├── growi-bot-kun-icon.png │ │ │ ├── activate-public-dist.png │ │ │ ├── basicinfo-all-checked.png │ │ │ ├── growi-register-modal.png │ │ │ ├── growi-set-proxy-url.png │ │ │ ├── triangle-basic-gray.png │ │ │ ├── growi-register-sentence.png │ │ │ ├── slack-bot-install-to-workspace.png │ │ │ ├── slack-bot-install-your-app-complete.png │ │ │ ├── slack-bot-install-to-workspace-joined-bot.png │ │ │ ├── slack-bot-install-your-app-introduction.png │ │ │ ├── slack-bot-install-your-app-introduction-to-channel.png │ │ │ └── slack-bot-install-your-app-transition-destination.png │ ├── resource │ │ ├── locales │ │ │ ├── zh_CN │ │ │ │ ├── notifications │ │ │ │ │ ├── passwordResetSuccessful.ejs │ │ │ │ │ ├── pageEdit.ejs │ │ │ │ │ ├── pageLike.ejs │ │ │ │ │ ├── pageDelete.ejs │ │ │ │ │ ├── pageCreate.ejs │ │ │ │ │ ├── pageMove.ejs │ │ │ │ │ ├── comment.ejs │ │ │ │ │ ├── userActivation.ejs │ │ │ │ │ └── passwordReset.ejs │ │ │ │ └── admin │ │ │ │ │ ├── userResetPassword.ejs │ │ │ │ │ └── userInvitation.ejs │ │ │ ├── ko_KR │ │ │ │ ├── notifications │ │ │ │ │ ├── pageLike.ejs │ │ │ │ │ ├── pageDelete.ejs │ │ │ │ │ ├── pageEdit.ejs │ │ │ │ │ ├── pageCreate.ejs │ │ │ │ │ ├── passwordResetSuccessful.ejs │ │ │ │ │ ├── pageMove.ejs │ │ │ │ │ ├── comment.ejs │ │ │ │ │ ├── userActivation.ejs │ │ │ │ │ └── passwordReset.ejs │ │ │ │ └── admin │ │ │ │ │ ├── userResetPassword.ejs │ │ │ │ │ ├── userInvitation.ejs │ │ │ │ │ └── userWaitingActivation.ejs │ │ │ ├── ja_JP │ │ │ │ ├── notifications │ │ │ │ │ ├── pageCreate.ejs │ │ │ │ │ ├── pageDelete.ejs │ │ │ │ │ ├── pageEdit.ejs │ │ │ │ │ ├── pageLike.ejs │ │ │ │ │ ├── passwordResetSuccessful.ejs │ │ │ │ │ ├── pageMove.ejs │ │ │ │ │ ├── comment.ejs │ │ │ │ │ ├── userActivation.ejs │ │ │ │ │ └── passwordReset.ejs │ │ │ │ └── admin │ │ │ │ │ ├── userResetPassword.ejs │ │ │ │ │ ├── userInvitation.ejs │ │ │ │ │ └── userWaitingActivation.ejs │ │ │ ├── en_US │ │ │ │ ├── notifications │ │ │ │ │ ├── pageEdit.ejs │ │ │ │ │ ├── pageLike.ejs │ │ │ │ │ ├── pageDelete.ejs │ │ │ │ │ ├── pageCreate.ejs │ │ │ │ │ ├── pageMove.ejs │ │ │ │ │ ├── comment.ejs │ │ │ │ │ ├── passwordResetSuccessful.ejs │ │ │ │ │ ├── userActivation.ejs │ │ │ │ │ └── passwordReset.ejs │ │ │ │ └── admin │ │ │ │ │ ├── userResetPassword.ejs │ │ │ │ │ └── userInvitation.ejs │ │ │ └── fr_FR │ │ │ │ └── notifications │ │ │ │ ├── pageCreate.ejs │ │ │ │ ├── pageEdit.ejs │ │ │ │ ├── pageLike.ejs │ │ │ │ ├── pageDelete.ejs │ │ │ │ ├── pageMove.ejs │ │ │ │ ├── comment.ejs │ │ │ │ ├── passwordResetSuccessful.ejs │ │ │ │ └── userActivation.ejs │ │ └── fonts │ │ │ ├── PressStart2P-latin.woff2 │ │ │ ├── SourceHanCodeJP-Regular-subset-jis2.woff2 │ │ │ ├── SourceHanCodeJP-Regular-subset-main.woff2 │ │ │ └── MaterialSymbolsOutlined-opsz,wght,FILL@20..48,300,0..1.woff2 │ ├── .stylelintrc.json │ ├── test │ │ └── integration │ │ │ ├── tsconfig.json │ │ │ ├── global-teardown.js │ │ │ └── .eslintrc.js │ ├── docker │ │ └── Dockerfile.dockerignore │ ├── .gitignore │ ├── bin │ │ └── github-actions │ │ │ └── update-readme.sh │ ├── next-env.d.ts │ ├── nodemon.json │ ├── .env.test │ └── vite.styles-prebuilt.config.ts ├── pdf-converter │ ├── .eslintignore │ ├── .gitignore │ ├── .env │ ├── src │ │ ├── controllers │ │ │ └── index.ts │ │ └── bin │ │ │ └── index.ts │ ├── tsconfig.build.json │ ├── nodemon.json │ ├── vitest.config.ts │ └── docker │ │ └── docker-entrypoint.sh └── slackbot-proxy │ ├── .eslintignore │ ├── .dockerignore │ ├── .gitignore │ ├── .env │ ├── config │ └── ci │ │ └── .env.local.for-ci │ ├── src │ ├── views │ │ └── commons │ │ │ └── footer.ejs │ ├── public │ │ └── images │ │ │ ├── growi-bot.png │ │ │ └── add-to-slack.png │ ├── config │ │ ├── swagger │ │ │ ├── config.prod.ts │ │ │ └── config.dev.ts │ │ └── logger │ │ │ └── config.prod.ts │ ├── interfaces │ │ ├── growi-to-slack │ │ │ └── growi-req.ts │ │ └── slack-to-growi │ │ │ └── slack-oauth-req.ts │ └── repositories │ │ ├── order.ts │ │ └── relation.ts │ ├── .stylelintrc.json │ ├── docker │ └── Dockerfile.dockerignore │ ├── .env.development │ └── tsconfig.build.json ├── packages ├── core │ ├── .eslintignore │ ├── .gitignore │ ├── src │ │ ├── index.ts │ │ ├── interfaces │ │ │ ├── has-object-id.ts │ │ │ ├── locale.ts │ │ │ ├── tag.ts │ │ │ ├── color-scheme.ts │ │ │ ├── external-account.ts │ │ │ ├── vite.ts │ │ │ └── lang.ts │ │ ├── models │ │ │ ├── index.ts │ │ │ └── serializers │ │ │ │ └── index.ts │ │ ├── remark-plugins │ │ │ ├── index.ts │ │ │ └── interfaces │ │ │ │ └── option-parser.ts │ │ ├── swr │ │ │ ├── index.ts │ │ │ └── use-global-socket.ts │ │ ├── consts │ │ │ ├── index.ts │ │ │ ├── growi-plugin.ts │ │ │ └── accepted-upload-file-type.ts │ │ └── utils │ │ │ ├── env-utils.ts │ │ │ ├── page-path-utils │ │ │ └── is-top-page.ts │ │ │ ├── template-checker.ts │ │ │ └── browser-utils.ts │ ├── vitest.config.ts │ └── tsconfig.json ├── ui │ ├── .eslintignore │ ├── .gitignore │ ├── src │ │ ├── interfaces │ │ │ ├── index.ts │ │ │ ├── breakpoints.ts │ │ │ └── popper-data.ts │ │ ├── components │ │ │ ├── PagePath │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ └── utils │ │ │ └── index.ts │ ├── scss │ │ └── molecules │ │ │ └── _user-list-popover.scss │ └── tsconfig.json ├── editor │ ├── .eslintignore │ ├── src │ │ ├── vite-env.d.ts │ │ ├── client │ │ │ ├── services │ │ │ │ ├── index.ts │ │ │ │ └── use-codemirror-editor │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils │ │ │ │ │ └── focus.ts │ │ │ ├── components-internal │ │ │ │ ├── playground │ │ │ │ │ └── index.ts │ │ │ │ └── CodeMirrorEditor │ │ │ │ │ ├── Toolbar │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── TextFormatTools.module.scss │ │ │ │ │ └── Toolbar.module.scss │ │ │ │ │ └── index.ts │ │ │ ├── services-internal │ │ │ │ ├── link-util │ │ │ │ │ └── index.ts │ │ │ │ ├── paste-util │ │ │ │ │ └── index.ts │ │ │ │ ├── list-util │ │ │ │ │ └── index.ts │ │ │ │ ├── editor-theme │ │ │ │ │ └── .eslintrc.cjs │ │ │ │ ├── extensions │ │ │ │ │ └── index.ts │ │ │ │ ├── table │ │ │ │ │ └── index.ts │ │ │ │ ├── file-dropzone │ │ │ │ │ └── index.ts │ │ │ │ ├── unified-merge-view │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ └── components │ │ │ │ └── diff │ │ │ │ └── index.ts │ │ ├── interfaces │ │ │ ├── re-exports.ts │ │ │ ├── index.ts │ │ │ ├── delta.ts │ │ │ └── editing-client.ts │ │ ├── models │ │ │ └── index.ts │ │ ├── @types │ │ │ ├── emoji-mart.d.ts │ │ │ └── scss.d.ts │ │ ├── index.ts │ │ └── consts │ │ │ ├── index.ts │ │ │ ├── paste-mode.ts │ │ │ ├── global-code-mirror-editor-key.ts │ │ │ └── keymaps.ts │ ├── README.md │ └── .gitignore ├── pluginkit │ ├── .eslintignore │ ├── .gitignore │ ├── test │ │ └── fixtures │ │ │ └── example-package │ │ │ ├── template1 │ │ │ ├── index.js │ │ │ └── package.json │ │ │ ├── theme1 │ │ │ └── index.js │ │ │ ├── invalid-theme1 │ │ │ ├── index.js │ │ │ └── package.json │ │ │ ├── invalid-theme2 │ │ │ └── index.js │ │ │ └── invalid-template1 │ │ │ ├── index.js │ │ │ └── package.json │ ├── src │ │ ├── v4 │ │ │ ├── client │ │ │ │ ├── index.ts │ │ │ │ └── utils │ │ │ │ │ ├── index.ts │ │ │ │ │ └── growi-facade │ │ │ │ │ └── index.ts │ │ │ ├── server │ │ │ │ ├── index.ts │ │ │ │ └── utils │ │ │ │ │ ├── theme │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── common │ │ │ │ │ └── index.ts │ │ │ │ │ └── template │ │ │ │ │ └── index.ts │ │ │ ├── utils │ │ │ │ └── index.ts │ │ │ ├── interfaces │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ └── model │ │ │ └── index.ts │ └── tsconfig.json ├── slack │ ├── .eslintignore │ ├── .gitignore │ ├── src │ │ ├── models │ │ │ ├── index.ts │ │ │ └── errors.ts │ │ ├── index.ts │ │ ├── interfaces │ │ │ ├── growi-bot-event.ts │ │ │ ├── connection-status.ts │ │ │ ├── channel.ts │ │ │ ├── growi-command.ts │ │ │ ├── response-url.ts │ │ │ ├── growi-event-processor.ts │ │ │ ├── slackbot-types.ts │ │ │ └── respond-util.ts │ │ ├── middlewares │ │ │ └── index.ts │ │ ├── utils │ │ │ ├── payload-interaction-id-helpers.ts │ │ │ └── logger │ │ │ │ └── index.ts │ │ └── consts │ │ │ └── required-scopes.ts │ ├── vitest.config.ts │ └── tsconfig.json ├── custom-icons │ ├── .gitignore │ ├── .svgtofontrc │ ├── svg │ │ ├── header.svg │ │ └── format_quote.svg │ ├── turbo.json │ └── package.json ├── presentation │ ├── .eslintignore │ ├── .gitignore │ ├── src │ │ ├── services │ │ │ └── index.ts │ │ └── client │ │ │ ├── services │ │ │ └── sanitize-option.ts │ │ │ ├── index.ts │ │ │ └── consts │ │ │ └── index.ts │ ├── README.md │ └── tsconfig.json ├── preset-themes │ ├── .eslintignore │ ├── .gitignore │ ├── README.md │ ├── public │ │ └── images │ │ │ ├── island │ │ │ └── island.png │ │ │ ├── spring │ │ │ └── spring02.jpg │ │ │ └── blackboard │ │ │ └── blackboard.png │ ├── src │ │ └── index.ts │ ├── tsconfig.json │ └── .stylelintrc.json ├── remark-drawio │ ├── .eslintignore │ ├── .gitignore │ ├── README.md │ └── src │ │ ├── components │ │ └── DrawioViewer.module.scss │ │ ├── index.ts │ │ └── utils │ │ └── global.ts ├── remark-lsx │ ├── .eslintignore │ ├── .gitignore │ └── src │ │ ├── utils │ │ ├── index.ts │ │ ├── depth-utils.ts │ │ └── depth-utils.spec.ts │ │ ├── client │ │ ├── stores │ │ │ └── lsx │ │ │ │ └── index.ts │ │ ├── services │ │ │ └── renderer │ │ │ │ └── index.ts │ │ ├── components │ │ │ ├── index.ts │ │ │ └── LsxPageList │ │ │ │ └── LsxPage.module.scss │ │ └── index.ts │ │ ├── @types │ │ └── declaration.d.ts │ │ └── interfaces │ │ └── page-node.ts ├── preset-templates │ ├── .eslintignore │ ├── dist │ │ ├── minutes │ │ │ ├── ja_JP │ │ │ │ └── meta.json │ │ │ ├── zh_CN │ │ │ │ └── meta.json │ │ │ └── en_US │ │ │ │ └── meta.json │ │ ├── daily-report │ │ │ ├── ja_JP │ │ │ │ └── meta.json │ │ │ ├── zh_CN │ │ │ │ └── meta.json │ │ │ └── en_US │ │ │ │ └── meta.json │ │ ├── project-proposal │ │ │ ├── ja_JP │ │ │ │ ├── meta.json │ │ │ │ └── template.md │ │ │ ├── zh_CN │ │ │ │ ├── meta.json │ │ │ │ └── template.md │ │ │ └── en_US │ │ │ │ ├── meta.json │ │ │ │ └── template.md │ │ ├── marp-example │ │ │ ├── zh_CN │ │ │ │ └── meta.json │ │ │ ├── ja_JP │ │ │ │ └── meta.json │ │ │ └── en_US │ │ │ │ └── meta.json │ │ └── displaying-child-pages │ │ │ ├── zh_CN │ │ │ ├── meta.json │ │ │ └── template.md │ │ │ ├── ja_JP │ │ │ ├── meta.json │ │ │ └── template.md │ │ │ └── en_US │ │ │ ├── template.md │ │ │ └── meta.json │ ├── tsconfig.json │ └── vitest.config.ts ├── pdf-converter-client │ ├── .eslintignore │ ├── .gitignore │ ├── orval.config.js │ └── tsconfig.json ├── remark-attachment-refs │ ├── .eslintignore │ ├── .gitignore │ └── src │ │ ├── client │ │ ├── index.ts │ │ └── components │ │ │ └── index.ts │ │ ├── @types │ │ └── declaration.d.ts │ │ ├── utils │ │ └── logger │ │ │ └── index.ts │ │ └── server │ │ └── index.ts ├── remark-growi-directive │ ├── .eslintignore │ ├── .gitignore │ ├── test │ │ └── fixtures │ │ │ ├── text │ │ │ ├── input.md │ │ │ └── output.md │ │ │ └── leaf │ │ │ ├── output.md │ │ │ └── input.md │ ├── src │ │ ├── mdast-util-growi-directive │ │ │ └── index.js │ │ ├── micromark-extension-growi-directive │ │ │ └── index.js │ │ └── index.js │ ├── tsconfig.json │ ├── vitest.config.ts │ └── tsconfig.build.json └── core-styles │ └── scss │ ├── bootstrap │ ├── _init-stage-1.scss │ ├── override │ │ └── _badge.scss │ ├── utilities.scss │ ├── theming │ │ ├── _progress.scss │ │ ├── _tables.scss │ │ ├── _dropdown-dark.scss │ │ ├── _list-group.scss │ │ ├── apply-dark.scss │ │ ├── apply-light.scss │ │ ├── _dropdown-light.scss │ │ └── _pagination.scss │ ├── _init-stage-2.scss │ └── init.scss │ └── variables │ └── _growi-official-colors.scss ├── pnpm-workspace.yaml ├── .npmrc ├── .prettierrc ├── .github ├── git-pr-release-template.erb └── workflows │ └── cache-clear.yml ├── .swcrc ├── bin ├── data-migrations │ ├── src │ │ └── migrations │ │ │ ├── v61x │ │ │ ├── index.js │ │ │ └── mdcont.js │ │ │ ├── v60x │ │ │ ├── remark-growi-directive │ │ │ │ └── index.js │ │ │ ├── drawio.js │ │ │ ├── csv.js │ │ │ ├── tsv.js │ │ │ ├── index.js │ │ │ └── plantuml.js │ │ │ ├── v70x │ │ │ └── index.js │ │ │ └── custom.js │ └── tsconfig.json └── vitest.config.ts ├── vitest.workspace.mts ├── .editorconfig └── .markdownlint.yml /.devcontainer/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | -------------------------------------------------------------------------------- /.serena/.gitignore: -------------------------------------------------------------------------------- 1 | /cache 2 | -------------------------------------------------------------------------------- /apps/app/tmp/cache/.keep: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /apps/app/tmp/downloads/.keep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/app/tmp/imports/.keep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/app/tmp/plugins/.keep: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /apps/app/tmp/uploads/.keep: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/core/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/ui/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/ui/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /apps/app/playwright/.auth/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/app/tmp/googlecache/.keep: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /apps/pdf-converter/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/core/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/editor/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/pluginkit/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/slack/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/slack/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/custom-icons/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/pluginkit/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/presentation/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/presentation/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/preset-themes/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/preset-themes/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/remark-drawio/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/remark-drawio/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/remark-lsx/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/remark-lsx/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/preset-templates/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /apps/app/playwright/.gitignore: -------------------------------------------------------------------------------- 1 | .auth 2 | output 3 | -------------------------------------------------------------------------------- /apps/pdf-converter/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /specs 3 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /packages/pdf-converter-client/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/pdf-converter-client/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/.eslintignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /packages/preset-themes/README.md: -------------------------------------------------------------------------------- 1 | # GROWI Preset Themes 2 | -------------------------------------------------------------------------------- /apps/app/src/client/dev.js: -------------------------------------------------------------------------------- 1 | /** 2 | * dev tools 3 | */ 4 | -------------------------------------------------------------------------------- /apps/app/playwright/23-editor/assets/example.txt: -------------------------------------------------------------------------------- 1 | example.txt 2 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/apiv3/index.ts: -------------------------------------------------------------------------------- 1 | export * from './page'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/yjs/index.ts: -------------------------------------------------------------------------------- 1 | export * from './yjs'; 2 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /src/public/bootstrap 3 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/template1/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/theme1/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /coverage 3 | -------------------------------------------------------------------------------- /packages/slack/src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './errors'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/plantuml/index.ts: -------------------------------------------------------------------------------- 1 | export * from './services'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/server/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './template'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/invalid-theme1/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/invalid-theme2/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './depth-utils'; 2 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'apps/*' 3 | - 'packages/*' 4 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Sidebar'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/rate-limiter/index.ts: -------------------------------------------------------------------------------- 1 | export * from './middleware'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './template'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/invalid-template1/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/client/stores/lsx/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lsx'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/LoginForm/index.ts: -------------------------------------------------------------------------------- 1 | export * from './LoginForm'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/comment/server/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './comment'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/opentelemetry/server/index.ts: -------------------------------------------------------------------------------- 1 | export * from './node-sdk'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/templates/stores/index.ts: -------------------------------------------------------------------------------- 1 | export * from './template'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/growi-info/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-info'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/socket-io/index.ts: -------------------------------------------------------------------------------- 1 | export * from './socket-io'; 2 | -------------------------------------------------------------------------------- /apps/app/src/styles/molecules/toastr.scss: -------------------------------------------------------------------------------- 1 | @import '~react-toastify/scss/main'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/client/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-facade'; 2 | -------------------------------------------------------------------------------- /apps/app/config/ci/.env.local.for-ci: -------------------------------------------------------------------------------- 1 | FORMAT_NODE_LOG=true 2 | FILE_UPLOAD=mongodb 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/AuthorInfo/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AuthorInfo'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Maintenance/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Maintenance'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageControls/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageControls'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageHeader/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageHeader'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/PageTree/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageTree'; 2 | -------------------------------------------------------------------------------- /apps/app/src/components/PageView/PageAlerts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageAlerts'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/rate-limiter/middleware/index.ts: -------------------------------------------------------------------------------- 1 | export * from './factory'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/file-uploader/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './headers'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/page-listing/index.ts: -------------------------------------------------------------------------------- 1 | export * from './page-listing'; 2 | -------------------------------------------------------------------------------- /apps/app/src/styles/atoms/_tooltip.scss: -------------------------------------------------------------------------------- 1 | .tooltip { 2 | pointer-events: none; 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/test-with-vite/setup/jest-dom.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom/vitest'; 2 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/minutes/ja_JP/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "議事録" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/minutes/zh_CN/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "会议记录" 3 | } 4 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/client/services/renderer/index.ts: -------------------------------------------------------------------------------- 1 | export * from './lsx'; 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # see: https://pnpm.io/next/npmrc#force-legacy-deploy 2 | force-legacy-deploy=true 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/Custom/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './CustomSidebar'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/SidebarNav/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SidebarNav'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/_variables.scss: -------------------------------------------------------------------------------- 1 | $grw-sidebar-button-height: 50px; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TemplateModal/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './TemplateModal'; 2 | -------------------------------------------------------------------------------- /apps/app/src/components/ShareLinkPageView/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ShareLinkPageView'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-plugin'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/server/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-plugin'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './is-ai-enabled'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/avoid-session-routes.js: -------------------------------------------------------------------------------- 1 | module.exports = [/^\/api-docs\//]; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/config-manager/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config-manager'; 2 | -------------------------------------------------------------------------------- /apps/app/src/services/general-xss-filter/index.ts: -------------------------------------------------------------------------------- 1 | export * from './general-xss-filter'; 2 | -------------------------------------------------------------------------------- /apps/app/src/styles/_mirror_mode.scss: -------------------------------------------------------------------------------- 1 | body.mirror { 2 | transform: scale(-1, 1); 3 | } 4 | -------------------------------------------------------------------------------- /packages/core/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './consts'; 2 | export * from './interfaces'; 3 | -------------------------------------------------------------------------------- /packages/editor/src/client/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-codemirror-editor'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './model'; 2 | export * from './v4/client'; 3 | -------------------------------------------------------------------------------- /packages/presentation/src/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-slides-by-frontmatter'; 2 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/daily-report/ja_JP/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "日報" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/minutes/en_US/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Minutes" 3 | } 4 | -------------------------------------------------------------------------------- /packages/slack/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './consts'; 2 | export * from './interfaces'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Common/CopyDropdown/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CopyDropdown'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Common/DrawerToggler/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DrawerToggler'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PagePathNavSticky/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PagePathNavSticky'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageSideContents/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageSideContents'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/PageTreeItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageTreeItem'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/RecentChanges/index.ts: -------------------------------------------------------------------------------- 1 | export * from './RecentChanges'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/ResizableArea/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ResizableArea'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/SidebarHead/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SidebarHead'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/services/upload-attachments/index.ts: -------------------------------------------------------------------------------- 1 | export * from './upload-attachments'; 2 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathNavTitle/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PagePathNavTitle'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/server/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-plugin'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/plantuml/services/index.ts: -------------------------------------------------------------------------------- 1 | export { remarkPlugin } from './plantuml'; 2 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.env: -------------------------------------------------------------------------------- 1 | SLACK_INSTALLPROVIDER_STATE_SECRET=change-it 2 | OFFICIAL_MODE=false 3 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/_init-stage-1.scss: -------------------------------------------------------------------------------- 1 | @import 'bootstrap/scss/functions'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/interfaces/re-exports.ts: -------------------------------------------------------------------------------- 1 | export { EditorView } from '@codemirror/view'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/client/utils/growi-facade/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-react'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces'; 2 | export * from './utils'; 3 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/daily-report/zh_CN/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "每日工作报告" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/ja_JP/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "企画書" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/zh_CN/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "策划书" 3 | } 4 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/client/components/index.ts: -------------------------------------------------------------------------------- 1 | export { Lsx, LsxImmutable } from './Lsx'; 2 | -------------------------------------------------------------------------------- /apps/app/playwright/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CollapseSidebar'; 2 | export * from './Login'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageAccessoriesModal/ShareLink/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ShareLink'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/EditorNavbar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './EditorNavbar'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TreeItem/NewPageInput/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-new-page-input'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TreeItem/_tree-item-variables.scss: -------------------------------------------------------------------------------- 1 | $btn-triangle-min-width: 35px; 2 | -------------------------------------------------------------------------------- /apps/app/src/components/Script/DrawioViewerScript/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DrawioViewerScript'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/callout/components/index.ts: -------------------------------------------------------------------------------- 1 | export { CalloutViewer } from './CalloutViewer'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/mermaid/components/index.ts: -------------------------------------------------------------------------------- 1 | export { MermaidViewer } from './MermaidViewer'; 2 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/has-object-id.ts: -------------------------------------------------------------------------------- 1 | export type HasObjectId = { 2 | _id: string; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/editor/src/client/components-internal/playground/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Playground'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './linker'; 2 | export * from './markdown-table'; 3 | -------------------------------------------------------------------------------- /packages/presentation/README.md: -------------------------------------------------------------------------------- 1 | # presentation 2 | 3 | [GROWI][growi] sub-package for presentation 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/daily-report/en_US/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Daily Report" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/marp-example/zh_CN/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "使用 Marp 的演示示例" 3 | } 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 160, 3 | "singleQuote": true, 4 | "trailingComma": "all" 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/config/ci/.env.local.for-auto-install-with-allowing-guest: -------------------------------------------------------------------------------- 1 | AUTO_INSTALL_ALLOW_GUEST_MODE=true 2 | -------------------------------------------------------------------------------- /apps/app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/favicon.ico -------------------------------------------------------------------------------- /apps/app/src/client/components/IdenticalPathPage.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/ui/scss/molecules/page_list'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageAccessoriesModal/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageAccessoriesModal'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/_page-editor-inheritance.scss: -------------------------------------------------------------------------------- 1 | $navbar-editor-height: 37.8px; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageList/PageList.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/ui/scss/molecules/page_list'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/InAppNotification/index.ts: -------------------------------------------------------------------------------- 1 | export * from './InAppNotification'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/PageCreateButton/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageCreateButton'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/interfaces/clearable.ts: -------------------------------------------------------------------------------- 1 | export interface IClearable { 2 | clear: () => void, 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/client/interfaces/focusable.ts: -------------------------------------------------------------------------------- 1 | export interface IFocusable { 2 | focus: () => void, 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/components/PageView/index.ts: -------------------------------------------------------------------------------- 1 | // Do not re-export in this directory for performance reasons 2 | -------------------------------------------------------------------------------- /apps/app/src/features/callout/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './services'; 3 | -------------------------------------------------------------------------------- /apps/app/src/features/comment/server/index.ts: -------------------------------------------------------------------------------- 1 | export * from './events'; 2 | export * from './models'; 3 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/client/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './GrowiPluginsActivator'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/server/services/growi-plugin/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-plugin'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/mermaid/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './services'; 3 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/override/_badge.scss: -------------------------------------------------------------------------------- 1 | .badge { 2 | @extend .rounded-pill; 3 | } 4 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/link-util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './markdown-link-util'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/paste-util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './paste-markdown-util'; 2 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/server/utils/theme/index.ts: -------------------------------------------------------------------------------- 1 | export * from './validate-growi-plugin-directive'; 2 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/zh_CN/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "显示所有的子页面" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/marp-example/ja_JP/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Marpを使ったプレゼンテーションの例" 3 | } 4 | -------------------------------------------------------------------------------- /packages/ui/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './breakpoints'; 2 | export * from './popper-data'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/EditorNavbarBottom/index.ts: -------------------------------------------------------------------------------- 1 | export * from './EditorNavbarBottom'; 2 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageTags/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageTags'; 2 | export * from './TagsInput'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/services/AdminSocketIoContainer.js: -------------------------------------------------------------------------------- 1 | 2 | export default class AdminSocketIoContainer {} 3 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathHierarchicalLink/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PagePathHierarchicalLink'; 2 | -------------------------------------------------------------------------------- /apps/app/src/components/FontFamily/types.d.ts: -------------------------------------------------------------------------------- 1 | export type DefineStyle = () => JSX.IntrinsicElements.style; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/callout/services/index.ts: -------------------------------------------------------------------------------- 1 | export { remarkPlugin, sanitizeOption } from './callout'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/mermaid/services/index.ts: -------------------------------------------------------------------------------- 1 | export { remarkPlugin, sanitizeOption } from './mermaid'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/opentelemetry/server/anonymization/index.ts: -------------------------------------------------------------------------------- 1 | export * from './anonymize-http-requests'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/service/access-token/index.ts: -------------------------------------------------------------------------------- 1 | export { startCron } from './access-token-deletion-cron'; 2 | -------------------------------------------------------------------------------- /apps/app/test-with-vite/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['plugin:vitest/recommended'], 3 | }; 4 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/locale.ts: -------------------------------------------------------------------------------- 1 | export type Locale = 'en-US' | 'ja-JP' | 'zh-CN' | 'fr-FR' | 'ko-KR'; 2 | -------------------------------------------------------------------------------- /packages/core/src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './devided-page-path'; 2 | export * from './vo/error-apiv3'; 3 | -------------------------------------------------------------------------------- /packages/editor/src/client/components-internal/CodeMirrorEditor/Toolbar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Toolbar'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/client/components-internal/CodeMirrorEditor/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CodeMirrorEditor'; 2 | -------------------------------------------------------------------------------- /packages/editor/src/client/services/use-codemirror-editor/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-codemirror-editor'; 2 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/ja_JP/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "関連ページの一覧表示" 3 | } 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/en_US/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Project Proposal" 3 | } 4 | -------------------------------------------------------------------------------- /.github/git-pr-release-template.erb: -------------------------------------------------------------------------------- 1 | <%= ENV['GIT_PR_RELEASE_TITLE'] %> 2 | 3 | <%= ENV['GIT_PR_RELEASE_BODY'] %> 4 | -------------------------------------------------------------------------------- /apps/app/src/client/components/SearchPage/SortControl.module.scss: -------------------------------------------------------------------------------- 1 | .sort-control { 2 | min-width: 180px; 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/client/services/editor-assistant/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-editor-assistant'; 2 | -------------------------------------------------------------------------------- /apps/app/src/styles/_override-simplebar.scss: -------------------------------------------------------------------------------- 1 | .simplebar-scrollbar::before { 2 | background-color: #666; 3 | } 4 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/tag.ts: -------------------------------------------------------------------------------- 1 | export type ITag = { 2 | _id: ID; 3 | name: string; 4 | }; 5 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/list-util/index.ts: -------------------------------------------------------------------------------- 1 | export * from './insert-newline-continue-markup'; 2 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/zh_CN/template.md: -------------------------------------------------------------------------------- 1 | # 关联页面 2 | 3 | ## 子页面一览 4 | $lsx(depth=1) 5 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './services/renderer'; 3 | -------------------------------------------------------------------------------- /packages/ui/src/components/PagePath/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PageListMeta'; 2 | export * from './PagePathLabel'; 3 | -------------------------------------------------------------------------------- /apps/app/public/images/icons/vim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/icons/vim.png -------------------------------------------------------------------------------- /apps/app/src/client/services/update-page/index.ts: -------------------------------------------------------------------------------- 1 | export * from './conflict'; 2 | export * from './use-update-page'; 3 | -------------------------------------------------------------------------------- /apps/app/src/features/comment/server/events/index.ts: -------------------------------------------------------------------------------- 1 | export * from './consts'; 2 | export * from './event-emitter'; 3 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/client/components/Admin/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PluginsExtensionPageContents'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/editor-assistant/index.ts: -------------------------------------------------------------------------------- 1 | export * from './llm-response-stream-processor'; 2 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/admin.ts: -------------------------------------------------------------------------------- 1 | export interface updateConfigMethodForAdmin { 2 | update: (arg: T) => void; 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/styles/mixins/_fluid-layout.scss: -------------------------------------------------------------------------------- 1 | @mixin fluid-layout() { 2 | width: 100%; 3 | max-width: none; 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/test-with-vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schame": "http://json-schema.org/schema", 3 | "type": "module" 4 | } 5 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/ja_JP/template.md: -------------------------------------------------------------------------------- 1 | # 関連ページ 2 | 3 | ## 子ページ一覧 4 | $lsx(depth=1) 5 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/marp-example/en_US/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Presentation examples with Marp" 3 | } 4 | -------------------------------------------------------------------------------- /.swcrc: -------------------------------------------------------------------------------- 1 | { 2 | "jsc": { 3 | "parser": { 4 | "syntax": "typescript", 5 | "tsx": true 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/public/images/icons/emacs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/icons/emacs.png -------------------------------------------------------------------------------- /apps/app/src/client/components/ItemsTree/index.ts: -------------------------------------------------------------------------------- 1 | export { ItemNode } from './ItemNode'; 2 | export * from './ItemsTree'; 3 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/normalize-data/index.ts: -------------------------------------------------------------------------------- 1 | export * from './normalize-thread-relation-expired-at'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/certify-shared-page-attachment/index.ts: -------------------------------------------------------------------------------- 1 | export * from './certify-shared-page-attachment'; 2 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/certify-shared-page-attachment/validate-referer/index.ts: -------------------------------------------------------------------------------- 1 | export * from './validate-referer'; 2 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v61x/index.js: -------------------------------------------------------------------------------- 1 | const mdcont = require('./mdcont'); 2 | 3 | module.exports = [...mdcont]; 4 | -------------------------------------------------------------------------------- /packages/presentation/src/client/services/sanitize-option.ts: -------------------------------------------------------------------------------- 1 | export { sanitizeOption } from './renderer/extract-sections'; 2 | -------------------------------------------------------------------------------- /apps/app/public/images/file-not-found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/file-not-found.png -------------------------------------------------------------------------------- /apps/app/public/images/icons/vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/icons/vscode.png -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/index.ts: -------------------------------------------------------------------------------- 1 | import { PageEditor } from './PageEditor'; 2 | 3 | export default PageEditor; 4 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/routes/message/index.ts: -------------------------------------------------------------------------------- 1 | export * from './get-messages'; 2 | export * from './post-message'; 3 | -------------------------------------------------------------------------------- /apps/app/src/server/interfaces/slack-integration/events.ts: -------------------------------------------------------------------------------- 1 | export type EventActionsPermission = Map; 2 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/remark-growi-directive/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./remark-growi-directive'); 2 | -------------------------------------------------------------------------------- /packages/core/src/models/serializers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './attachment-serializer'; 2 | export * from './user-serializer'; 3 | -------------------------------------------------------------------------------- /packages/core/src/remark-plugins/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces/option-parser'; 2 | export * from './util/option-parser'; 3 | -------------------------------------------------------------------------------- /packages/editor/src/client/components/diff/index.ts: -------------------------------------------------------------------------------- 1 | export * from './CodeMirrorEditorDiff'; 2 | export * from './MergeViewer'; 3 | -------------------------------------------------------------------------------- /packages/presentation/src/client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components/Presentation'; 2 | export * from './components/Slides'; 3 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/en_US/template.md: -------------------------------------------------------------------------------- 1 | # RELATED PAGES 2 | 3 | ## CHILD PAGES 4 | $lsx(depth=1) 5 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/src/client/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components'; 2 | export * from './services/renderer/refs'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: '../../../.eslintrc.js', 3 | rules: { 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/UserGroupDetail/UserGroupDetailPage.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/ui/scss/molecules/page_list'; 2 | 3 | -------------------------------------------------------------------------------- /apps/app/src/client/services/create-page/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-create-page'; 2 | export * from './use-create-template-page'; 3 | -------------------------------------------------------------------------------- /apps/app/src/server/service/page/consts.ts: -------------------------------------------------------------------------------- 1 | export const BULK_REINDEX_SIZE = 100; 2 | export const LIMIT_FOR_MULTIPLE_PAGE_OP = 20; 3 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/config/ci/.env.local.for-ci: -------------------------------------------------------------------------------- 1 | SLACK_CLIENT_ID=dummy 2 | SLACK_CLIENT_SECRET=dummy 3 | SLACK_SIGNING_SECRET=dummy 4 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/server/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common'; 2 | export * from './template'; 3 | export * from './theme'; 4 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/displaying-child-pages/en_US/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Template for displaying child pages" 3 | } 4 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/growi-bot-event.ts: -------------------------------------------------------------------------------- 1 | export interface GrowiBotEvent { 2 | eventType: string; 3 | event: T; 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './browser-utils'; 2 | export * from './use-fullscreen'; 3 | export * from './use-rect'; 4 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/passwordResetSuccessful.ejs: -------------------------------------------------------------------------------- 1 | 密码重置成功 2 | 3 | 嗨, <%-email%> 4 | 5 | 您的密码已成功重置。 6 | 请使用您的新密码登录。 7 | -------------------------------------------------------------------------------- /apps/app/src/client/interfaces/in-app-notification-openable.ts: -------------------------------------------------------------------------------- 1 | export interface IInAppNotificationOpenable { 2 | open: () => void, 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathNav/Separator.module.scss: -------------------------------------------------------------------------------- 1 | .grw-mx-02em { 2 | margin-right: 0.2em; 3 | margin-left: 0.2em; 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/assistant/index.ts: -------------------------------------------------------------------------------- 1 | export * from './chat-assistant'; 2 | export * from './editor-assistant'; 3 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/v3-error.ts: -------------------------------------------------------------------------------- 1 | import type { ErrorV3 } from '@growi/core/dist/models'; 2 | 3 | export type IErrorV3 = ErrorV3; 4 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/attachment/index.ts: -------------------------------------------------------------------------------- 1 | export * from './download'; 2 | export * from './get'; 3 | export * from './get-brand-logo'; 4 | -------------------------------------------------------------------------------- /apps/pdf-converter/.env: -------------------------------------------------------------------------------- 1 | PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium 2 | PUPPETEER_CLUSTER_CONFIG={"maxConcurrency":1, "concurrency": 2} 3 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v70x/index.js: -------------------------------------------------------------------------------- 1 | const bootstrap5 = require('./bootstrap5'); 2 | 3 | module.exports = [...bootstrap5]; 4 | -------------------------------------------------------------------------------- /packages/core/src/swr/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-global-socket'; 2 | export * from './use-swr-static'; 3 | export * from './with-utils'; 4 | -------------------------------------------------------------------------------- /packages/editor/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './delta'; 2 | export * from './editing-client'; 3 | export * from './re-exports'; 4 | -------------------------------------------------------------------------------- /apps/app/resource/fonts/PressStart2P-latin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/resource/fonts/PressStart2P-latin.woff2 -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/Tag.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/mixins' as *; 2 | 3 | .grw-tag-list-skeleton { 4 | height: 90px; 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/client/components/Admin/PluginsExtensionPageContents/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PluginsExtensionPageContents'; 2 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/client-delegator/index.ts: -------------------------------------------------------------------------------- 1 | export * from './get-client'; 2 | export * from './is-stream-response'; 3 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/template.ts: -------------------------------------------------------------------------------- 1 | export type TargetType = 'children' | 'descendants'; 2 | export type LabelType = '_template' | '__template'; 3 | -------------------------------------------------------------------------------- /apps/app/src/styles/molecules/duplicated-paths-table.scss: -------------------------------------------------------------------------------- 1 | .grw-duplicated-paths-table { 2 | tbody { 3 | max-height: 200px; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/views/commons/footer.ejs: -------------------------------------------------------------------------------- 1 |
2 |

version: <%- growiBotVersion %>

3 |
4 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/utilities.scss: -------------------------------------------------------------------------------- 1 | @import 'init'; 2 | @import './override/helpers'; 3 | @import 'bootstrap/scss/utilities/api'; 4 | -------------------------------------------------------------------------------- /packages/core/src/remark-plugins/interfaces/option-parser.ts: -------------------------------------------------------------------------------- 1 | export type ParseRangeResult = { 2 | start: number; 3 | end: number; 4 | }; 5 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/connection-status.ts: -------------------------------------------------------------------------------- 1 | export type ConnectionStatus = { 2 | error?: Error; 3 | workspaceName?: string; 4 | }; 5 | -------------------------------------------------------------------------------- /apps/app/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.stylelintrc.json", 3 | "ignoreFiles": [ 4 | "src/styles/prebuilt/*.css" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/public/images/icons/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/icons/favicon/apple-icon.png -------------------------------------------------------------------------------- /apps/app/src/client/components/Common/SubmittableInput/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SubmittableInput'; 2 | export * from './AutosizeSubmittableInput'; 3 | -------------------------------------------------------------------------------- /apps/app/src/client/components/ItemsTree/ItemsTree.module.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable-next-line block-no-empty */ 2 | .items-tree :global { 3 | 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageHeader/PageHeader.module.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable-next-line block-no-empty */ 2 | .page-header :global { 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageList/PageListItemS.module.scss: -------------------------------------------------------------------------------- 1 | .page-title { 2 | flex: 1; 3 | font-size: 14px; 4 | line-height: 1.2; 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/interfaces/vector-store.ts: -------------------------------------------------------------------------------- 1 | export interface IVectorStore { 2 | vectorStoreId: string; 3 | isDeleted: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/paging-result.ts: -------------------------------------------------------------------------------- 1 | export type IPagingResult = { 2 | items: T[]; 3 | totalCount: number; 4 | limit: number; 5 | }; 6 | -------------------------------------------------------------------------------- /apps/app/src/server/interfaces/mongoose-utils.ts: -------------------------------------------------------------------------------- 1 | import type { Types } from 'mongoose'; 2 | 3 | export type ObjectIdLike = Types.ObjectId | string; 4 | -------------------------------------------------------------------------------- /apps/app/src/server/service/search-delegator/elasticsearch-client-delegator/index.ts: -------------------------------------------------------------------------------- 1 | export * from './get-client'; 2 | export * from './interfaces'; 3 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/public/images/growi-bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/slackbot-proxy/src/public/images/growi-bot.png -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/editor-theme/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | camelcase: 'off', 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/extensions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './emojiAutocompletionSettings'; 2 | export * from './setDataLine'; 3 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/server/utils/common/index.ts: -------------------------------------------------------------------------------- 1 | export * from './import-package-json'; 2 | export * from './validate-growi-plugin-directive'; 3 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/possible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/possible.png -------------------------------------------------------------------------------- /apps/app/src/client/components/PageComment/CommentPreview.module.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable-next-line block-no-empty */ 2 | .grw-comment-preview { 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/user-trigger-notification.ts: -------------------------------------------------------------------------------- 1 | type SlackChannel = string; 2 | export type SlackChannels = { [updatePost: string]: SlackChannel[] }; 3 | -------------------------------------------------------------------------------- /apps/pdf-converter/src/controllers/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PdfCtrl } from './pdf.js'; 2 | export { default as TerminusCtrl } from './terminus.js'; 3 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.stylelintrc.json", 3 | "ignoreFiles": [ 4 | "src/public/**/*.css" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /packages/editor/src/@types/emoji-mart.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'emoji-mart'; 2 | declare module '@emoji-mart/data'; 3 | declare module '@emoji-mart/react'; 4 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/table/index.ts: -------------------------------------------------------------------------------- 1 | export * from './insert-new-row-to-table-markdown'; 2 | export * from './use-show-table-icon'; 3 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/impossible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/impossible.png -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/pageLike.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- path %> 페이지를 좋아합니다. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/PageCreateButton/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-create-new-page'; 2 | export * from './use-create-todays-memo'; 3 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathNav/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PagePathNav'; 2 | export * from './PagePathNavLayout'; 3 | export * from './Separator'; 4 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/indeterminate-input-elm.ts: -------------------------------------------------------------------------------- 1 | export interface IndeterminateInputElement extends HTMLInputElement { 2 | indeterminate: boolean; 3 | } 4 | -------------------------------------------------------------------------------- /apps/app/src/linter-checker/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../../.stylelintrc.json", 3 | "ignoreFiles": [ 4 | "./test.scss" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/src/utils/growi-version.ts: -------------------------------------------------------------------------------- 1 | import pkg from '^/package.json'; 2 | 3 | export const getGrowiVersion = (): string => { 4 | return pkg.version; 5 | }; 6 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/public/images/add-to-slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/slackbot-proxy/src/public/images/add-to-slack.png -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_progress.scss: -------------------------------------------------------------------------------- 1 | .progress, 2 | .progress-stacked { 3 | --#{$prefix}progress-bar-bg: #{$progress-bar-bg}; 4 | } 5 | -------------------------------------------------------------------------------- /packages/editor/src/index.ts: -------------------------------------------------------------------------------- 1 | // only export universal modules 2 | export * from './consts'; 3 | export * from './interfaces'; 4 | export * from './models'; 5 | -------------------------------------------------------------------------------- /packages/preset-themes/public/images/island/island.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/packages/preset-themes/public/images/island/island.png -------------------------------------------------------------------------------- /packages/preset-themes/public/images/spring/spring02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/packages/preset-themes/public/images/spring/spring02.jpg -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/pageCreate.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- path %> を作成しました。 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/pageDelete.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- path %> を削除しました。 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/pageEdit.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- path %> を編集しました。 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/pageLike.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- path %> を「いいね」しました。 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/pageDelete.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- path %> 페이지를 삭제했습니다. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/pageEdit.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- path %> 페이지를 수정했습니다. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/src/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import 'i18next'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | returnNull: false; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageHistory/PageRevisionTable.module.scss: -------------------------------------------------------------------------------- 1 | .revision-history-table :global { 2 | tbody { 3 | max-height: 250px; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/features/comment/server/events/event-emitter.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from 'node:events'; 2 | 3 | export const commentEvent = new EventEmitter(); 4 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/normalize-data/normalize-thread-relation-expired-at/index.ts: -------------------------------------------------------------------------------- 1 | export * from './normalize-thread-relation-expired-at'; 2 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/sidebar-config.ts: -------------------------------------------------------------------------------- 1 | export interface ISidebarConfig { 2 | isSidebarCollapsedMode: boolean; 3 | isSidebarClosedAtDockMode?: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/certify-shared-page-attachment/interfaces.ts: -------------------------------------------------------------------------------- 1 | export type ValidReferer = { 2 | referer: string, 3 | shareLinkId: string, 4 | }; 5 | -------------------------------------------------------------------------------- /apps/app/src/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | // == Layout 2 | $grw-sidebar-nav-width: 48px; 3 | $grw-navbar-bottom-height: 62px; 4 | $grw-scroll-margin-top-in-view: 130px; 5 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/_init-stage-2.scss: -------------------------------------------------------------------------------- 1 | @import 'bootstrap/scss/maps'; 2 | @import 'bootstrap/scss/mixins'; 3 | @import 'bootstrap/scss/utilities'; 4 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/pageEdit.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> edited the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/pageLike.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> liked the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/pageCreate.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> a crée une page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/pageEdit.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> a modifié la page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/pageLike.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> a aimé la page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/pageCreate.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- path %> 아래에 새 페이지를 만들었습니다. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/pageEdit.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> edited the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/pageLike.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> liked the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/src/server/service/interfaces/search.ts: -------------------------------------------------------------------------------- 1 | export type UpdateOrInsertPagesOpts = { 2 | shouldEmitProgress?: boolean 3 | invokeGarbageCollection?: boolean 4 | } 5 | -------------------------------------------------------------------------------- /apps/app/src/styles/_share-link.scss: -------------------------------------------------------------------------------- 1 | @use './mixins'; 2 | 3 | @include mixins.share-link { 4 | .d-share-link-none { 5 | display: none !important; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/click-add-to-slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/click-add-to-slack.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/growi-bot-kun-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/growi-bot-kun-icon.png -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/pageDelete.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> deleted the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/pageDelete.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> à supprimé la page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/passwordResetSuccessful.ejs: -------------------------------------------------------------------------------- 1 | パスワードリセットに成功 2 | 3 | こんにちは、 <%- email %> 4 | 5 | あなたのパスワードは正常にリセットされました。 6 | 新しいパスワードでログインしてください。 7 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/pageDelete.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> deleted the page <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/Users/UserMenu.module.scss: -------------------------------------------------------------------------------- 1 | .grw-usermenu-notification-icon :global { 2 | position: absolute; 3 | top: -6px; 4 | left: 3px; 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/transfer-key.ts: -------------------------------------------------------------------------------- 1 | export interface ITransferKey { 2 | _id: ID; 3 | expireAt: Date; 4 | keyString: string; 5 | key: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/src/server/util/express-validator/validator.js: -------------------------------------------------------------------------------- 1 | // custom validators not covered by express-validator 2 | // https://github.com/validatorjs/validator.js#validators 3 | -------------------------------------------------------------------------------- /packages/core-styles/scss/variables/_growi-official-colors.scss: -------------------------------------------------------------------------------- 1 | // == GROWI Official Color 2 | $growi-green: #7AD340; 3 | $growi-blue: #428DD1; 4 | $growi-ai-purple: #a190cd; 5 | -------------------------------------------------------------------------------- /packages/preset-themes/public/images/blackboard/blackboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/packages/preset-themes/public/images/blackboard/blackboard.png -------------------------------------------------------------------------------- /packages/remark-lsx/src/@types/declaration.d.ts: -------------------------------------------------------------------------------- 1 | // prevent TS2307: Cannot find module './xxx.module.scss' or its corresponding type declarations. 2 | declare module '*.scss'; 3 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/client/components/LsxPageList/LsxPage.module.scss: -------------------------------------------------------------------------------- 1 | .page-list-li :global { 2 | 3 | .lsx-page-not-exist { 4 | opacity: 0.6; 5 | } 6 | 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Attachment'; 2 | export * from './LoadingSpinner'; 3 | export * from './PagePath'; 4 | export * from './UserPicture'; 5 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/activate-public-dist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/activate-public-dist.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/basicinfo-all-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/basicinfo-all-checked.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/growi-register-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/growi-register-modal.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/growi-set-proxy-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/growi-set-proxy-url.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/triangle-basic-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/triangle-basic-gray.png -------------------------------------------------------------------------------- /apps/app/resource/fonts/SourceHanCodeJP-Regular-subset-jis2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/resource/fonts/SourceHanCodeJP-Regular-subset-jis2.woff2 -------------------------------------------------------------------------------- /apps/app/resource/fonts/SourceHanCodeJP-Regular-subset-main.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/resource/fonts/SourceHanCodeJP-Regular-subset-main.woff2 -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/pageCreate.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> created a new page under <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/passwordResetSuccessful.ejs: -------------------------------------------------------------------------------- 1 | 비밀번호 재설정 완료 2 | 3 | 안녕하세요 <%- email %>님 4 | 5 | 비밀번호가 성공적으로 재설정되었습니다. 6 | 새 비밀번호로 로그인해주세요. 7 | 8 | 감사합니다, -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/pageCreate.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> created a new page under <%- path %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/src/components/Navbar/GroundGlassBar.module.scss: -------------------------------------------------------------------------------- 1 | .ground-glass-bar { 2 | background-color: rgba(var(--bs-body-bg-rgb), 0.7); 3 | backdrop-filter: blur(35px); 4 | } 5 | -------------------------------------------------------------------------------- /packages/core/src/consts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './accepted-upload-file-type'; 2 | export * from './growi-plugin'; 3 | export * from './system'; 4 | export * from './ydoc-status'; 5 | -------------------------------------------------------------------------------- /packages/slack/src/models/errors.ts: -------------------------------------------------------------------------------- 1 | import ExtensibleCustomError from 'extensible-custom-error'; 2 | 3 | export class InvalidGrowiCommandError extends ExtensibleCustomError {} 4 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/growi-register-sentence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/growi-register-sentence.png -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/pageMove.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- oldPath %> 페이지를 <%- newPath %>(으)로 이동했습니다. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/src/interfaces/theme.ts: -------------------------------------------------------------------------------- 1 | export const PrismThemes = { 2 | OneLight: 'one-light', 3 | } as const; 4 | export type PrismThemes = (typeof PrismThemes)[keyof typeof PrismThemes]; 5 | -------------------------------------------------------------------------------- /packages/core/src/utils/env-utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * convert to boolean 3 | * 4 | */ 5 | export function toBoolean(value: string): boolean { 6 | return /^(true|1)$/i.test(value); 7 | } 8 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/file-dropzone/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-file-dropzone/FileDropzoneOverlay'; 2 | export * from './use-file-dropzone/use-file-dropzone'; 3 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/test/fixtures/text/input.md: -------------------------------------------------------------------------------- 1 | One $a, two $a[b], three $a(b), four $a[b](c). 2 | 3 | $a[b *c* 4 | d **e**]. 5 | 6 | $a(#b.c.d .f.g h="i & j 7 | k"). 8 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/test/fixtures/text/output.md: -------------------------------------------------------------------------------- 1 | One $a, two $a[b], three $a(b), four $a[b](c). 2 | 3 | $a[b *c* 4 | d **e**]. 5 | 6 | $a(#b.c.d .f.g h="i & j 7 | k"). 8 | -------------------------------------------------------------------------------- /apps/app/config/logger/config.prod.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | default: 'info', 3 | 4 | 'growi:routes:login-passport': 'debug', 5 | 'growi:service:PassportService': 'debug', 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/pageMove.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> renamed the page <%- oldPath %> to <%- newPath %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/pageMove.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- oldPath %> を <%- newPath %> に移動(名前を変更)しました。 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/pageMove.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> renamed the page <%- oldPath %> to <%- newPath %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/ExpandOrContractButton.module.scss: -------------------------------------------------------------------------------- 1 | .btn-expand-or-contract { 2 | padding: 3px; 3 | opacity: .5; 4 | 5 | &:hover { 6 | opacity: .75; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/InAppNotification/ModelNotification/ModelNotification.module.scss: -------------------------------------------------------------------------------- 1 | .modal-notification :global { 2 | .page-title { 3 | font-size: 14px; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TreeItem/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces'; 2 | 3 | export * from './NewPageInput'; 4 | export * from './ItemNode'; 5 | export * from './TreeItemLayout'; 6 | -------------------------------------------------------------------------------- /apps/app/test/integration/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "module": "CommonJS", 5 | "types": ["@types/jest"] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/config/swagger/config.prod.ts: -------------------------------------------------------------------------------- 1 | import { SwaggerSettings } from '@tsed/swagger'; 2 | 3 | const settings: SwaggerSettings[] = []; 4 | 5 | export default settings; 6 | -------------------------------------------------------------------------------- /packages/pluginkit/src/model/index.ts: -------------------------------------------------------------------------------- 1 | export * from './growi-plugin-package-data'; 2 | export * from './growi-plugin-validation-data'; 3 | export * from './growi-plugin-validation-error'; 4 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/src/@types/declaration.d.ts: -------------------------------------------------------------------------------- 1 | // prevent TS2307: Cannot find module './xxx.module.scss' or its corresponding type declarations. 2 | declare module '*.scss'; 3 | -------------------------------------------------------------------------------- /packages/remark-drawio/README.md: -------------------------------------------------------------------------------- 1 | # remark-drawio 2 | 3 | [GROWI][growi] remark plugin to draw diagrams with [draw.io (diagrams.net)](https://www.diagrams.net/) 4 | 5 | Usage 6 | ------ 7 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/test/fixtures/leaf/output.md: -------------------------------------------------------------------------------- 1 | $a 2 | 3 | $a[b] 4 | 5 | $a(b) 6 | 7 | $a[b](c) 8 | 9 | $a[b *c* d **e**] 10 | 11 | $a(#b.c.d .f.g h="i & j k") 12 | -------------------------------------------------------------------------------- /packages/slack/src/middlewares/index.ts: -------------------------------------------------------------------------------- 1 | export * from './parse-slack-interaction-request'; 2 | export * from './verify-growi-to-slack-request'; 3 | export * from './verify-slack-request'; 4 | -------------------------------------------------------------------------------- /apps/app/public/images/icons/slack/slack-logo-background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/pageMove.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> a renommé la page <%- oldPath %> en <%- newPath %>. 2 | 3 | ---------------------- 4 | 5 | GROWI: <%- appTitle %> 6 | -------------------------------------------------------------------------------- /apps/app/src/features/plantuml/themes/.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('eslint').Linter.Config} 3 | */ 4 | module.exports = { 5 | ignorePatterns: [ 6 | '*.puml.ts', 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/ldap.ts: -------------------------------------------------------------------------------- 1 | export interface IResTestLdap { 2 | err?: any; 3 | message: string; 4 | status: string; 5 | ldapConfiguration?: any; 6 | ldapAccountInfo?: any; 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/inject-currentuser-to-localvars.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | return (req, res, next) => { 3 | res.locals.user = req.user; 4 | next(); 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /apps/pdf-converter/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false 5 | }, 6 | "exclude": ["node_modules", "dist", "test"] 7 | } 8 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/test/fixtures/leaf/input.md: -------------------------------------------------------------------------------- 1 | $a 2 | 3 | $a[b] 4 | 5 | $a(b) 6 | 7 | $a[b](c) 8 | 9 | $a[b *c* d **e**] 10 | 11 | $a(#b.c.d .f.g h="i & j k") 12 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/channel.ts: -------------------------------------------------------------------------------- 1 | export type IChannel = { 2 | id: string; 3 | name: string; 4 | }; 5 | 6 | export type IChannelOptionalId = Omit & Partial; 7 | -------------------------------------------------------------------------------- /apps/app/docker/Dockerfile.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/coverage 3 | **/Dockerfile 4 | **/*.dockerignore 5 | **/.pnpm-store 6 | **/.next 7 | **/.turbo 8 | out 9 | apps/slackbot-proxy 10 | -------------------------------------------------------------------------------- /apps/app/public/images/icons/slack/slack-logo-dark-background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-to-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-to-workspace.png -------------------------------------------------------------------------------- /apps/slackbot-proxy/docker/Dockerfile.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/dist 3 | **/coverage 4 | **/Dockerfile 5 | **/*.dockerignore 6 | **/.pnpm-store 7 | **/.turbo 8 | out 9 | apps/app 10 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/growi-command.ts: -------------------------------------------------------------------------------- 1 | export type GrowiCommand = { 2 | text: string; 3 | responseUrl: string; 4 | growiCommandType: string; 5 | growiCommandArgs: string[]; 6 | }; 7 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageComment/ReplyComments.module.scss: -------------------------------------------------------------------------------- 1 | 2 | // remove margin after hidden replies 3 | .page-comments-hidden-replies + .page-comment-reply :global { 4 | margin-top: 0; 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageControls/user-list-popover.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/ui/scss/molecules/user-list-popover'; 2 | 3 | .user-list-popover :global { 4 | @extend %user-list-popover 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Skeleton.module.scss: -------------------------------------------------------------------------------- 1 | .grw-skeleton { 2 | --bs-list-group-color: rgba(var(--bs-tertiary-color-rgb), 0.2); 3 | 4 | background-color: var(--bs-list-group-color); 5 | } 6 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathNavTitle/PagePathNavTitle.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .grw-page-path-nav-title :global { 4 | min-height: 75px; 5 | } 6 | -------------------------------------------------------------------------------- /packages/custom-icons/.svgtofontrc: -------------------------------------------------------------------------------- 1 | { 2 | "fontName": "growi-custom-icons", 3 | "css": false, 4 | "outSVGReact": false, 5 | "useNameAsUnicode": true, 6 | "className": "growi-custom-icons" 7 | } 8 | -------------------------------------------------------------------------------- /packages/preset-themes/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './consts/preset-themes'; 2 | 3 | export const themesRootPath = 'dist/themes'; 4 | export const manifestPath = `${themesRootPath}/.vite/manifest.json`; 5 | -------------------------------------------------------------------------------- /packages/preset-themes/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": {}, 5 | "include": ["src"] 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-your-app-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-your-app-complete.png -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/Users/ExternalAccountTable.module.scss: -------------------------------------------------------------------------------- 1 | .ea-table :global { 2 | thead th { 3 | vertical-align: top; 4 | } 5 | td { 6 | vertical-align: middle; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageCreateModal.module.scss: -------------------------------------------------------------------------------- 1 | .grw-create-page :global { 2 | .page-today-input1 { 3 | width: 60px; 4 | } 5 | .grw-btn-create-page { 6 | min-width: 90px; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/ReactMarkdownComponents/RichAttachment.module.scss: -------------------------------------------------------------------------------- 1 | .attachment :global { 2 | .attachment-icon { 3 | flex-shrink: 0; 4 | width: 35px; 5 | height: 35px; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/utils/process-utils.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | export function hasProcessFlag(flag: string): boolean { 3 | return process.argv.join('').indexOf(flag) > -1; 4 | } 5 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/color-scheme.ts: -------------------------------------------------------------------------------- 1 | export const ColorScheme = { 2 | LIGHT: 'light', 3 | DARK: 'dark', 4 | } as const; 5 | export type ColorScheme = (typeof ColorScheme)[keyof typeof ColorScheme]; 6 | -------------------------------------------------------------------------------- /packages/editor/src/client/components-internal/CodeMirrorEditor/Toolbar/TextFormatTools.module.scss: -------------------------------------------------------------------------------- 1 | // == Colors 2 | .btn-text-format-tools-toggler { 3 | --bs-btn-active-bg: var(--bs-secondary-bg); 4 | } 5 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/src/mdast-util-growi-directive/index.js: -------------------------------------------------------------------------------- 1 | export { 2 | DirectiveType as DirectiveTypeObject, 3 | directiveFromMarkdown, 4 | directiveToMarkdown, 5 | } from './lib/index.js'; 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/comment.ejs: -------------------------------------------------------------------------------- 1 | <%- username %>님이 <%- path %>에 댓글을 남겼습니다. 2 | 3 | ---------------------- 4 | 5 | <%- comment %> 6 | 7 | ---------------------- 8 | 9 | GROWI: <%- appTitle %> -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/Customize/ThemeColorBox.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | // layout 4 | .theme-option-container :global { 5 | min-width: 100px; 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/EditorNavbar/EditingUserList.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/ui/scss/molecules/user-list-popover'; 2 | 3 | .user-list-popover :global { 4 | @extend %user-list-popover; 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/src/utils/page-path-utils/is-top-page.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Whether path is the top page 3 | * @param path 4 | */ 5 | export const isTopPage = (path: string): boolean => { 6 | return path === '/'; 7 | }; 8 | -------------------------------------------------------------------------------- /packages/pdf-converter-client/orval.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'client-library': { 3 | input: '../../apps/pdf-converter/specs/v3/docs/swagger.yaml', 4 | output: './src/index.ts', 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /packages/preset-themes/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.stylelintrc.json", 3 | "rules": { 4 | "no-invalid-position-at-import-rule": null, 5 | "no-duplicate-at-import-rules": null 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/interfaces/page-node.ts: -------------------------------------------------------------------------------- 1 | import type { IPageHasId } from '@growi/core'; 2 | 3 | export type PageNode = { 4 | pagePath: string; 5 | children: PageNode[]; 6 | page?: IPageHasId; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-to-workspace-joined-bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-to-workspace-joined-bot.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-your-app-introduction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-your-app-introduction.png -------------------------------------------------------------------------------- /apps/app/resource/fonts/MaterialSymbolsOutlined-opsz,wght,FILL@20..48,300,0..1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/resource/fonts/MaterialSymbolsOutlined-opsz,wght,FILL@20..48,300,0..1.woff2 -------------------------------------------------------------------------------- /apps/app/src/interfaces/common.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Common types and interfaces 3 | */ 4 | 5 | import type { ReactNode } from 'react'; 6 | 7 | export type HasChildren = { 8 | children?: T; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/interfaces/growi-to-slack/growi-req.ts: -------------------------------------------------------------------------------- 1 | import type { RequestFromGrowi } from '@growi/slack'; 2 | import type { Req } from '@tsed/common'; 3 | 4 | export type GrowiReq = Req & RequestFromGrowi; 5 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_tables.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $table-variants { 2 | @if $color == 'primary' or $color == 'secondary' { 3 | @include table-variant($color, $value); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/pluginkit/src/v4/server/utils/template/index.ts: -------------------------------------------------------------------------------- 1 | export * from './get-markdown'; 2 | export * from './scan'; 3 | export * from './validate-all-locales'; 4 | export * from './validate-growi-plugin-directive'; 5 | -------------------------------------------------------------------------------- /packages/slack/src/utils/payload-interaction-id-helpers.ts: -------------------------------------------------------------------------------- 1 | export const getInteractionIdRegexpFromCommandName = ( 2 | commandname: string, 3 | ): RegExp => { 4 | return new RegExp(`^${commandname}:\\w+`); 5 | }; 6 | -------------------------------------------------------------------------------- /.github/workflows/cache-clear.yml: -------------------------------------------------------------------------------- 1 | name: Cache Clear 2 | 3 | on: workflow_dispatch 4 | 5 | jobs: 6 | clear: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: snnaplab/delete-branch-cache-action@v1 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TreeItem/SimpleItemContent.module.scss: -------------------------------------------------------------------------------- 1 | .simple-item-content :global { 2 | .grw-page-title-anchor { 3 | width: 100%; 4 | overflow: hidden; 5 | text-decoration: none; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/page-tag-relation.ts: -------------------------------------------------------------------------------- 1 | import type { IPage, ITag } from '@growi/core'; 2 | 3 | export type IPageTagRelation = { 4 | relatedPage: IPage; 5 | relatedTag: ITag; 6 | isPageTrashed: boolean; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/src/server/models/serializers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './bookmark-serializer'; 2 | export * from './page-serializer'; 3 | export * from './revision-serializer'; 4 | export * from './user-group-relation-serializer'; 5 | -------------------------------------------------------------------------------- /bin/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'node', 6 | clearMocks: true, 7 | globals: true, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_dropdown-dark.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .dropdown-item:active{ 4 | --#{$prefix}dropdown-link-active-bg: var(--#{$prefix}gray-700); 5 | } 6 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/response-url.ts: -------------------------------------------------------------------------------- 1 | import type { Block, KnownBlock } from '@slack/web-api'; 2 | 3 | export type RespondBodyForResponseUrl = { 4 | text?: string; 5 | blocks?: (KnownBlock | Block)[]; 6 | }; 7 | -------------------------------------------------------------------------------- /vitest.workspace.mts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'apps/*/vitest.config.ts', 3 | 'apps/*/vitest.workspace.ts', 4 | 'bin/vitest.config.ts', 5 | 'packages/*/vitest.config.ts', 6 | 'packages/*/vitest.workspace.ts', 7 | ]; 8 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/comment.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> commented on <%- path %>. 2 | 3 | ---------------------- 4 | 5 | <%- comment %> 6 | 7 | ---------------------- 8 | 9 | GROWI: <%- appTitle %> 10 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/comment.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> が <%- path %> にコメントしました。 2 | 3 | ---------------------- 4 | 5 | <%- comment %> 6 | 7 | ---------------------- 8 | 9 | GROWI: <%- appTitle %> 10 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/comment.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> commented on <%- path %>. 2 | 3 | ---------------------- 4 | 5 | <%- comment %> 6 | 7 | ---------------------- 8 | 9 | GROWI: <%- appTitle %> 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/ConflictDiffModal.module.scss: -------------------------------------------------------------------------------- 1 | // TODO: https://redmine.weseek.co.jp/issues/142208 2 | .conflict-diff-modal :global { 3 | .cm-editor { 4 | height: 400px !important; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/is-ai-enabled.ts: -------------------------------------------------------------------------------- 1 | import { configManager } from '~/server/service/config-manager'; 2 | 3 | export const isAiEnabled = (): boolean => 4 | configManager.getConfig('app:aiEnabled'); 5 | -------------------------------------------------------------------------------- /bin/data-migrations/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "checkJs": true, 6 | "strict": true, 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/comment.ejs: -------------------------------------------------------------------------------- 1 | <%- username %> à commenté sur <%- path %>. 2 | 3 | ---------------------- 4 | 5 | <%- comment %> 6 | 7 | ---------------------- 8 | 9 | GROWI: <%- appTitle %> 10 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_list-group.scss: -------------------------------------------------------------------------------- 1 | .list-group { 2 | --#{$prefix}list-group-active-bg: #{$list-group-active-bg}; 3 | --#{$prefix}list-group-active-border-color: #{$list-group-active-border-color}; 4 | } 5 | -------------------------------------------------------------------------------- /packages/editor/src/interfaces/delta.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 2 | export type Delta = Array<{ 3 | insert?: string | object | Array; 4 | delete?: number; 5 | retain?: number; 6 | }>; 7 | -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-your-app-introduction-to-channel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-your-app-introduction-to-channel.png -------------------------------------------------------------------------------- /apps/app/public/images/slack-integration/slack-bot-install-your-app-transition-destination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/growilabs/growi/HEAD/apps/app/public/images/slack-integration/slack-bot-install-your-app-transition-destination.png -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/passwordResetSuccessful.ejs: -------------------------------------------------------------------------------- 1 | Password Reset Successful 2 | 3 | Hi <%- email %> 4 | 5 | Your password has been successfully reset. 6 | Please log in with your new password. 7 | 8 | Thank you, 9 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/client/components/AiAssistant/AiAssistantSidebar/ThreadList.module.scss: -------------------------------------------------------------------------------- 1 | .thread-list :global { 2 | li { 3 | &:hover { 4 | background-color: var(--bs-secondary-bg) !important; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/features/opentelemetry/server/custom-resource-attributes/index.ts: -------------------------------------------------------------------------------- 1 | export { getApplicationResourceAttributes } from './application-resource-attributes'; 2 | export { getOsResourceAttributes } from './os-resource-attributes'; 3 | -------------------------------------------------------------------------------- /apps/app/src/stores/use-static-swr.ts: -------------------------------------------------------------------------------- 1 | import { useSWRStatic } from '@growi/core/dist/swr'; 2 | 3 | /** 4 | * @deprecated Import { useSWRStatic } from '@growi/core/dist/swr' instead. 5 | */ 6 | export const useStaticSWR = useSWRStatic; 7 | -------------------------------------------------------------------------------- /packages/pluginkit/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "types": ["vitest/globals"] 6 | }, 7 | "include": ["src"] 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PagePathNavSticky/CollapsedParentsDropdown.module.scss: -------------------------------------------------------------------------------- 1 | 2 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 3 | 4 | .collapsed-parents-dropdown-menu { 5 | --bs-dropdown-zindex: #{bs.$zindex-fixed}; 6 | } 7 | -------------------------------------------------------------------------------- /packages/preset-templates/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "esModuleInterop": true, 5 | "resolveJsonModule": true, 6 | "types": ["vitest/globals"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TreeItem/NewPageInput/NewPageInput.module.scss: -------------------------------------------------------------------------------- 1 | @use '../tree-item-variables'; 2 | 3 | .new-page-input-container { 4 | width: calc(100% - tree-item-variables.$btn-triangle-min-width); 5 | padding-left: 24px; 6 | } 7 | -------------------------------------------------------------------------------- /apps/app/src/models/admin/import-mode.ts: -------------------------------------------------------------------------------- 1 | export const ImportMode = { 2 | insert: 'insert', 3 | upsert: 'upsert', 4 | flushAndInsert: 'flushAndInsert', 5 | } as const; 6 | export type ImportMode = (typeof ImportMode)[keyof typeof ImportMode]; 7 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/repositories/order.ts: -------------------------------------------------------------------------------- 1 | import { EntityRepository, Repository } from 'typeorm'; 2 | 3 | import { Order } from '~/entities/order'; 4 | 5 | @EntityRepository(Order) 6 | export class OrderRepository extends Repository {} 7 | -------------------------------------------------------------------------------- /packages/preset-templates/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'node', 6 | clearMocks: true, 7 | globals: true, 8 | }, 9 | }); 10 | -------------------------------------------------------------------------------- /apps/app/.gitignore: -------------------------------------------------------------------------------- 1 | # next.js 2 | /.next/ 3 | /out/ 4 | 5 | # test 6 | .reg 7 | 8 | # dist 9 | /build/ 10 | /dist/ 11 | /transpiled/ 12 | /public/static/js 13 | /public/static/styles 14 | /public/uploads 15 | /src/styles/prebuilt 16 | /tmp/ 17 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/Custom/CustomSidebarSubstance.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/organisms/wiki-custom-sidebar.scss'; 2 | 3 | .grw-custom-sidebar-content :global { 4 | .wiki { 5 | @extend %grw-custom-sidebar-content; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/client/interfaces/notification.ts: -------------------------------------------------------------------------------- 1 | import type { NotifyType } from './global-notification'; 2 | 3 | export type INotificationType = { 4 | __t?: NotifyType 5 | _id: string 6 | // TOOD: Define the provider type 7 | provider?: any 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/features/comment/server/events/consts.ts: -------------------------------------------------------------------------------- 1 | export const CommentEvent = { 2 | CREATE: 'create', 3 | UPDATE: 'update', 4 | DELETE: 'delete', 5 | } as const; 6 | export type CommentEvent = (typeof CommentEvent)[keyof typeof CommentEvent]; 7 | -------------------------------------------------------------------------------- /apps/app/src/utils/rand.ts: -------------------------------------------------------------------------------- 1 | export const getRandomIntInRange = (min: number, max: number): number => { 2 | const minInt = Math.ceil(min); 3 | const maxInt = Math.floor(max); 4 | return Math.floor(Math.random() * (maxInt - minInt) + minInt); 5 | }; 6 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/external-account.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from './common'; 2 | import type { IUser } from './user'; 3 | 4 | export type IExternalAccount

= { 5 | providerType: P; 6 | accountId: string; 7 | user: Ref; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/remark-drawio/src/components/DrawioViewer.module.scss: -------------------------------------------------------------------------------- 1 | .drawio-viewer :global { 2 | margin: 20px 0; 3 | border: 1px solid transparent; 4 | border-radius: 4px; 5 | } 6 | 7 | .drawio-viewer * { 8 | box-sizing: content-box; 9 | } 10 | -------------------------------------------------------------------------------- /packages/remark-drawio/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './components/DrawioViewer'; 2 | export * from './interfaces/graph-viewer'; 3 | export * from './services/renderer/remark-drawio'; 4 | export * from './utils/embed'; 5 | export * from './utils/global'; 6 | -------------------------------------------------------------------------------- /.devcontainer/app/initializeCommand.sh: -------------------------------------------------------------------------------- 1 | # prevent file not found error on docker compose up 2 | if [ ! -f ".devcontainer/compose.extend.yml" ]; then 3 | 4 | cat > ".devcontainer/compose.extend.yml" <, 4 | 5 | 已使用 GROWI (<%- appTitle %>) 创建帐户。 6 | 单击下面的链接以激活您的帐户。 7 | 8 | <%- url %> 9 | 10 | 这个链接将在1小时后即<%- expiredAt %>失效。 11 | 12 | 如果您尚未创建,请忽略此电子邮件。 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageAttachment/DeleteAttachmentModal.module.scss: -------------------------------------------------------------------------------- 1 | .attachment-delete-modal :global { 2 | .attachment-delete-image { 3 | text-align: center; 4 | 5 | img { 6 | max-width: 100%; 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/SearchPage/SearchControl.module.scss: -------------------------------------------------------------------------------- 1 | 2 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 3 | @use '@growi/ui/scss/atoms/btn-muted'; 4 | 5 | // == Colors 6 | .btn-delete { 7 | @include btn-muted.colorize(bs.$red); 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/src/client/components/TemplateModal/TemplateModal.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .dm-templates :global { 4 | .dropdown-item:not(:first-child) { 5 | border-top: 1px solid bs.$border-color; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/pdf-converter/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "extensions": ["ts"], 3 | "watch": ["src/**/*.ts"], 4 | "ignore": ["node_modules/**/*"], 5 | "delay": 100, 6 | "execMap": { 7 | "ts": "node --import @swc-node/register/esm-register" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/.env.development: -------------------------------------------------------------------------------- 1 | SERVER_URI=http://localhost:8080 2 | TYPEORM_CONNECTION=mysql 3 | TYPEORM_HOST=mysql 4 | TYPEORM_DATABASE=growi-slackbot-proxy 5 | TYPEORM_USERNAME=growi-slackbot-proxy 6 | TYPEORM_PASSWORD=YrkUi7rCW46Z2N6EXSFUBwaQTUR8biCU 7 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/vite.ts: -------------------------------------------------------------------------------- 1 | export type ViteManifestValue = { 2 | file: string; 3 | src: string; 4 | isEntry?: boolean; 5 | css?: string[]; 6 | }; 7 | 8 | export type ViteManifest = { 9 | [key: string]: ViteManifestValue; 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/passwordResetSuccessful.ejs: -------------------------------------------------------------------------------- 1 | Réinitialisation du mot de passe réussie 2 | 3 | Bonjour, <%- email %> 4 | 5 | Votre mot de passe a été réinitialisé. 6 | Connectez-vous avec votre nouveau mot de passe 7 | 8 | Merci, 9 | -------------------------------------------------------------------------------- /apps/app/src/server/service/socket-io/helper.ts: -------------------------------------------------------------------------------- 1 | export const RoomPrefix = { 2 | USER: 'user', 3 | PAGE: 'page', 4 | }; 5 | 6 | export const getRoomNameWithId = (roomPrefix: string, roomId: string): string => { 7 | return `${roomPrefix}:${roomId}`; 8 | }; 9 | -------------------------------------------------------------------------------- /.devcontainer/pdf-converter/initializeCommand.sh: -------------------------------------------------------------------------------- 1 | # prevent file not found error on docker compose up 2 | if [ ! -f ".devcontainer/compose.extend.yml" ]; then 3 | 4 | cat > ".devcontainer/compose.extend.yml" < 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. 6 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/notifications/passwordReset.ejs: -------------------------------------------------------------------------------- 1 | 重设密码 2 | 3 | 嗨,<%- email %> 4 | 5 | 已收到更改您 GROWI (<%-appTitle%>) 帐户 密码的请求。 6 | 要重置密码,请单击下面的链接。 7 | 8 | <%- url %> 9 | 10 | 这个链接在10分钟后的{ expiredAt }}失效。 11 | 12 | 如果您没有要求重置密码,则可以放心地忽略此电子邮件。 13 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathHierarchicalLink/PagePathHierarchicalLink.module.scss: -------------------------------------------------------------------------------- 1 | .separator { 2 | margin-right: 0.2em; 3 | margin-left: 0.2em; 4 | } 5 | 6 | .material-symbols-outlined { 7 | font-size: 1em; 8 | line-height: inherit; 9 | } 10 | -------------------------------------------------------------------------------- /apps/app/src/features/growi-plugin/server/consts/index.ts: -------------------------------------------------------------------------------- 1 | import { resolveFromRoot } from '~/server/util/project-dir-utils'; 2 | 3 | export const PLUGIN_STORING_PATH = resolveFromRoot('tmp/plugins'); 4 | 5 | export const PLUGIN_EXPRESS_STATIC_DIR = '/static/plugins'; 6 | -------------------------------------------------------------------------------- /apps/app/src/server/models/openapi/object-id.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @swagger 3 | * 4 | * components: 5 | * schemas: 6 | * ObjectId: 7 | * type: string 8 | * description: Object ID 9 | * example: 5ae5fccfc5577b0004dbd8ab 10 | */ 11 | -------------------------------------------------------------------------------- /apps/app/src/styles/atoms/mixins/_code.scss: -------------------------------------------------------------------------------- 1 | @mixin code-inline-color($color-inline-code,$bgcolor-inline-code, $bordercolor-inline-code) { 2 | color: $color-inline-code; 3 | background-color: $bgcolor-inline-code; 4 | border-color: $bordercolor-inline-code; 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/src/utils/template-checker.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * templateChecker 3 | */ 4 | 5 | export function checkTemplatePath(path: string): boolean { 6 | if (path.match(/^.*\/_{1,2}template$/)) { 7 | return true; 8 | } 9 | 10 | return false; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui/src/interfaces/breakpoints.ts: -------------------------------------------------------------------------------- 1 | export const Breakpoint = { 2 | XS: 'xs', 3 | SM: 'sm', 4 | MD: 'md', 5 | LG: 'lg', 6 | XL: 'xl', 7 | XXL: 'xxl', 8 | } as const; 9 | export type Breakpoint = (typeof Breakpoint)[keyof typeof Breakpoint]; 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/InstallerForm.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/atoms/placeholders/buttons'; 2 | 3 | :root { 4 | .installer-form :global { 5 | .btn-register { 6 | @extend %btn-nologin; 7 | @extend %btn-register; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Me/UISettings.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .grw-sidebar-mode-icon { 4 | display: flex; 5 | align-items: center; 6 | width: 20px; 7 | height: 20px; 8 | color: bs.$secondary; 9 | } 10 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/assistant/assistant-types.ts: -------------------------------------------------------------------------------- 1 | export const AssistantType = { 2 | SEARCH: 'Search', 3 | CHAT: 'Chat', 4 | EDIT: 'Edit', 5 | } as const; 6 | 7 | export type AssistantType = (typeof AssistantType)[keyof typeof AssistantType]; 8 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/registration-mode.ts: -------------------------------------------------------------------------------- 1 | export const RegistrationMode = { 2 | OPEN: 'Open', 3 | RESTRICTED: 'Restricted', 4 | CLOSED: 'Closed', 5 | } as const; 6 | 7 | export type RegistrationMode = 8 | (typeof RegistrationMode)[keyof typeof RegistrationMode]; 9 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/user-ui-settings.ts: -------------------------------------------------------------------------------- 1 | import type { SidebarContentsType } from './ui'; 2 | 3 | export interface IUserUISettings { 4 | currentSidebarContents: SidebarContentsType; 5 | currentProductNavWidth: number; 6 | preferCollapsedModeByUser: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/apiv3/interfaces/apiv3-response.ts: -------------------------------------------------------------------------------- 1 | import type { Response } from 'express'; 2 | 3 | export interface ApiV3Response extends Response { 4 | apiv3(obj?: any, status?: number): any 5 | apiv3Err(_err: any, status?: number, info?: any): any 6 | } 7 | -------------------------------------------------------------------------------- /apps/pdf-converter/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import swc from 'unplugin-swc'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | test: { 6 | globals: true, 7 | root: './', 8 | }, 9 | plugins: [swc.vite()], 10 | }); 11 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/config/swagger/config.dev.ts: -------------------------------------------------------------------------------- 1 | import { SwaggerSettings } from '@tsed/swagger'; 2 | 3 | const settings: SwaggerSettings[] = [ 4 | { 5 | path: '/docs', 6 | specVersion: '3.0.1', 7 | }, 8 | ]; 9 | 10 | export default settings; 11 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/apply-dark.scss: -------------------------------------------------------------------------------- 1 | @import './root'; 2 | @import './root-dark'; 3 | @import './tables'; 4 | @import './buttons-dark'; 5 | @import './pagination'; 6 | @import './progress'; 7 | @import './list-group'; 8 | @import './dropdown-dark'; 9 | -------------------------------------------------------------------------------- /packages/editor/src/consts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './editor-settings'; 2 | export * from './editor-themes'; 3 | export * from './global-code-mirror-editor-key'; 4 | export * from './keymaps'; 5 | export * from './paste-mode'; 6 | export * from './ydoc-awareness-user-color'; 7 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/yjs.ts: -------------------------------------------------------------------------------- 1 | export type CurrentPageYjsData = { 2 | hasYdocsNewerThanLatestRevision?: boolean; 3 | awarenessStateSize?: number; 4 | }; 5 | 6 | export type SyncLatestRevisionBody = { 7 | synced: boolean; 8 | isYjsDataBroken?: boolean; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/src/models/cdn-resource.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Value Object 3 | */ 4 | class CdnResource { 5 | constructor(name, url, outDir) { 6 | this.name = name; 7 | this.url = url; 8 | this.outDir = outDir; 9 | } 10 | } 11 | 12 | module.exports = CdnResource; 13 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/apply-light.scss: -------------------------------------------------------------------------------- 1 | @import './root'; 2 | @import './root-light'; 3 | @import './tables'; 4 | @import './buttons-light'; 5 | @import './pagination'; 6 | @import './progress'; 7 | @import './list-group'; 8 | @import './dropdown-light'; 9 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/unified-merge-view/index.ts: -------------------------------------------------------------------------------- 1 | import styles from './use-unified-merge-view.module.scss'; 2 | 3 | export * from './use-unified-merge-view'; 4 | export const codemirrorEditorClassForUnifiedMergeView = 5 | styles['codemirror-editor']; 6 | -------------------------------------------------------------------------------- /apps/app/src/models/vo/external-account-login-error.ts: -------------------------------------------------------------------------------- 1 | export class ExternalAccountLoginError extends Error { 2 | args?: any; 3 | 4 | constructor(message = '', args = undefined) { 5 | super(); 6 | this.message = message; 7 | this.args = args; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/init.scss: -------------------------------------------------------------------------------- 1 | @import './init-stage-1'; 2 | @import './theming/variables'; 3 | @import './variables'; 4 | @import './variables-dark'; 5 | @import 'bootstrap/scss/variables'; 6 | @import 'bootstrap/scss/variables-dark'; 7 | @import './init-stage-2'; 8 | -------------------------------------------------------------------------------- /packages/core/src/consts/growi-plugin.ts: -------------------------------------------------------------------------------- 1 | export const GrowiPluginType = { 2 | Template: 'template', 3 | Style: 'style', 4 | Theme: 'theme', 5 | Script: 'script', 6 | } as const; 7 | export type GrowiPluginType = 8 | (typeof GrowiPluginType)[keyof typeof GrowiPluginType]; 9 | -------------------------------------------------------------------------------- /packages/editor/src/@types/scss.d.ts: -------------------------------------------------------------------------------- 1 | // prevent TS2307: Cannot find module './xxx.module.scss' or its corresponding type declarations. 2 | declare module '*.scss'; 3 | 4 | // prevent TS7016: Could not find a declaration file for module 'emoji-mart'. 5 | declare module 'emoji-mart'; 6 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/invalid-theme1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example-package-invalid-theme1", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "growiPlugin": { 6 | "schemaVersion": "4", 7 | "types": ["theme"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/admin/userResetPassword.ejs: -------------------------------------------------------------------------------- 1 | 안녕하세요, <%- email %>님 2 | 3 | 관리자에 의해 비밀번호가 재설정되었습니다. 다음 계정으로 로그인할 수 있습니다: 4 | 5 | 이메일: <%- email %> 6 | 새 비밀번호: <%- password %> 7 | (이 비밀번호는 자동으로 생성되었습니다. 처음 로그인할 때 변경해야 합니다) 8 | 9 | -- 10 | <%- appTitle %> 11 | <%- url %> -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/login-error.ts: -------------------------------------------------------------------------------- 1 | export const LoginErrorCode = { 2 | PROVIDER_DUPLICATED_USERNAME_EXCEPTION: 3 | 'provider-duplicated-username-exception', 4 | } as const; 5 | 6 | export type LoginErrorCode = 7 | (typeof LoginErrorCode)[keyof typeof LoginErrorCode]; 8 | -------------------------------------------------------------------------------- /packages/core/src/consts/accepted-upload-file-type.ts: -------------------------------------------------------------------------------- 1 | export const AcceptedUploadFileType = { 2 | ALL: 'all', 3 | IMAGE: 'image', 4 | NONE: 'none', 5 | } as const; 6 | export type AcceptedUploadFileType = 7 | (typeof AcceptedUploadFileType)[keyof typeof AcceptedUploadFileType]; 8 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "types": ["vitest/globals"] 6 | }, 7 | "include": ["src"], 8 | "exclude": ["test"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/utils/depth-utils.ts: -------------------------------------------------------------------------------- 1 | import { isTopPage } from '@growi/core/dist/utils/page-path-utils'; 2 | 3 | export const getDepthOfPath = (path: string): number => { 4 | if (isTopPage(path)) { 5 | return 0; 6 | } 7 | return (path.match(/\//g) ?? []).length; 8 | }; 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | insert_final_newline = false 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/userActivation.ejs: -------------------------------------------------------------------------------- 1 | 계정 확인 2 | 3 | 안녕하세요, <%- email %>님 4 | 5 | GROWI (<%- appTitle %>)에 계정이 생성되었습니다. 6 | 계정을 활성화하려면 아래 링크를 클릭하세요. 7 | 8 | <%- url %> 9 | 10 | 이 링크는 <%- expiredAt %>에 1시간 후에 만료됩니다. 11 | 12 | 계정을 만들지 않으셨다면 이 이메일을 무시하셔도 됩니다. -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/EditorNavbar/EditorNavbar.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .editor-navbar :global { 4 | min-height: 72px; 5 | 6 | @include bs.media-breakpoint-down(sm) { 7 | min-height: 96px; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/SystemVersion.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/helpers/modifier-keys'; 2 | 3 | .system-version :global { 4 | position: fixed; 5 | right: 0.5em; 6 | bottom: 0; 7 | opacity: 0.6; 8 | 9 | @include modifier-keys.modifier-key; 10 | } 11 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/certify-brand-logo.ts: -------------------------------------------------------------------------------- 1 | import type Crowi from '../crowi'; 2 | 3 | export const generateCertifyBrandLogoMiddleware = (crowi: Crowi) => { 4 | 5 | return async(req, res, next) => { 6 | req.isBrandLogo = true; 7 | next(); 8 | }; 9 | 10 | }; 11 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/growi-event-processor.ts: -------------------------------------------------------------------------------- 1 | import type { WebClient } from '@slack/web-api'; 2 | 3 | export interface GrowiEventProcessor { 4 | shouldHandleEvent(eventType: string): boolean; 5 | 6 | processEvent(client: WebClient, event: EVENT): Promise; 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/admin/userResetPassword.ejs: -------------------------------------------------------------------------------- 1 | こんにちは、 <%- email %> 2 | 3 | あなたのパスワードは管理者によってリセットされました。次のアカウントでログインできます。: 4 | 5 | Email: <%- email %> 6 | 新しいパスワード: <%- password %> 7 | (このパスワードは自動生成されます。 初回ログイン時にアップデートが必要です。) 8 | 9 | -- 10 | <%- appTitle %> 11 | <%- url %> 12 | -------------------------------------------------------------------------------- /apps/app/src/server/service/s2s-messaging/handlable.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The interface to handle server-to-server message 3 | */ 4 | export interface S2sMessageHandlable { 5 | 6 | shouldHandleS2sMessage(s2sMessage): boolean; 7 | 8 | handleS2sMessage(s2sMessage): Promise; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /apps/pdf-converter/src/bin/index.ts: -------------------------------------------------------------------------------- 1 | import { CliCore } from '@tsed/cli-core'; 2 | import { GenerateSwaggerCmd } from '@tsed/cli-generate-swagger'; 3 | 4 | import Server from '../server.js'; 5 | 6 | CliCore.bootstrap({ 7 | server: Server, 8 | commands: [GenerateSwaggerCmd], 9 | }); 10 | -------------------------------------------------------------------------------- /packages/core/src/interfaces/lang.ts: -------------------------------------------------------------------------------- 1 | export const Lang = { 2 | en_US: 'en_US', 3 | ja_JP: 'ja_JP', 4 | zh_CN: 'zh_CN', 5 | fr_FR: 'fr_FR', 6 | ko_KR: 'ko_KR', 7 | } as const; 8 | export const AllLang = Object.values(Lang); 9 | export type Lang = (typeof Lang)[keyof typeof Lang]; 10 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/ja_JP/template.md: -------------------------------------------------------------------------------- 1 | # {{{title}}}{{^title}}<企画タイトル>{{/title}} 2 | 3 | ## 目的 4 | 5 | 6 | ## 現状の課題 7 | 8 | 9 | ## 概要 10 | #### 企画の内容 11 | 12 | #### スケジュール 13 | 14 | 15 | ## 効果 16 | #### メリット 17 | 18 | #### 数値目標 19 | 20 | 21 | ## 参考資料 22 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/zh_CN/template.md: -------------------------------------------------------------------------------- 1 | # {{{title}}}{{^title}}<方案名称>{{/title}} 2 | 3 | ## 目的 4 | 5 | 6 | ## 当前面临的问题 7 | 8 | 9 | ## 策划详情 10 | #### 策划内容 11 | 12 | #### 活动流程 13 | 14 | 15 | ## 効果 16 | #### 意义与利处 17 | 18 | #### 最终目标 19 | 20 | 21 | ## 参考资料 22 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageComment/DeleteCommentModal.module.scss: -------------------------------------------------------------------------------- 1 | // modal 2 | .page-comment-delete-modal :global { 3 | .modal-content .modal-body { 4 | .comment-body { 5 | max-height: 13em; 6 | 7 | // scrollable 8 | overflow-y: auto; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_dropdown-light.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .dropdown-item:active{ 4 | --#{$prefix}dropdown-link-active-color: var(----#{$prefix}gray-600); 5 | --#{$prefix}dropdown-link-active-bg: var(----#{$prefix}gray-200); 6 | } 7 | -------------------------------------------------------------------------------- /packages/core-styles/scss/bootstrap/theming/_pagination.scss: -------------------------------------------------------------------------------- 1 | .pagination { 2 | --#{$prefix}pagination-active-color: #{$pagination-active-color}; 3 | --#{$prefix}pagination-active-bg: #{$pagination-active-bg}; 4 | --#{$prefix}pagination-active-border-color: #{$pagination-active-border-color}; 5 | } 6 | -------------------------------------------------------------------------------- /.markdownlint.yml: -------------------------------------------------------------------------------- 1 | ul-indent: 2 | indent: 4 3 | ul-style: false 4 | heading-style: false 5 | line-length: false 6 | no-multiple-blanks: false 7 | no-duplicate-heading: false 8 | no-inline-html: false 9 | no-trailing-punctuation: false 10 | 11 | MD002: false 12 | MD012: false 13 | MD041: false 14 | -------------------------------------------------------------------------------- /apps/app/src/client/components/CompleteUserRegistrationForm.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/atoms/placeholders/buttons'; 2 | 3 | :root { 4 | .complete-user-registration-form :global { 5 | .btn-register { 6 | @extend %btn-nologin; 7 | @extend %btn-register; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/app/src/features/search/utils/ai.ts: -------------------------------------------------------------------------------- 1 | export const isIncludeAiMenthion = (keyword: string): boolean => { 2 | return keyword.match(/(^|\s)@ai(\s|$)/) != null; 3 | }; 4 | 5 | export const removeAiMenthion = (keyword: string): string => { 6 | return keyword.replaceAll(/(^|\s)@ai(\s|$)/g, ''); 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/test-with-vite/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "baseUrl": "../", 6 | "paths": { 7 | "~/*": ["./src/*"], 8 | "^/*": ["./*"] 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/pdf-converter/docker/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | # Set permissions for shared directory for bulk export 6 | mkdir -p /tmp/page-bulk-export 7 | chown -R node:node /tmp/page-bulk-export 8 | chmod 700 /tmp/page-bulk-export 9 | 10 | exec gosu node node dist/index.js 11 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/admin/userInvitation.ejs: -------------------------------------------------------------------------------- 1 | 안녕하세요, <%- email %>님 2 | 3 | Wiki에 초대되셨습니다. 다음 계정으로 로그인할 수 있습니다: 4 | 5 | 이메일: <%- email %> 6 | 비밀번호: <%- password %> 7 | (이 비밀번호는 자동으로 생성되었습니다. 처음 로그인할 때 변경해야 합니다) 8 | 9 | 기다리고 있겠습니다! 10 | <%- url %> 11 | 12 | -- 13 | <%- appTitle %> 14 | <%- url %> -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/notifications/passwordReset.ejs: -------------------------------------------------------------------------------- 1 | 비밀번호 재설정 2 | 3 | 안녕하세요, <%- email %>님 4 | 5 | GROWI (<%- appTitle %>) 계정의 비밀번호 변경 요청이 접수되었습니다. 6 | 비밀번호를 재설정하려면 아래 링크를 클릭하세요. 7 | 8 | <%- url %> 9 | 10 | 이 링크는 <%- expiredAt %>에 10분 후에 만료됩니다. 11 | 12 | 비밀번호 재설정을 요청하지 않으셨다면 이 이메일을 무시하셔도 됩니다. -------------------------------------------------------------------------------- /apps/app/src/features/openai/server/services/client.ts: -------------------------------------------------------------------------------- 1 | import OpenAI from 'openai'; 2 | 3 | import { configManager } from '~/server/service/config-manager'; 4 | 5 | export const openaiClient = new OpenAI({ 6 | apiKey: configManager.getConfig('openai:apiKey'), // This is the default and can be omitted 7 | }); 8 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/customize.ts: -------------------------------------------------------------------------------- 1 | import type { GrowiThemeMetadata } from '@growi/core'; 2 | 3 | export type IResLayoutSetting = { 4 | isContainerFluid: boolean; 5 | }; 6 | 7 | export type IResGrowiTheme = { 8 | currentTheme: string; 9 | pluginThemesMetadatas: GrowiThemeMetadata[]; 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/src/services/layout/use-editor-mode-class-name.ts: -------------------------------------------------------------------------------- 1 | import { useEditorMode } from '~/stores-universal/ui'; 2 | 3 | export const useEditorModeClassName = (): string => { 4 | const { getClassNamesByEditorMode } = useEditorMode(); 5 | 6 | return `${getClassNamesByEditorMode().join(' ') ?? ''}`; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/src/utils/array-utils.ts: -------------------------------------------------------------------------------- 1 | // converts non-array item to array 2 | 3 | export const toArrayIfNot = (item?: T | T[]): T[] => { 4 | if (item == null) { 5 | return []; 6 | } 7 | 8 | if (Array.isArray(item)) { 9 | return item; 10 | } 11 | 12 | return [item]; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/core/src/utils/browser-utils.ts: -------------------------------------------------------------------------------- 1 | export const isClient = (): boolean => { 2 | return ( 3 | typeof window !== 'undefined' || 4 | (typeof navigator !== 'undefined' && navigator.webdriver) 5 | ); 6 | }; 7 | 8 | export const isServer = (): boolean => { 9 | return !isClient(); 10 | }; 11 | -------------------------------------------------------------------------------- /packages/editor/src/client/components-internal/CodeMirrorEditor/Toolbar/Toolbar.module.scss: -------------------------------------------------------------------------------- 1 | .codemirror-editor-toolbar :global { 2 | @import './scss/toolbar-button'; 3 | 4 | // center the toolbar vertically 5 | .simplebar-offset { 6 | display: flex; 7 | align-items: center; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/invalid-template1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example-package-invalid-template1", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "growiPlugin": { 6 | "schemaVersion": "4", 7 | "types": [ 8 | "template" 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/slackbot-types.ts: -------------------------------------------------------------------------------- 1 | export const SlackbotType = { 2 | OFFICIAL: 'officialBot', 3 | CUSTOM_WITHOUT_PROXY: 'customBotWithoutProxy', 4 | CUSTOM_WITH_PROXY: 'customBotWithProxy', 5 | } as const; 6 | 7 | export type SlackbotType = (typeof SlackbotType)[keyof typeof SlackbotType]; 8 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/SlackIntegration/slack-integration-util.ts: -------------------------------------------------------------------------------- 1 | export const addLogs = (log: string, newLogMessage:string, newLogCode?: string): string => { 2 | const newLog = `${new Date()} - ${newLogCode ? `${newLogCode}, ` : ''}${newLogMessage}\n\n`; 3 | return `${newLog}${log ?? ''}`; 4 | }; 5 | -------------------------------------------------------------------------------- /apps/app/src/styles/atoms/_code.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/variables' as var; 2 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 3 | 4 | /* 5 | * style of inline-code 6 | */ 7 | code:not([class^='language-']) { 8 | padding: 2px 4px; 9 | border: 1px solid; 10 | border-radius: bs.$border-radius; 11 | } 12 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/src/micromark-extension-growi-directive/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('./lib/html.js').Handle} Handle 3 | * @typedef {import('./lib/html.js').HtmlOptions} HtmlOptions 4 | */ 5 | 6 | export { directiveHtml } from './lib/html.js'; 7 | export { directive } from './lib/syntax.js'; 8 | -------------------------------------------------------------------------------- /packages/slack/src/utils/logger/index.ts: -------------------------------------------------------------------------------- 1 | import type Logger from 'bunyan'; 2 | import { createLogger } from 'universal-bunyan'; 3 | 4 | const loggerFactory = (name: string): Logger => 5 | createLogger({ 6 | name, 7 | config: { default: 'info' }, 8 | }); 9 | 10 | export default loggerFactory; 11 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/userActivation.ejs: -------------------------------------------------------------------------------- 1 | 仮登録完了のお知らせ 2 | 3 | <%- email %> さん 4 | 5 | GROWI (<%- appTitle %>) で仮登録が完了いたしました。 6 | 7 | ご本人様確認のため、下記リンクをクリックし、アカウントの本登録を完了させて下さい。 8 | 9 | <%- url %> 10 | 11 | このリンクは1時間後の <%- expiredAt %> に失効します。 12 | 13 | ※当メールの内容に心当たりがない場合は、このメールを無視してください。 14 | -------------------------------------------------------------------------------- /packages/core/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import tsconfigPaths from 'vite-tsconfig-paths'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [tsconfigPaths()], 6 | test: { 7 | environment: 'node', 8 | clearMocks: true, 9 | globals: true, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /packages/slack/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import tsconfigPaths from 'vite-tsconfig-paths'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [tsconfigPaths()], 6 | test: { 7 | environment: 'node', 8 | clearMocks: true, 9 | globals: true, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Bookmarks/BookmarkFolderMenu.module.scss: -------------------------------------------------------------------------------- 1 | .grw-bookmark-folder-menu :global { 2 | max-width: 65%; 3 | 4 | .grw-bookmark-folder-menu-item-folder-first { 5 | padding-left: 40px; 6 | } 7 | .grw-bookmark-folder-menu-item-folder-second { 8 | padding-left: 60px; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/app/src/server/models/.eslintrc.js: -------------------------------------------------------------------------------- 1 | const rulesDirPlugin = require('eslint-plugin-rulesdir'); 2 | 3 | rulesDirPlugin.RULES_DIR = 'src/server/models/eslint-rules-dir'; 4 | 5 | module.exports = { 6 | plugins: [ 7 | 'rulesdir', 8 | ], 9 | rules: { 10 | 'rulesdir/no-populate': 'warn', 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /packages/custom-icons/svg/header.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/src/client/components/index.ts: -------------------------------------------------------------------------------- 1 | export { Gallery, GalleryImmutable } from './Gallery'; 2 | export { Ref, RefImmutable } from './Ref'; 3 | export { RefImg, RefImgImmutable } from './RefImg'; 4 | export { Refs, RefsImmutable } from './Refs'; 5 | export { RefsImg, RefsImgImmutable } from './RefsImg'; 6 | -------------------------------------------------------------------------------- /packages/ui/scss/molecules/_user-list-popover.scss: -------------------------------------------------------------------------------- 1 | %user-list-popover { 2 | --bs-popover-max-width: 200px; 3 | --bs-popover-body-padding-x: .5rem; 4 | --bs-popover-body-padding-y: .5rem; 5 | 6 | .user-list-content { 7 | direction: rtl; 8 | } 9 | .cls-1 { 10 | isolation: isolate; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "jsx": "react-jsx", 6 | 7 | "baseUrl": ".", 8 | "paths": { 9 | "~/*": ["./src/*"] 10 | } 11 | }, 12 | "include": ["src"] 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/admin/userInvitation.ejs: -------------------------------------------------------------------------------- 1 | こんにちは、 <%- email %> 2 | 3 | GROWIに招待されました!次のアカウント情報でログインしてください: 4 | 5 | Email: <%- email %> 6 | Password: <%- password %> 7 | (このパスワードは自動生成されます。 初回ログイン時にアップデートが必要です。) 8 | 9 | あなたの参加を心よりお待ちしております。 10 | <%- url %> 11 | 12 | -- 13 | <%- appTitle %> 14 | <%- url %> 15 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/notifications/passwordReset.ejs: -------------------------------------------------------------------------------- 1 | パスワード リセット 2 | 3 | こんにちは, <%- email %> 4 | 5 | あなたのGROWI (<%- appTitle %>) アカウントから、パスワード再設定のリクエストがありました。 6 | パスワードをリセットするには、以下のリンクをクリックしてください。 7 | 8 | <%- url %> 9 | 10 | このリンクは10分後の <%- expiredAt %> に失効します。 11 | 12 | もしこのリクエストに心当たりがない場合は、このメールを無視してください。 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/SearchPage/SearchResultContent.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/mixins'; 2 | 3 | /* stylelint-disable-next-line block-no-empty */ 4 | .search-result-content :global { 5 | } 6 | 7 | .fluid-layout :global { 8 | .grw-container-convertible { 9 | @include mixins.fluid-layout(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/interfaces/ai.ts: -------------------------------------------------------------------------------- 1 | export const OpenaiServiceType = { 2 | OPENAI: 'openai', 3 | AZURE_OPENAI: 'azure-openai', 4 | } as const; 5 | export type OpenaiServiceType = 6 | (typeof OpenaiServiceType)[keyof typeof OpenaiServiceType]; 7 | export const OpenaiServiceTypes = Object.values(OpenaiServiceType); 8 | -------------------------------------------------------------------------------- /apps/app/src/stores/page-redirect.tsx: -------------------------------------------------------------------------------- 1 | import type { SWRResponse } from 'swr'; 2 | 3 | import { useStaticSWR } from './use-static-swr'; 4 | 5 | export const useRedirectFrom = ( 6 | initialData?: string | null, 7 | ): SWRResponse => { 8 | return useStaticSWR('redirectFrom', initialData); 9 | }; 10 | -------------------------------------------------------------------------------- /packages/editor/src/interfaces/editing-client.ts: -------------------------------------------------------------------------------- 1 | import type { IUser } from '@growi/core'; 2 | 3 | export type EditingClient = Pick & 4 | Partial> & { 5 | clientId: number; 6 | userId?: string; 7 | color: string; 8 | colorLight: string; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/src/utils/logger/index.ts: -------------------------------------------------------------------------------- 1 | import type Logger from 'bunyan'; 2 | import { createLogger } from 'universal-bunyan'; 3 | 4 | const loggerFactory = (name: string): Logger => 5 | createLogger({ 6 | name, 7 | config: { default: 'info' }, 8 | }); 9 | 10 | export default loggerFactory; 11 | -------------------------------------------------------------------------------- /packages/slack/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "~/*": ["./src/*"] 8 | }, 9 | "types": ["vitest/globals"] 10 | }, 11 | "include": ["src"] 12 | } 13 | -------------------------------------------------------------------------------- /apps/app/src/pages/login/index.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | // layout 4 | .login-page :global { 5 | 6 | .nologin-header, 7 | .nologin-dialog { 8 | width: 420px; 9 | 10 | @include bs.media-breakpoint-down(sm) { 11 | width: 320px; 12 | } 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /apps/app/src/server/util/formUtil.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | normalizeCRLFFilter(value) { 3 | return value.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); 4 | }, 5 | stringToArrayFilter(value) { 6 | if (!value || value === '') { 7 | return []; 8 | } 9 | 10 | return value.split('\n'); 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /packages/core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "~/*": ["./src/*"] 8 | }, 9 | "types": ["vitest/globals"] 10 | }, 11 | "include": ["src", "test"] 12 | } 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/App/MaskedInput.module.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable selector-class-pattern */ 2 | 3 | .MaskedInput { 4 | position: relative; 5 | display: flex; 6 | } 7 | 8 | .PasswordReveal { 9 | position: absolute; 10 | top: 0; 11 | right: 0.5rem; 12 | left: auto; 13 | font-size: 1.4rem; 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/src/styles/_installer.scss: -------------------------------------------------------------------------------- 1 | #installer-form-container > .grw-custom-nav-tab { 2 | .nav-title { 3 | width: 100%; 4 | li { 5 | width: 100%; 6 | text-align: center; 7 | } 8 | } 9 | .nav-link { 10 | color: white; 11 | } 12 | .grw-nav-slide-hr { 13 | border-color: white; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/editor/README.md: -------------------------------------------------------------------------------- 1 | # `@growi/editor` 2 | 3 | ## Development with vite 4 | 5 | ```bash 6 | cd packages/editor 7 | pnpm run serve 8 | ``` 9 | 10 | ## Playground 11 | 12 | If you need to simulate something `@growi/app` feature, you can implement it into the playground. 13 | See the `components/playground` directory. 14 | 15 | -------------------------------------------------------------------------------- /packages/editor/src/consts/paste-mode.ts: -------------------------------------------------------------------------------- 1 | export const PasteMode = { 2 | both: 'both', 3 | text: 'text', 4 | file: 'file', 5 | } as const; 6 | 7 | export const DEFAULT_PASTE_MODE = PasteMode.both; 8 | export const AllPasteMode = Object.values(PasteMode); 9 | export type PasteMode = (typeof PasteMode)[keyof typeof PasteMode]; 10 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import tsconfigPaths from 'vite-tsconfig-paths'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [tsconfigPaths()], 6 | test: { 7 | environment: 'node', 8 | clearMocks: true, 9 | globals: true, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /apps/app/config/ci/.env.local.for-auto-install: -------------------------------------------------------------------------------- 1 | APP_SITE_URL=http://localhost:3000 2 | 3 | AUTO_INSTALL_ADMIN_USERNAME=admin 4 | AUTO_INSTALL_ADMIN_NAME=Admin 5 | AUTO_INSTALL_ADMIN_EMAIL=admin@example.com 6 | AUTO_INSTALL_ADMIN_PASSWORD=adminadmin 7 | AUTO_INSTALL_GLOBAL_LANG=en_US 8 | 9 | AUTO_INSTALL_SERVER_DATE=2022-01-01T00:00:00.0 10 | -------------------------------------------------------------------------------- /apps/app/src/components/Admin/Common/AdminNavigation.module.scss: -------------------------------------------------------------------------------- 1 | // button layout 2 | .admin-navigation { 3 | &:global { 4 | & > a + a { 5 | margin-top: 2px; 6 | } 7 | } 8 | } 9 | 10 | // sticky settings 11 | .admin-navigation { 12 | &:global { 13 | &.sticky-top { 14 | top: 30px; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apps/app/src/server/service/s2s-messaging/redis.ts: -------------------------------------------------------------------------------- 1 | import type Crowi from '~/server/crowi'; 2 | import loggerFactory from '~/utils/logger'; 3 | 4 | const logger = loggerFactory('growi:service:s2s-messaging:redis'); 5 | 6 | module.exports = function(crowi: Crowi) { 7 | logger.warn('Config pub/sub with Redis has not implemented yet.'); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/editor/src/consts/global-code-mirror-editor-key.ts: -------------------------------------------------------------------------------- 1 | export const GlobalCodeMirrorEditorKey = { 2 | MAIN: 'main', 3 | COMMENT_NEW: 'comment_new', 4 | DIFF: 'diff', 5 | READONLY: 'readonly', 6 | } as const; 7 | export type GlobalCodeMirrorEditorKey = 8 | (typeof GlobalCodeMirrorEditorKey)[keyof typeof GlobalCodeMirrorEditorKey]; 9 | -------------------------------------------------------------------------------- /packages/slack/src/consts/required-scopes.ts: -------------------------------------------------------------------------------- 1 | export const requiredScopes: string[] = [ 2 | 'commands', 3 | 'team:read', 4 | 'chat:write', 5 | 'chat:write.public', 6 | 'channels:join', 7 | 'channels:history', 8 | 'groups:history', 9 | 'im:history', 10 | 'mpim:history', 11 | 'links:read', 12 | 'links:write', 13 | ]; 14 | -------------------------------------------------------------------------------- /apps/app/src/server/service/interfaces/export.ts: -------------------------------------------------------------------------------- 1 | import type { Stats } from 'fs'; 2 | 3 | export type ZipFileStat = { 4 | meta: object; 5 | fileName: string; 6 | zipFilePath: string; 7 | fileStat: Stats; 8 | innerFileStats: { 9 | fileName: string; 10 | collectionName: string; 11 | size: number; 12 | }[]; 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/src/utils/to-array-from-csv.ts: -------------------------------------------------------------------------------- 1 | // converts csv item to array 2 | export const toArrayFromCsv = (text: string): string[] => { 3 | if (text == null) { 4 | return []; 5 | } 6 | 7 | const array = text 8 | .split(',') 9 | .map((el) => el.trim()) 10 | .filter((el) => el !== ''); 11 | 12 | return array; 13 | }; 14 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/external-auth-provider.ts: -------------------------------------------------------------------------------- 1 | export const IExternalAuthProviderType = { 2 | ldap: 'ldap', 3 | saml: 'saml', 4 | oidc: 'oidc', 5 | google: 'google', 6 | github: 'github', 7 | } as const; 8 | 9 | export type IExternalAuthProviderType = 10 | (typeof IExternalAuthProviderType)[keyof typeof IExternalAuthProviderType]; 11 | -------------------------------------------------------------------------------- /apps/app/src/server/util/createApiRouter.ts: -------------------------------------------------------------------------------- 1 | import express, { type Router } from 'express'; 2 | 3 | import CertifyOrigin from '~/server/middlewares/certify-origin'; 4 | 5 | function createApiRouter(): Router { 6 | const router = express.Router(); 7 | router.use(CertifyOrigin); 8 | return router; 9 | } 10 | 11 | export { createApiRouter }; 12 | -------------------------------------------------------------------------------- /apps/app/src/server/util/getToday.js: -------------------------------------------------------------------------------- 1 | /** 2 | * getToday 3 | */ 4 | 5 | module.exports = () => { 6 | const today = new Date(); 7 | const month = `0${today.getMonth() + 1}`.slice(-2); 8 | const day = `0${today.getDate()}`.slice(-2); 9 | const dateString = `${today.getFullYear()}/${month}/${day}`; 10 | 11 | return dateString; 12 | }; 13 | -------------------------------------------------------------------------------- /apps/app/src/utils/object-utils.ts: -------------------------------------------------------------------------------- 1 | // remove property if value is null 2 | 3 | export const removeNullPropertyFromObject = ( 4 | object: T, 5 | ): T => { 6 | for (const [key, value] of Object.entries(object)) { 7 | if (value == null) { 8 | delete object[key]; 9 | } 10 | } 11 | 12 | return object; 13 | }; 14 | -------------------------------------------------------------------------------- /apps/app/src/utils/page-operation.ts: -------------------------------------------------------------------------------- 1 | import type { IPageOperationProcessData } from '~/interfaces/page-operation'; 2 | 3 | export const shouldRecoverPagePaths = ( 4 | processData: IPageOperationProcessData, 5 | ): boolean => { 6 | return processData.Rename?.Sub != null 7 | ? processData.Rename.Sub.isProcessable 8 | : false; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/editor/src/consts/keymaps.ts: -------------------------------------------------------------------------------- 1 | const KeyMapMode = { 2 | default: 'default', 3 | vim: 'vim', 4 | emacs: 'emacs', 5 | vscode: 'vscode', 6 | } as const; 7 | 8 | export const DEFAULT_KEYMAP = 'default'; 9 | export const AllKeyMap = Object.values(KeyMapMode); 10 | export type KeyMapMode = (typeof KeyMapMode)[keyof typeof KeyMapMode]; 11 | -------------------------------------------------------------------------------- /packages/remark-lsx/src/utils/depth-utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { getDepthOfPath } from './depth-utils'; 2 | 3 | describe('getDepthOfPath()', () => { 4 | it('returns 0 when the path does not include slash', () => { 5 | // when 6 | const result = getDepthOfPath('Sandbox'); 7 | 8 | // then 9 | expect(result).toBe(0); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /apps/app/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ext": "js,ts,json", 3 | "watch": [".", "../../packages/**/dist"], 4 | "ignore": [ 5 | ".next", 6 | "public/static", 7 | "package.json", 8 | "playwright", 9 | "src/client", 10 | "src/**/client", 11 | "test", 12 | "test-with-vite", 13 | "tmp", 14 | "*.mongodb.js" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /apps/app/playwright/auth.setup.ts: -------------------------------------------------------------------------------- 1 | import { test as setup } from '@playwright/test'; 2 | 3 | import { login } from './utils/Login'; 4 | 5 | // Commonised login process for use elsewhere 6 | // see: https://github.com/microsoft/playwright/issues/22114 7 | setup('Authenticate as the "admin" user', async ({ page }) => { 8 | await login(page); 9 | }); 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageControls/SearchButton.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | @use '@growi/ui/scss/atoms/btn-muted'; 3 | @use './button-styles'; 4 | 5 | .btn-search :global { 6 | @extend %btn-basis; 7 | } 8 | 9 | // == Colors 10 | .btn-search { 11 | @include btn-muted.colorize(bs.$success); 12 | } 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageHistory/Revision.module.scss: -------------------------------------------------------------------------------- 1 | .revision-history-main :global { 2 | img.user-picture-lg { 3 | width: 32px; 4 | height: 32px; 5 | } 6 | } 7 | 8 | .revision-history-main-nodiff :global { 9 | .picture-container { 10 | min-width: 32px; 11 | text-align: center; // centering .picture 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageTimeline.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .card-timeline :global { 4 | margin-bottom: 3rem; 5 | border: 1px solid bs.$gray-300; 6 | 7 | .card-header { 8 | background-color: bs.$gray-300; 9 | } 10 | 11 | .card-body { 12 | min-height: 15vh; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/remark-attachment-refs/src/server/index.ts: -------------------------------------------------------------------------------- 1 | import { routesFactory } from './routes/refs'; 2 | 3 | // biome-ignore lint/suspicious/noExplicitAny: ignore 4 | const middleware = (crowi: any, app: any): void => { 5 | const refs = routesFactory(crowi); 6 | 7 | app.use('/_api/attachment-refs', refs); 8 | }; 9 | 10 | export default middleware; 11 | -------------------------------------------------------------------------------- /apps/app/src/client/components/SearchPage.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | @use '@growi/ui/scss/atoms/btn-muted'; 3 | 4 | .search-page :global { 5 | .btn.btn-muted-danger { 6 | @include btn-muted.colorize(bs.$danger, bs.$secondary); 7 | 8 | --bs-btn-active-bg: rgba(var(--bs-danger-rgb), 0.3); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/editor/src/client/services-internal/index.ts: -------------------------------------------------------------------------------- 1 | export * from './editor-theme'; 2 | export * from './extensions'; 3 | export * from './file-dropzone'; 4 | export * from './keymaps'; 5 | export * from './link-util'; 6 | export * from './list-util'; 7 | export * from './paste-util'; 8 | export * from './table'; 9 | export * from './unified-merge-view'; 10 | -------------------------------------------------------------------------------- /packages/editor/src/client/services/use-codemirror-editor/utils/focus.ts: -------------------------------------------------------------------------------- 1 | import { useCallback } from 'react'; 2 | import type { EditorView } from '@codemirror/view'; 3 | 4 | export type Focus = () => void; 5 | 6 | export const useFocus = (view?: EditorView): Focus => { 7 | return useCallback(() => { 8 | view?.focus?.(); 9 | }, [view]); 10 | }; 11 | -------------------------------------------------------------------------------- /packages/pluginkit/test/fixtures/example-package/template1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example-package-template1", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "growiPlugin": { 6 | "schemaVersion": "4", 7 | "types": [ 8 | "template" 9 | ], 10 | "locales": [ 11 | "en_US", "ja_JP", "zh_CN" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/.env.test: -------------------------------------------------------------------------------- 1 | ## 2 | ## Handled by vite 3 | ## https://vitejs.dev/guide/env-and-mode.html 4 | ## 5 | ## > To prevent accidentally leaking env variables to the client, only variables prefixed with 6 | ## > VITE_ are exposed to your Vite-processed code. e.g. for the following env variables: 7 | ## 8 | VITE_MONGOMS_VERSION="6.0.9" 9 | # VITE_MONGOMS_DEBUG=1 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/ResizableArea/props.d.ts: -------------------------------------------------------------------------------- 1 | export type ResizableAreaProps = { 2 | className?: string, 3 | width?: number, 4 | minWidth?: number, 5 | disabled?: boolean, 6 | children?: React.ReactNode, 7 | onResize?: (newWidth: number) => void, 8 | onResizeDone?: (newWidth: number) => void, 9 | onCollapsed?: () => void, 10 | } 11 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/interfaces/message-error.ts: -------------------------------------------------------------------------------- 1 | export const MessageErrorCode = { 2 | THREAD_ID_IS_NOT_SET: 'thread-id-is-not-set', 3 | } as const; 4 | 5 | export const StreamErrorCode = { 6 | BUDGET_EXCEEDED: 'budget-exceeded', 7 | } as const; 8 | 9 | export type StreamErrorCode = 10 | (typeof StreamErrorCode)[keyof typeof StreamErrorCode]; 11 | -------------------------------------------------------------------------------- /apps/app/src/features/search/client/interfaces/downshift.ts: -------------------------------------------------------------------------------- 1 | import type { ControllerStateAndHelpers } from 'downshift'; 2 | 3 | export type DownshiftItem = { url: string }; 4 | 5 | export type GetItemProps = 6 | ControllerStateAndHelpers['getItemProps']; 7 | export type GetInputProps = 8 | ControllerStateAndHelpers['getInputProps']; 9 | -------------------------------------------------------------------------------- /apps/app/src/services/renderer/markdown-it/PreProcessor/EasyGrid.js: -------------------------------------------------------------------------------- 1 | export default class EasyGrid { 2 | process(markdown) { 3 | // see: https://regex101.com/r/7NWvUU/2 4 | return markdown.replace( 5 | /:::\s*editable-row[\r\n]((.|[\r\n])*?)[\r\n]:::/gm, 6 | (all, group) => { 7 | return group; 8 | }, 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/app/src/utils/gravatar.ts: -------------------------------------------------------------------------------- 1 | import md5 from 'md5'; 2 | 3 | export const GRAVATAR_DEFAULT = 4 | 'https://gravatar.com/avatar/00000000000000000000000000000000?s=24'; 5 | 6 | export const generateGravatarSrc = (email?: string): string => { 7 | const hash = md5((email ?? '').trim().toLowerCase()); 8 | return `https://gravatar.com/avatar/${hash}`; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/test/integration/global-teardown.js: -------------------------------------------------------------------------------- 1 | /** ********************************************************** 2 | * Caution 3 | * 4 | * Module aliases by compilerOptions.paths in tsconfig.json 5 | * are NOT available in setup scripts 6 | *********************************************************** */ 7 | 8 | module.exports = async () => {}; 9 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v61x/mdcont.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | const oldMdcontPrefixRegExp = /#mdcont-/g; 11 | return body.replace(oldMdcontPrefixRegExp, '#'); 12 | }, 13 | ]; 14 | -------------------------------------------------------------------------------- /packages/remark-drawio/src/utils/global.ts: -------------------------------------------------------------------------------- 1 | import type { IGraphViewerGlobal } from '../interfaces/graph-viewer'; 2 | 3 | export const isGraphViewerGlobal = ( 4 | val: unknown, 5 | ): val is IGraphViewerGlobal => { 6 | return ( 7 | typeof val === 'function' && 8 | 'createViewerForElement' in val && 9 | 'processElements' in val 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /packages/ui/src/interfaces/popper-data.ts: -------------------------------------------------------------------------------- 1 | interface Rect { 2 | top: number; 3 | left: number; 4 | width: number; 5 | height: number; 6 | } 7 | 8 | export interface PopperData { 9 | styles: Partial; 10 | offsets: { 11 | popper: Rect; 12 | reference: Rect; 13 | arrow: { top: number; left: number }; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Presentation/Slides.tsx: -------------------------------------------------------------------------------- 1 | import type { JSX } from 'react'; 2 | 3 | import { Slides as SlidesSubstance, type SlidesProps } from '@growi/presentation/dist/client'; 4 | 5 | import '@growi/presentation/dist/style.css'; 6 | 7 | export const Slides = (props: SlidesProps): JSX.Element => { 8 | return ; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/SidebarNav/SkeletonItem.tsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | 3 | import { Skeleton } from '~/client/components/Skeleton'; 4 | 5 | import styles from './SkeletonItem.module.scss'; 6 | 7 | 8 | export const SkeletonItem = memo(() => { 9 | return ; 10 | }); 11 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/client/components/AiAssistant/AiAssistantManagementModal/AiAssistantManagementPageTreeSelection.module.scss: -------------------------------------------------------------------------------- 1 | .grw-ai-assistant-management-page-tree-selection :global { 2 | .next-button { 3 | width: 30%; 4 | } 5 | 6 | .page-tree-item { 7 | .list-group-item { 8 | padding: 0.4rem 1rem !important; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/utils/handle-if-successfully-parsed.ts: -------------------------------------------------------------------------------- 1 | import type { z } from 'zod'; 2 | 3 | export const handleIfSuccessfullyParsed = ( 4 | data: T, 5 | zSchema: z.ZodSchema, 6 | callback: (data: T) => void, 7 | ): void => { 8 | const parsed = zSchema.safeParse(data); 9 | if (parsed.success) { 10 | callback(data); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/mongoose-utils.ts: -------------------------------------------------------------------------------- 1 | export interface PaginateResult { 2 | docs: T[]; 3 | hasNextPage: boolean; 4 | hasPrevPage: boolean; 5 | limit: number; 6 | nextPage: number | null; 7 | offset: number; 8 | page: number; 9 | pagingCounter: number; 10 | prevPage: number | null; 11 | totalDocs: number; 12 | totalPages: number; 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/named-query.ts: -------------------------------------------------------------------------------- 1 | import type { IUser } from '@growi/core'; 2 | 3 | export enum SearchDelegatorName { 4 | DEFAULT = 'FullTextSearch', 5 | PRIVATE_LEGACY_PAGES = 'PrivateLegacyPages', 6 | } 7 | export interface INamedQuery { 8 | name: string; 9 | aliasOf?: string; 10 | delegatorName?: SearchDelegatorName; 11 | creator?: IUser; 12 | } 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Admin/NotFoundPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { type JSX } from 'react'; 2 | 3 | import { useTranslation } from 'next-i18next'; 4 | 5 | export const AdminNotFoundPage = (): JSX.Element => { 6 | const { t } = useTranslation('commons'); 7 | 8 | return ( 9 |

{t('not_found_page.page_not_exist')}

10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Common/SubmittableInput/types.d.ts: -------------------------------------------------------------------------------- 1 | export type SubmittableInputProps = InputHTMLAttributes> = 2 | Omit, 'value' | 'onKeyDown' | 'onSubmit'> 3 | & { 4 | value?: string, 5 | onSubmit?: (inputText: string) => void, 6 | onCancel?: () => void, 7 | } 8 | -------------------------------------------------------------------------------- /apps/app/src/client/components/ItemsTree/ItemsTreeContentSkeleton.module.scss: -------------------------------------------------------------------------------- 1 | @use '~/styles/mixins'; 2 | 3 | .text-skeleton-level1 { 4 | @include mixins.grw-skeleton-text($font-size:16px, $line-height: 40px); 5 | 6 | padding-left: 12px; 7 | } 8 | 9 | .text-skeleton-level2 { 10 | @extend .text-skeleton-level1; 11 | 12 | padding-left: 12px + 10px * 2; 13 | } 14 | -------------------------------------------------------------------------------- /apps/app/src/client/interfaces/selectable-all.ts: -------------------------------------------------------------------------------- 1 | export interface ISelectable { 2 | select: () => void, 3 | deselect: () => void, 4 | } 5 | 6 | export interface ISelectableAndIndeterminatable extends ISelectable { 7 | setIndeterminate: () => void, 8 | } 9 | 10 | export interface ISelectableAll { 11 | selectAll: () => void, 12 | deselectAll: () => void, 13 | } 14 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/interfaces/slack-to-growi/slack-oauth-req.ts: -------------------------------------------------------------------------------- 1 | import type { RequestFromSlack } from '@growi/slack'; 2 | import type { AuthorizeResult } from '@slack/oauth'; 3 | import type { Req } from '@tsed/common'; 4 | 5 | export type SlackOauthReq = Req & 6 | RequestFromSlack & { 7 | authorizeResult: AuthorizeResult; 8 | growiUri?: string; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/custom-icons/svg/format_quote.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/admin/userResetPassword.ejs: -------------------------------------------------------------------------------- 1 | Hi, <%- email %> 2 | 3 | Your password has been reset by the administrator, you can log in with following account: 4 | 5 | Email: <%- email %> 6 | New Password: <%- password %> 7 | (This password was auto generated. Update required at the first time you logging in) 8 | 9 | -- 10 | <%- appTitle %> 11 | <%- url %> 12 | -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/admin/userResetPassword.ejs: -------------------------------------------------------------------------------- 1 | Hi, <%- email %> 2 | 3 | Your password has been reset by the administrator, you can log in with following account: 4 | 5 | Email: <%- email %> 6 | New Password: <%- password %> 7 | (This password was auto generated. Update required at the first time you logging in) 8 | 9 | -- 10 | <%- appTitle %> 11 | <%- url %> 12 | -------------------------------------------------------------------------------- /apps/app/src/components/Common/PagePathNav/Separator.tsx: -------------------------------------------------------------------------------- 1 | import type { JSX } from 'react'; 2 | 3 | import styles from './Separator.module.scss'; 4 | 5 | export const Separator = ({ 6 | className, 7 | }: { 8 | className?: string; 9 | }): JSX.Element => ( 10 | 11 | / 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/v5-conversion-error.ts: -------------------------------------------------------------------------------- 1 | export const V5ConversionErrCode = { 2 | GRANT_INVALID: 'GrantInvalid', 3 | PAGE_NOT_FOUND: 'PageNotFound', 4 | DUPLICATE_PAGES_FOUND: 'DuplicatePagesFound', 5 | FORBIDDEN: 'Forbidden', 6 | } as const; 7 | 8 | export type V5ConversionErrCode = 9 | (typeof V5ConversionErrCode)[keyof typeof V5ConversionErrCode]; 10 | -------------------------------------------------------------------------------- /apps/app/src/utils/swr-utils.ts: -------------------------------------------------------------------------------- 1 | import { isServer } from '@growi/core/dist/utils'; 2 | 3 | export const swrGlobalConfiguration = Object.assign( 4 | { 5 | errorRetryCount: 1, 6 | }, 7 | // set the request scoped cache provider in server 8 | isServer() 9 | ? { 10 | provider: (cache: any) => new Map(cache), 11 | } 12 | : {}, 13 | ); 14 | -------------------------------------------------------------------------------- /packages/preset-templates/dist/project-proposal/en_US/template.md: -------------------------------------------------------------------------------- 1 | # {{{title}}}{{^title}}<Project Title>{{/title}} 2 | 3 | ## GOALS 4 | 5 | 6 | ## CURRENT PROBLEMS 7 | 8 | 9 | ## OVERVIEW 10 | #### Project Description 11 | 12 | #### Schedule 13 | 14 | 15 | ## OUTCOME 16 | #### Merits/Pros 17 | 18 | #### Targets (with statistics) 19 | 20 | 21 | 22 | ## REFERENCES 23 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Sidebar/SidebarNav/SkeletonItem.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | @use '../variables' as sidebarVar; 3 | 4 | .grw-skeleton-item :global { 5 | height: sidebarVar.$grw-sidebar-button-height; 6 | padding: .75rem; 7 | 8 | .grw-skeleton { 9 | background-color: var(--bs-secondary-bg-subtle); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/utils/remove-glob-path.ts: -------------------------------------------------------------------------------- 1 | export const removeGlobPath = (pagePathPattens?: string[]): string[] => { 2 | if (pagePathPattens == null) { 3 | return []; 4 | } 5 | return pagePathPattens.map((pagePathPattern) => { 6 | return pagePathPattern.endsWith('/*') 7 | ? pagePathPattern.slice(0, -2) 8 | : pagePathPattern; 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/cdn.ts: -------------------------------------------------------------------------------- 1 | export type CdnManifestArgs = { 2 | integrity?: string; 3 | async?: boolean; 4 | defer?: boolean; 5 | }; 6 | 7 | export type CdnManifest = { 8 | name: string; 9 | url: string; 10 | groups?: string[]; 11 | args?: CdnManifestArgs; 12 | }; 13 | 14 | export type CdnResource = { 15 | manifest: CdnManifest; 16 | outDir: string; 17 | }; 18 | -------------------------------------------------------------------------------- /apps/app/src/server/events/admin.js: -------------------------------------------------------------------------------- 1 | const events = require('events'); 2 | const util = require('util'); 3 | 4 | /** @param {import('~/server/crowi').default} crowi Crowi instance */ 5 | function AdminEvent(crowi) { 6 | this.crowi = crowi; 7 | 8 | events.EventEmitter.call(this); 9 | } 10 | util.inherits(AdminEvent, events.EventEmitter); 11 | 12 | module.exports = AdminEvent; 13 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/access-token-parser/extract-bearer-token.ts: -------------------------------------------------------------------------------- 1 | export const extractBearerToken = (authHeader: string | undefined): string | null => { 2 | if (authHeader == null) { 3 | return null; 4 | } 5 | 6 | if (!authHeader.startsWith('Bearer ')) { 7 | return null; 8 | } 9 | 10 | return authHeader.substring(7); // Remove 'Bearer ' prefix 11 | }; 12 | -------------------------------------------------------------------------------- /packages/presentation/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "jsx": "react-jsx", 6 | 7 | "baseUrl": ".", 8 | "paths": {}, 9 | 10 | /* TODO: remove below flags for strict checking */ 11 | "noImplicitAny": false 12 | }, 13 | "include": ["src"] 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/page-listing-results.ts: -------------------------------------------------------------------------------- 1 | import type { IPageForTreeItem } from './page'; 2 | 3 | export interface RootPageResult { 4 | rootPage: IPageForTreeItem; 5 | } 6 | 7 | export interface ChildrenResult { 8 | children: IPageForTreeItem[]; 9 | } 10 | 11 | export interface V5MigrationStatus { 12 | isV5Compatible: boolean; 13 | migratablePagesCount: number; 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/src/server/models/vo/collection-progress.ts: -------------------------------------------------------------------------------- 1 | class CollectionProgress { 2 | collectionName: string; 3 | 4 | currentCount = 0; 5 | 6 | insertedCount = 0; 7 | 8 | modifiedCount = 0; 9 | 10 | totalCount = 0; 11 | 12 | constructor(collectionName: string) { 13 | this.collectionName = collectionName; 14 | } 15 | } 16 | 17 | export default CollectionProgress; 18 | -------------------------------------------------------------------------------- /packages/editor/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /packages/presentation/src/client/consts/index.ts: -------------------------------------------------------------------------------- 1 | import type { Options as ReactMarkdownOptions } from 'react-markdown'; 2 | import type { Options as RevealOptions } from 'reveal.js'; 3 | 4 | export type PresentationOptions = { 5 | rendererOptions: ReactMarkdownOptions; 6 | revealOptions?: RevealOptions; 7 | isDarkMode?: boolean; 8 | disableSeparationByHeader?: boolean; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/src/components/Script/DrawioViewerScript/use-viewer-min-js-url.ts: -------------------------------------------------------------------------------- 1 | import urljoin from 'url-join'; 2 | 3 | export const useViewerMinJsUrl = (drawioUri: string): string => { 4 | // extract search from URL 5 | const url = new URL(drawioUri); 6 | const pathname = urljoin(url.pathname, '/js/viewer-static.min.js'); 7 | 8 | return `${url.origin}${pathname}${url.search}`; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/src/styles/vendor.scss: -------------------------------------------------------------------------------- 1 | @import '@growi/core-styles/scss/bootstrap/apply'; 2 | @import '@growi/ui/dist/style'; 3 | 4 | // react-bootstrap-typeahead 5 | @import 'react-bootstrap-typeahead/css/Typeahead'; 6 | 7 | // SimpleBar 8 | @import 'simplebar-react/dist/simplebar.min.css'; 9 | @import './override-simplebar'; 10 | 11 | // Handsontable 12 | @import './override-handsontable'; 13 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "rootDir": "./src", 6 | "outDir": "dist", 7 | "declaration": true, 8 | "noResolve": false, 9 | "preserveConstEnums": true, 10 | "sourceMap": false, 11 | "noEmit": false 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/slack/src/interfaces/respond-util.ts: -------------------------------------------------------------------------------- 1 | import type { RespondBodyForResponseUrl } from './response-url'; 2 | 3 | export interface IRespondUtil { 4 | respond(body: RespondBodyForResponseUrl): Promise; 5 | respondInChannel(body: RespondBodyForResponseUrl): Promise; 6 | replaceOriginal(body: RespondBodyForResponseUrl): Promise; 7 | deleteOriginal(): Promise; 8 | } 9 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/admin/userInvitation.ejs: -------------------------------------------------------------------------------- 1 | Hi, <%- email %> 2 | 3 | You are invited to our Wiki, you can log in with following account: 4 | 5 | Email: <%- email %> 6 | Password: <%- password %> 7 | (This password was auto generated. Update required at the first time you logging in) 8 | 9 | We are waiting for you! 10 | <%- url %> 11 | 12 | -- 13 | <%- appTitle %> 14 | <%- url %> 15 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/userActivation.ejs: -------------------------------------------------------------------------------- 1 | Account confirmation 2 | 3 | Hi, <%- email %> 4 | 5 | An acount has been created in GROWI (<%- appTitle %>). 6 | To activate your account, click on the link below. 7 | 8 | <%- url %> 9 | 10 | This link will expire in 1 hour at <%- expiredAt %>. 11 | 12 | If you did not created the account, you can safely ignore this email. 13 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ko_KR/admin/userWaitingActivation.ejs: -------------------------------------------------------------------------------- 1 | 안녕하세요, <%- adminUser.name %>님 2 | 3 | <%- appTitle %>에 사용자가 등록했습니다. 4 | 5 | 6 | ==== 7 | 생성된 사용자: 8 | 9 | 이름: <%- createdUser.name %> 10 | 사용자명: <%- createdUser.username %> 11 | 이메일: <%- createdUser.email %> 12 | ==== 13 | 14 | 다음 URL에서 조치를 취해주세요: 15 | <%- url %>/admin/users 16 | 17 | 18 | -- 19 | <%- appTitle %> 20 | <%- url %> -------------------------------------------------------------------------------- /apps/app/resource/locales/zh_CN/admin/userInvitation.ejs: -------------------------------------------------------------------------------- 1 | Hi, <%- email %> 2 | 3 | You are invited to our Wiki, you can log in with following account: 4 | 5 | Email: <%- email %> 6 | Password: <%- password %> 7 | (This password was auto generated. Update required at the first time you logging in) 8 | 9 | We are waiting for you! 10 | <%- url %> 11 | 12 | -- 13 | <%- appTitle %> 14 | <%- url %> 15 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/config/logger/config.prod.ts: -------------------------------------------------------------------------------- 1 | import { UniversalBunyanConfig } from 'universal-bunyan'; 2 | 3 | const config: UniversalBunyanConfig = { 4 | default: 'info', 5 | 6 | // 'express-session': 'debug', 7 | 8 | /* 9 | * configure level for server 10 | */ 11 | // 'express:*': 'debug', 12 | // 'slackbot-proxy:*': 'debug', 13 | }; 14 | 15 | export default config; 16 | -------------------------------------------------------------------------------- /apps/app/src/stores/staff.tsx: -------------------------------------------------------------------------------- 1 | import type { SWRResponse } from 'swr'; 2 | import useSWR from 'swr'; 3 | 4 | import { apiv3Get } from '~/client/util/apiv3-client'; 5 | 6 | export const useSWRxStaffs = (): SWRResponse => { 7 | return useSWR('/staffs', (endpoint) => 8 | apiv3Get(endpoint).then((response) => { 9 | return response.data.contributors; 10 | }), 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /apps/app/test/integration/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'plugin:jest/recommended', 4 | ], 5 | env: { 6 | 'jest/globals': true, 7 | }, 8 | plugins: ['jest'], 9 | rules: { 10 | 'jest/no-done-callback': ['warn'], 11 | 'jest/no-standalone-expect': [ 12 | 'error', 13 | { additionalTestBlockFunctions: ['each.test'] }, 14 | ], 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/drawio.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | const oldDrawioRegExp = /:::\s?drawio\n(.+?)\n:::/g; // drawio old format 11 | return body.replace(oldDrawioRegExp, '``` drawio\n$1\n```'); 12 | }, 13 | ]; 14 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "./src", 5 | "outDir": "dist", 6 | "declaration": true, 7 | "noResolve": false, 8 | "preserveConstEnums": true, 9 | "sourceMap": false, 10 | "noEmit": false, 11 | "baseUrl": "./src", 12 | "paths": { 13 | "~/*": ["./*"] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/csv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | const oldCsvTableRegExp = /:::\s?csv(-h)?\n([\s\S]*?)\n:::/g; // CSV old format 11 | return body.replace(oldCsvTableRegExp, '``` csv$1\n$2\n```'); 12 | }, 13 | ]; 14 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/tsv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | const oldTsvTableRegExp = /:::\s?tsv(-h)?\n([\s\S]*?)\n:::/g; // TSV old format 11 | return body.replace(oldTsvTableRegExp, '``` tsv$1\n$2\n```'); 12 | }, 13 | ]; 14 | -------------------------------------------------------------------------------- /packages/custom-icons/turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "extends": ["//"], 4 | "tasks": { 5 | "build": { 6 | "outputs": ["dist/**"], 7 | "inputs": ["svg/**"], 8 | "outputLogs": "new-only" 9 | }, 10 | "dev": { 11 | "outputs": ["dist/**"], 12 | "inputs": ["svg/**"], 13 | "outputLogs": "new-only" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/app/playwright/.eslintrc.mjs: -------------------------------------------------------------------------------- 1 | import playwright from 'eslint-plugin-playwright'; 2 | 3 | // eslint-disable-next-line import/no-anonymous-default-export 4 | export default [ 5 | { 6 | ...playwright.configs['flat/recommended'], 7 | files: ['./**'], 8 | }, 9 | { 10 | files: ['./**'], 11 | rules: { 12 | // Customize Playwright rules 13 | // ... 14 | }, 15 | }, 16 | ]; 17 | -------------------------------------------------------------------------------- /apps/app/resource/locales/ja_JP/admin/userWaitingActivation.ejs: -------------------------------------------------------------------------------- 1 | こんにちは、 <%- adminUser.name %> 2 | 3 | <%- appTitle %> に登録されているユーザー。 4 | 5 | 6 | ==== 7 | 作成したユーザー: 8 | 9 | 名前: <%- createdUser.name %> 10 | ユーザーネーム: <%- createdUser.username %> 11 | Email: <%- createdUser.email %> 12 | ==== 13 | 14 | 次のURLでアクションを起こしてください: 15 | <%- url %>/admin/users 16 | 17 | 18 | -- 19 | <%- appTitle %> 20 | <%- url %> 21 | 22 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageEditor/LinkEditPreview.module.scss: -------------------------------------------------------------------------------- 1 | .linkedit-preview { 2 | .page-editor-preview-body { 3 | max-height: 70vh; 4 | padding-top: 0; 5 | margin: 0 -10px; 6 | .wiki { 7 | overflow-y: scroll; 8 | font-size: 0.5rem; 9 | } 10 | } 11 | } 12 | 13 | // page preview button 14 | .btn-page-preview svg { 15 | width: 18px; 16 | height: 18px; 17 | } 18 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Presentation/Presentation.tsx: -------------------------------------------------------------------------------- 1 | import type { JSX } from 'react'; 2 | 3 | import { Presentation as PresentationSubstance, type PresentationProps } from '@growi/presentation/dist/client'; 4 | 5 | import '@growi/presentation/dist/style.css'; 6 | 7 | export const Presentation = (props: PresentationProps): JSX.Element => { 8 | return ; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/interfaces/selectable-page.ts: -------------------------------------------------------------------------------- 1 | import type { IPageHasId } from '@growi/core'; 2 | 3 | import type { IPageForItem } from '~/interfaces/page'; 4 | 5 | export type SelectablePage = Partial & { path: string }; 6 | 7 | // type guard 8 | export const isSelectablePage = ( 9 | page: IPageForItem, 10 | ): page is SelectablePage => { 11 | return page.path != null; 12 | }; 13 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | // processor for MIGRATION_MODULE=custom 11 | // ADD YOUR PROCESS HERE! 12 | // https://github.com/growilabs/growi/discussions/7180 13 | return body; 14 | }, 15 | ]; 16 | -------------------------------------------------------------------------------- /apps/app/resource/locales/fr_FR/notifications/userActivation.ejs: -------------------------------------------------------------------------------- 1 | Confirmation de compte 2 | 3 | Bonjour, <%- email %> 4 | 5 | Un compte a été crée pour GROWI (<%- appTitle %>). 6 | Pour activer votre compte, cliquez sur le lien ci-dessous. 7 | 8 | <%- url %> 9 | 10 | Le lien a une durée de vie de 1 heure, expirant le <%- expiredAt %>. 11 | 12 | Si vous n'avez pas crée ce compte, vous pouvez ignorer ce courriel. 13 | -------------------------------------------------------------------------------- /apps/app/src/client/services/create-page/create-page.ts: -------------------------------------------------------------------------------- 1 | import { apiv3Post } from '~/client/util/apiv3-client'; 2 | import type { IApiv3PageCreateParams, IApiv3PageCreateResponse } from '~/interfaces/apiv3'; 3 | 4 | export const createPage = async(params: IApiv3PageCreateParams): Promise => { 5 | const res = await apiv3Post('/page', params); 6 | return res.data; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/src/client/services/update-page/update-page.ts: -------------------------------------------------------------------------------- 1 | import { apiv3Put } from '~/client/util/apiv3-client'; 2 | import type { IApiv3PageUpdateParams, IApiv3PageUpdateResponse } from '~/interfaces/apiv3'; 3 | 4 | export const updatePage = async(params: IApiv3PageUpdateParams): Promise => { 5 | const res = await apiv3Put('/page', params); 6 | return res.data; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/user-activation.ts: -------------------------------------------------------------------------------- 1 | export const UserActivationErrorCode = { 2 | TOKEN_NOT_FOUND: 'token-not-found', 3 | INVALID_TOKEN: 'token-is-invalid', 4 | USER_REGISTRATION_ORDER_IS_NOT_APPROPRIATE: 5 | 'user-registration-order-is-not-appropriate', 6 | } as const; 7 | 8 | export type UserActivationErrorCode = 9 | (typeof UserActivationErrorCode)[keyof typeof UserActivationErrorCode]; 10 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/index.js: -------------------------------------------------------------------------------- 1 | const bracketlink = require('./bracketlink'); 2 | const csv = require('./csv'); 3 | const drawio = require('./drawio'); 4 | const plantUML = require('./plantuml'); 5 | const remarkGrowiDirective = require('./remark-growi-directive'); 6 | const tsv = require('./tsv'); 7 | 8 | module.exports = [...bracketlink, ...csv, ...drawio, ...plantUML, ...tsv, ...remarkGrowiDirective]; 9 | -------------------------------------------------------------------------------- /bin/data-migrations/src/migrations/v60x/plantuml.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {import('../../types').MigrationModule} MigrationModule 3 | */ 4 | 5 | module.exports = [ 6 | /** 7 | * @type {MigrationModule} 8 | */ 9 | (body) => { 10 | const oldPlantUmlRegExp = /@startuml\n([\s\S]*?)\n@enduml/g; // plantUML old format 11 | return body.replace(oldPlantUmlRegExp, '``` plantuml\n$1\n```'); 12 | }, 13 | ]; 14 | -------------------------------------------------------------------------------- /apps/app/src/client/components/CustomNavigation/CustomNav.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | 3 | .grw-custom-nav-tab :global { 4 | .nav-title { 5 | flex-wrap: nowrap; 6 | } 7 | 8 | .nav-link { 9 | padding: 1rem 1.5rem; 10 | } 11 | 12 | .grw-nav-slide-hr { 13 | border-top: 0; 14 | border-bottom: 3px solid; 15 | transition: 0.3s ease-in-out; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apps/app/src/server/service/import/import-settings.ts: -------------------------------------------------------------------------------- 1 | import type { ImportMode } from '~/models/admin/import-mode'; 2 | 3 | import type { OverwriteFunction } from './overwrite-function'; 4 | 5 | export type OverwriteParams = { [propertyName: string]: OverwriteFunction | unknown } 6 | 7 | export type ImportSettings = { 8 | mode: ImportMode, 9 | jsonFileName: string, 10 | overwriteParams: OverwriteParams, 11 | } 12 | -------------------------------------------------------------------------------- /apps/app/src/styles/mixins/_share-link.scss: -------------------------------------------------------------------------------- 1 | @mixin share-link() { 2 | .layout-root.share-link { 3 | @content; 4 | } 5 | } 6 | 7 | @mixin share-link-for-module($isContentGlobal: false) { 8 | :global { 9 | .layout-root.share-link { 10 | @if $isContentGlobal { 11 | @content; 12 | } @else { 13 | :local { 14 | @content; 15 | } 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/core/src/swr/use-global-socket.ts: -------------------------------------------------------------------------------- 1 | import type { Socket } from 'socket.io-client'; 2 | import type { SWRResponse } from 'swr'; 3 | 4 | import { useSWRStatic } from './use-swr-static'; 5 | 6 | export const GLOBAL_SOCKET_NS = '/'; 7 | export const GLOBAL_SOCKET_KEY = 'globalSocket'; 8 | 9 | export const useGlobalSocket = (): SWRResponse => { 10 | return useSWRStatic(GLOBAL_SOCKET_KEY); 11 | }; 12 | -------------------------------------------------------------------------------- /packages/pdf-converter-client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/tsconfig", 3 | "extends": "../../tsconfig.base.json", 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "outDir": "dist", 7 | "declaration": true, 8 | "rootDir": "src", 9 | "noEmit": false, 10 | "module": "CommonJS", 11 | "moduleResolution": "Node" 12 | }, 13 | "include": ["./src/**/*"] 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/resource/locales/en_US/notifications/passwordReset.ejs: -------------------------------------------------------------------------------- 1 | Password Reset 2 | 3 | Hi, <%- email %> 4 | 5 | A request has been received to change the password your GROWI (<%- appTitle %>) account. 6 | To reset your password, click on the link below. 7 | 8 | <%- url %> 9 | 10 | This link will expire in 10 minutes at <%- expiredAt %>. 11 | 12 | If you did not request a password reset, you can safely ignore this email. 13 | -------------------------------------------------------------------------------- /apps/app/src/client/components/Common/RendererErrorMessage.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const RendererErrorMessage: React.FC = () => { 4 | return ( 5 |

6 | ⚠️ Developer Warning:{' '} 7 | Required renderer configuration is missing. Ensure useRendererConfig() is properly called in the component. 8 |

9 | ); 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/src/server/events/tag.js: -------------------------------------------------------------------------------- 1 | const events = require('events'); 2 | const util = require('util'); 3 | 4 | /** @param {import('~/server/crowi').default} crowi Crowi instance */ 5 | function TagEvent(crowi) { 6 | this.crowi = crowi; 7 | 8 | events.EventEmitter.call(this); 9 | } 10 | util.inherits(TagEvent, events.EventEmitter); 11 | 12 | TagEvent.prototype.onUpdate = (tag) => {}; 13 | 14 | module.exports = TagEvent; 15 | -------------------------------------------------------------------------------- /apps/app/vite.styles-prebuilt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | 3 | // https://vitejs.dev/config/ 4 | export default defineConfig({ 5 | publicDir: false, 6 | build: { 7 | outDir: 'src/styles/prebuilt', 8 | rollupOptions: { 9 | input: ['/src/styles/vendor.scss'], 10 | output: { 11 | assetFileNames: '[name].[ext]', // not attach hash 12 | }, 13 | }, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /apps/app/src/features/openai/client/services/thread.ts: -------------------------------------------------------------------------------- 1 | import { apiv3Delete } from '~/client/util/apiv3-client'; 2 | 3 | import type { IApiv3DeleteThreadParams } from '../../interfaces/thread-relation'; 4 | 5 | export const deleteThread = async ( 6 | params: IApiv3DeleteThreadParams, 7 | ): Promise => { 8 | await apiv3Delete( 9 | `/openai/thread/${params.aiAssistantId}/${params.threadRelationId}`, 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/access-token.ts: -------------------------------------------------------------------------------- 1 | import type { Scope } from '@growi/core/dist/interfaces'; 2 | 3 | export type IAccessTokenInfo = { 4 | expiredAt: Date; 5 | description: string; 6 | scopes: Scope[]; 7 | }; 8 | 9 | export type IResGenerateAccessToken = IAccessTokenInfo & { 10 | token: string; 11 | _id: string; 12 | }; 13 | 14 | export type IResGetAccessToken = IAccessTokenInfo & { 15 | _id: string; 16 | }; 17 | -------------------------------------------------------------------------------- /apps/app/src/server/routes/apiv3/user/index.ts: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | 3 | import type Crowi from '~/server/crowi'; 4 | 5 | import { getRelatedGroupsHandlerFactory } from './get-related-groups'; 6 | 7 | const router = express.Router(); 8 | 9 | export const factory = (crowi: Crowi): express.Router => { 10 | router.get('/related-groups', getRelatedGroupsHandlerFactory(crowi)); 11 | 12 | return router; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/remark-growi-directive/src/index.js: -------------------------------------------------------------------------------- 1 | import { remarkGrowiDirectivePlugin } from './remark-growi-directive.js'; 2 | 3 | export { 4 | DirectiveTypeObject as remarkGrowiDirectivePluginType, 5 | LeafGrowiPluginDirective, 6 | LeafGrowiPluginDirectiveData, 7 | TextGrowiPluginDirective, 8 | TextGrowiPluginDirectiveData, 9 | } from './mdast-util-growi-directive'; 10 | 11 | export default remarkGrowiDirectivePlugin; 12 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/share-link.ts: -------------------------------------------------------------------------------- 1 | import type { HasObjectId, IPageHasId } from '@growi/core'; 2 | 3 | // Todo: specify more detailed Type 4 | export type IResShareLinkList = { 5 | shareLinksResult: any[]; 6 | }; 7 | 8 | export type IShareLink = { 9 | relatedPage: IPageHasId; 10 | createdAt: Date; 11 | expiredAt?: Date; 12 | description: string; 13 | }; 14 | 15 | export type IShareLinkHasId = IShareLink & HasObjectId; 16 | -------------------------------------------------------------------------------- /apps/slackbot-proxy/src/repositories/relation.ts: -------------------------------------------------------------------------------- 1 | import { EntityRepository, Repository } from 'typeorm'; 2 | 3 | import { Relation } from '~/entities/relation'; 4 | 5 | @EntityRepository(Relation) 6 | export class RelationRepository extends Repository { 7 | async findAllByGrowiUris(growiUris: string[]): Promise { 8 | return this.find({ where: growiUris.map((uri) => ({ growiUri: uri })) }); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/custom-icons/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@growi/custom-icons", 3 | "version": "1.0.0", 4 | "description": "Custom icons builder project for GROWI", 5 | "license": "MIT", 6 | "private": "true", 7 | "scripts": { 8 | "build": "svgtofont --sources ./svg --output ./dist", 9 | "dev": "svgtofont --sources ./svg --output ./dist" 10 | }, 11 | "devDependencies": { 12 | "svgtofont": "^4.1.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageControls/SubscribeButton.module.scss: -------------------------------------------------------------------------------- 1 | @use '@growi/core-styles/scss/bootstrap/init' as bs; 2 | @use '@growi/ui/scss/atoms/btn-muted'; 3 | @use './button-styles'; 4 | 5 | .btn-subscribe :global { 6 | @extend %btn-basis; 7 | 8 | .total-counts { 9 | @extend %btn-total-counts-basis; 10 | } 11 | } 12 | 13 | // == Colors 14 | .btn-subscribe { 15 | @include btn-muted.colorize(bs.$success); 16 | } 17 | -------------------------------------------------------------------------------- /apps/app/src/client/components/PageHistory/RevisionDiff.module.scss: -------------------------------------------------------------------------------- 1 | .revision-diff-container :global { 2 | .link-created-at { 3 | text-decoration-line: underline; 4 | } 5 | 6 | .revision-history-diff { 7 | table-layout: fixed; 8 | 9 | // revision-history 10 | // to stay d2h-code-side-line-number in the revision history diff area 11 | .d2h-wrapper { 12 | position: relative; 13 | } 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /apps/app/src/client/util/t-with-opt.ts: -------------------------------------------------------------------------------- 1 | import { useCallback } from 'react'; 2 | 3 | import { useTranslation } from 'next-i18next'; 4 | 5 | export const useTWithOpt = (): (key: string, opt?: any) => string => { 6 | 7 | const { t } = useTranslation(); 8 | 9 | return useCallback((key, opt) => { 10 | if (typeof opt === 'object') { 11 | return t(key, opt).toString(); 12 | } 13 | return t(key); 14 | }, [t]); 15 | }; 16 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/external-account-login-error.ts: -------------------------------------------------------------------------------- 1 | import type { ExternalAccountLoginError } from '~/models/vo/external-account-login-error'; 2 | 3 | export type IExternalAccountLoginError = ExternalAccountLoginError; 4 | 5 | // type guard 6 | export const isExternalAccountLoginError = ( 7 | args: any, 8 | ): args is IExternalAccountLoginError => { 9 | return (args as IExternalAccountLoginError).message != null; 10 | }; 11 | -------------------------------------------------------------------------------- /apps/app/src/interfaces/errors/forgot-password.ts: -------------------------------------------------------------------------------- 1 | export const forgotPasswordErrorCode = { 2 | PASSWORD_RESET_IS_UNAVAILABLE: 'password-reset-is-unavailable', 3 | TOKEN_NOT_FOUND: 'token-not-found', 4 | PASSWORD_RESET_ORDER_IS_NOT_APPROPRIATE: 5 | 'password-reset-order-is-not-appropriate', 6 | } as const; 7 | 8 | export type forgotPasswordErrorCode = 9 | (typeof forgotPasswordErrorCode)[keyof typeof forgotPasswordErrorCode]; 10 | -------------------------------------------------------------------------------- /apps/app/src/server/middlewares/auto-reconnect-to-s2s-msg-server.js: -------------------------------------------------------------------------------- 1 | /** @param {import('~/server/crowi').default} crowi Crowi instance */ 2 | module.exports = (crowi) => { 3 | const { s2sMessagingService } = crowi; 4 | 5 | return (req, res, next) => { 6 | if (s2sMessagingService != null && s2sMessagingService.shouldResubscribe()) { 7 | s2sMessagingService.subscribe(); 8 | } 9 | 10 | return next(); 11 | }; 12 | }; 13 | -------------------------------------------------------------------------------- /apps/app/src/stores/use-editing-clients.ts: -------------------------------------------------------------------------------- 1 | import { useSWRStatic } from '@growi/core/dist/swr'; 2 | import type { EditingClient } from '@growi/editor'; 3 | import type { SWRResponse } from 'swr'; 4 | 5 | export const useEditingClients = ( 6 | status?: EditingClient[], 7 | ): SWRResponse => { 8 | return useSWRStatic('editingUsers', status, { 9 | fallbackData: [], 10 | }); 11 | }; 12 | --------------------------------------------------------------------------------