From 932759c4c2b9c3c8edd5eec5e10677b3777a8ed6 Mon Sep 17 00:00:00 2001 From: Pavel Mineev Date: Sun, 10 Jul 2022 19:41:13 -0700 Subject: [PATCH] split frontend by packages --- .github/workflows/ci-frontend-size-limit.yml | 4 +- .github/workflows/ci-frontend.yml | 84 +- .github/workflows/ci-site.yml | 7 - .gitignore | 2 +- Dockerfile | 77 +- Dockerfile.artifacts | 40 +- Makefile | 2 +- compose-dev-frontend.yml | 4 +- frontend/.gitignore | 5 +- frontend/.husky/post-commit | 1 + frontend/.husky/pre-commit | 5 +- frontend/.lintstagedrc.js | 5 - frontend/{ => apps/remark42}/.babelrc.js | 0 frontend/{ => apps/remark42}/.eslintignore | 0 frontend/{ => apps/remark42}/.eslintrc.js | 0 frontend/apps/remark42/.lintstagedrc.cjs | 5 + frontend/{ => apps/remark42}/.nvmrc | 0 frontend/{ => apps/remark42}/.prettierignore | 0 frontend/{ => apps/remark42}/.prettierrc.js | 0 frontend/{ => apps/remark42}/.size-limit.js | 0 frontend/{ => apps/remark42}/.stylelintignore | 0 frontend/{ => apps/remark42}/.stylelintrc.js | 0 frontend/{ => apps/remark42}/README.md | 0 .../remark42}/app/__mocks__/fetch.ts | 0 .../remark42}/app/__mocks__/localstorage.ts | 0 .../{ => apps/remark42}/app/__stubs__/jwt.ts | 0 .../remark42}/app/__stubs__/remark-config.ts | 0 .../remark42}/app/__stubs__/static-config.ts | 0 .../remark42}/app/__stubs__/store.ts | 0 .../{ => apps/remark42}/app/__stubs__/svg.tsx | 0 .../{ => apps/remark42}/app/__stubs__/user.ts | 0 .../remark42}/app/assets/social/dev.svg | 0 .../remark42}/app/assets/social/facebook.svg | 0 .../app/assets/social/github-dark.svg | 0 .../app/assets/social/github-light.svg | 0 .../remark42}/app/assets/social/google.svg | 0 .../remark42}/app/assets/social/microsoft.svg | 0 .../remark42}/app/assets/social/patreon.svg | 0 .../remark42}/app/assets/social/telegram.svg | 0 .../remark42}/app/assets/social/twitter.svg | 0 .../remark42}/app/assets/social/yandex.svg | 0 .../app/common/__mocks__/constants.ts | 0 .../remark42}/app/common/accessibility.ts | 0 .../app/common/api.getLastComments.ts | 0 .../remark42}/app/common/api.test.ts | 0 .../{ => apps/remark42}/app/common/api.ts | 0 .../app/common/constants.config.test.ts | 0 .../remark42}/app/common/constants.config.ts | 0 .../remark42}/app/common/constants.ts | 0 .../{ => apps/remark42}/app/common/cookies.ts | 0 .../remark42}/app/common/copy.test.ts | 0 .../{ => apps/remark42}/app/common/copy.ts | 0 .../remark42}/app/common/fetcher.test.ts | 0 .../{ => apps/remark42}/app/common/fetcher.ts | 0 .../app/common/local-storage.test.ts | 0 .../remark42}/app/common/local-storage.ts | 0 .../remark42}/app/common/settings.ts | 0 .../remark42}/app/common/static-store.ts | 0 .../{ => apps/remark42}/app/common/types.ts | 0 .../__column/auth-panel__column.css | 0 .../auth-panel__readonly-label.css | 0 .../app/components/auth-panel/auth-panel.css | 0 .../auth-panel/auth-panel.module.css | 0 .../components/auth-panel/auth-panel.test.tsx | 0 .../app/components/auth-panel/auth-panel.tsx | 0 .../app/components/auth-panel/index.ts | 0 .../remark42}/app/components/auth/auth.api.ts | 0 .../app/components/auth/auth.hooks.ts | 0 .../app/components/auth/auth.messsages.ts | 0 .../app/components/auth/auth.module.css | 0 .../app/components/auth/auth.spec.tsx | 0 .../remark42}/app/components/auth/auth.tsx | 0 .../app/components/auth/auth.utils.ts | 0 .../auth/components/button.module.css | 0 .../app/components/auth/components/button.tsx | 0 .../auth/components/oauth.consts.ts | 0 .../auth/components/oauth.module.css | 0 .../components/auth/components/oauth.spec.tsx | 0 .../app/components/auth/components/oauth.tsx | 0 .../components/auth/components/oauth.utils.ts | 0 .../remark42}/app/components/auth/index.ts | 0 .../app/components/avatar/assets/ghost.svg | 0 .../app/components/avatar/avatar.module.css | 0 .../app/components/avatar/avatar.spec.tsx | 0 .../app/components/avatar/avatar.tsx | 0 .../remark42}/app/components/avatar/index.ts | 0 .../button/_kind/_link/button_kind_link.css | 0 .../_kind/_primary/button_kind_primary.css | 0 .../_secondary/button_kind_secondary.css | 0 .../button/_size/_large/button_size_large.css | 0 .../_size/_middle/button_size_middle.css | 0 .../button/_theme/_dark/button_theme_dark.css | 0 .../app/components/button/button.css | 0 .../app/components/button/button.tsx | 0 .../remark42}/app/components/button/index.ts | 0 .../__actions/comment-form__actions.css | 0 .../comment-form__button_type_preview.css | 0 .../_send/comment-form__button_type_send.css | 0 .../__button/comment-form__button.css | 0 .../comment-form__control-panel.css | 0 .../__counter/comment-form__counter.css | 0 .../__error/comment-form__error.css | 0 .../comment-form__field-wrapper.css | 0 .../__field/comment-form__field.css | 0 .../comment-form__markdown-link.css | 0 .../comment-form__markdown-toolbar.css | 0 .../__markdown/comment-form__markdown.css | 0 .../comment-form__preview-wrapper.css | 0 .../__preview/comment-form__preview.css | 0 .../__rss-link/comment-form__rss-link.css | 0 .../comment-form/__rss/comment-form__rss.css | 0 .../comment-form__subscribe-by-email.css | 0 .../comment-form__subscribe-by-email.test.tsx | 0 .../comment-form__subscribe-by-email.tsx | 0 .../__subscribe-by-email/index.ts | 0 .../comment-form__subscribe-by-rss.css | 0 .../comment-form__subscribe-by-rss.test.tsx | 0 .../comment-form__subscribe-by-rss.tsx | 0 .../comment-form/__subscribe-by-rss/index.ts | 0 .../_simple/comment-form_simple.css | 0 .../_theme/_dark/comment-form_theme_dark.css | 0 .../_light/comment-form_theme_light.css | 0 .../components/comment-form/comment-form.css | 0 .../comment-form/comment-form.persist.ts | 0 .../comment-form/comment-form.spec.tsx | 0 .../components/comment-form/comment-form.tsx | 0 .../app/components/comment-form/index.ts | 0 .../markdown-toolbar-icons/bold-icon.tsx | 0 .../markdown-toolbar-icons/code-icon.tsx | 0 .../markdown-toolbar-icons/header-icon.tsx | 0 .../markdown-toolbar-icons/image-icon.tsx | 0 .../markdown-toolbar-icons/italic-icon.tsx | 0 .../markdown-toolbar-icons/link-icon.tsx | 0 .../ordered-list-icon.tsx | 0 .../markdown-toolbar-icons/quote-icon.tsx | 0 .../unordered-list-icon.tsx | 0 .../comment-form/markdown-toolbar.tsx | 0 .../comment-form/text-expander.module.css | 0 .../components/comment-form/text-expander.tsx | 0 .../comment/__body/comment__body.css | 0 .../comment/__info/comment__info.css | 0 .../comment/__input/comment__input.css | 0 .../comment__link-to-parent__focused.svg | 0 .../comment__link-to-parent.css | 0 .../comment__link-to-parent.svg | 0 .../comment/__status/comment__status.css | 0 .../comment/__text/comment__text.css | 0 .../comment/__time/comment__time.css | 0 .../comment/__user-id/comment__user-id.css | 0 .../comment/__username/comment__username.css | 0 .../comment/_collapsed/comment_collapsed.css | 0 .../comment/_editing/comment_editing.css | 0 .../comment/_replying/comment_replying.css | 0 .../_theme/_dark/comment_theme_dark.css | 0 .../_theme/_light/comment_theme_light.css | 0 .../comment/_useless/comment_useless.css | 0 .../_view/_admin/comment_view_admin.css | 0 .../_view/_preview/comment_view_preview.css | 0 .../comment/_view/_user/comment_view_user.css | 0 .../comment/comment-actions.module.css | 0 .../comment/comment-actions.spec.tsx | 0 .../components/comment/comment-actions.tsx | 0 .../comment/comment-votes.module.css | 0 .../components/comment/comment-votes.spec.tsx | 0 .../app/components/comment/comment-votes.tsx | 0 .../app/components/comment/comment.css | 0 .../app/components/comment/comment.module.css | 0 .../app/components/comment/comment.test.tsx | 0 .../app/components/comment/comment.tsx | 0 .../components/comment/connected-comment.tsx | 0 .../comment/getBlockingDurations.ts | 0 .../remark42}/app/components/comment/index.ts | 0 .../app/components/comment/styles.ts | 0 .../remark42}/app/components/countdown.tsx | 0 .../dropdown/__content/dropdown__content.css | 0 .../dropdown/__item/dropdown__item.css | 0 .../dropdown/__item/dropdown__item.tsx | 0 .../app/components/dropdown/__item/index.ts | 0 .../dropdown/__items/dropdown__items.css | 0 .../dropdown/__title/dropdown__title.css | 0 .../dropdown/_active/dropdown_active.css | 0 .../_theme/_dark/dropdown_theme_dark.css | 0 .../_theme/_light/dropdown_theme_light.css | 0 .../app/components/dropdown/dropdown.css | 0 .../app/components/dropdown/dropdown.tsx | 0 .../app/components/dropdown/index.ts | 0 .../icon-button/icon-button.module.css | 0 .../components/icon-button/icon-button.tsx | 0 .../app/components/icons/arrow.spec.tsx | 0 .../remark42}/app/components/icons/arrow.tsx | 0 .../remark42}/app/components/icons/cross.tsx | 0 .../app/components/icons/signout.tsx | 0 .../components/icons/verification.spec.tsx | 0 .../app/components/icons/verification.tsx | 0 .../remark42}/app/components/input/index.ts | 0 .../app/components/input/input.module.css | 0 .../remark42}/app/components/input/input.tsx | 0 .../__item/list-comments__item.css | 0 .../app/components/list-comments/index.ts | 0 .../list-comments/list-comments.tsx | 0 .../remark42}/app/components/preloader.tsx | 0 .../components/counter/counter.module.css | 0 .../components/counter/counter.spec.tsx | 0 .../profile/components/counter/counter.tsx | 0 .../profile/components/counter/index.ts | 0 .../remark42}/app/components/profile/index.ts | 0 .../app/components/profile/profile.module.css | 0 .../app/components/profile/profile.spec.tsx | 0 .../app/components/profile/profile.tsx | 0 .../_theme/_dark/raw-content_theme_dark.css | 0 .../_theme/_light/raw-content_theme_light.css | 0 .../components/raw-content/code-highlight.css | 0 .../app/components/raw-content/index.ts | 0 .../components/raw-content/raw-content.css | 0 .../root/__copyright/root__copyright.css | 0 .../components/root/__input/root__input.css | 0 .../__pinned-comment/root__pinned-comment.css | 0 .../root__pinned-comments.css | 0 .../root/__preloader/root__preloader.css | 0 .../components/root/__thread/root__thread.css | 0 .../root/__threads/root__threads.css | 0 .../root/_theme/_dark/root_theme_dark.css | 0 .../root/_theme/_light/root_theme_light.css | 0 .../app/components/root/in-view/in-view.tsx | 0 .../remark42}/app/components/root/index.ts | 0 .../remark42}/app/components/root/root.css | 0 .../app/components/root/root.module.css | 0 .../remark42}/app/components/root/root.tsx | 0 .../remark42}/app/components/select/index.ts | 0 .../app/components/select/select.module.css | 0 .../app/components/select/select.spec.tsx | 0 .../app/components/select/select.tsx | 0 .../settings/__action/settings__action.css | 0 .../settings/__dimmed/settings__dimmed.css | 0 .../__invisible/settings__invisible.css | 0 .../settings/__list/settings__list.css | 0 .../settings/__section/settings__section.css | 0 .../settings/__user-id/settings__user-id.css | 0 .../__username/settings__username.css | 0 .../_theme/_dark/settings_theme_dark.css | 0 .../_theme/_light/settings_theme_light.css | 0 .../app/components/settings/index.ts | 0 .../app/components/settings/settings.css | 0 .../app/components/settings/settings.tsx | 0 .../app/components/sort-picker.spec.tsx | 0 .../remark42}/app/components/sort-picker.tsx | 0 .../app/components/spinner/spinner.module.css | 0 .../app/components/spinner/spinner.tsx | 0 .../app/components/textarea-autosize.tsx | 0 .../thread/__collapse/thread__collapse.css | 0 .../thread/_theme_dark/thread_theme_dark.css | 0 .../remark42}/app/components/thread/index.ts | 0 .../app/components/thread/thread.css | 0 .../app/components/thread/thread.tsx | 0 .../remark42}/app/components/tooltip/index.ts | 0 .../app/components/tooltip/tooltip.module.css | 0 .../app/components/tooltip/tooltip.spec.tsx | 0 .../app/components/tooltip/tooltip.tsx | 0 frontend/{ => apps/remark42}/app/counter.ts | 0 frontend/{ => apps/remark42}/app/deleteme.ts | 0 frontend/{ => apps/remark42}/app/embed.ts | 0 .../remark42}/app/hooks/useAction.ts | 0 .../{ => apps/remark42}/app/hooks/useTheme.ts | 0 .../{ => apps/remark42}/app/last-comments.tsx | 0 .../{ => apps/remark42}/app/locales/ar.json | 0 .../{ => apps/remark42}/app/locales/be.json | 0 .../{ => apps/remark42}/app/locales/bg.json | 0 .../{ => apps/remark42}/app/locales/bp.json | 0 .../{ => apps/remark42}/app/locales/de.json | 0 .../{ => apps/remark42}/app/locales/en.json | 0 .../{ => apps/remark42}/app/locales/es.json | 0 .../{ => apps/remark42}/app/locales/fi.json | 0 .../{ => apps/remark42}/app/locales/fr.json | 0 .../{ => apps/remark42}/app/locales/it.json | 0 .../{ => apps/remark42}/app/locales/ja.json | 0 .../{ => apps/remark42}/app/locales/ko.json | 0 .../{ => apps/remark42}/app/locales/pl.json | 0 .../{ => apps/remark42}/app/locales/ru.json | 0 .../{ => apps/remark42}/app/locales/tr.json | 0 .../{ => apps/remark42}/app/locales/ua.json | 0 .../{ => apps/remark42}/app/locales/vi.json | 0 .../{ => apps/remark42}/app/locales/zh.json | 0 frontend/{ => apps/remark42}/app/profile.ts | 0 frontend/{ => apps/remark42}/app/remark.tsx | 0 .../{ => apps/remark42}/app/store/actions.ts | 0 .../app/store/comments/actions.test.ts | 0 .../remark42}/app/store/comments/actions.ts | 0 .../remark42}/app/store/comments/getters.ts | 0 .../remark42}/app/store/comments/reducers.ts | 0 .../remark42}/app/store/comments/types.ts | 0 .../app/store/comments/utils.test.ts | 0 .../remark42}/app/store/comments/utils.ts | 0 .../{ => apps/remark42}/app/store/index.ts | 0 .../remark42}/app/store/post-info/actions.ts | 0 .../remark42}/app/store/post-info/reducers.ts | 0 .../remark42}/app/store/post-info/types.ts | 0 .../{ => apps/remark42}/app/store/reducers.ts | 0 .../remark42}/app/store/theme/actions.ts | 0 .../remark42}/app/store/theme/reducers.ts | 0 .../remark42}/app/store/theme/types.ts | 0 .../remark42}/app/store/thread/actions.ts | 0 .../remark42}/app/store/thread/getters.ts | 0 .../app/store/thread/reducers.test.ts | 0 .../remark42}/app/store/thread/reducers.ts | 0 .../remark42}/app/store/thread/types.ts | 0 .../remark42}/app/store/thread/utils.ts | 0 .../store/user/__stubs__/comments-store.json | 0 .../remark42}/app/store/user/actions.test.ts | 0 .../remark42}/app/store/user/actions.ts | 0 .../remark42}/app/store/user/reducers.test.ts | 0 .../remark42}/app/store/user/reducers.ts | 0 .../remark42}/app/store/user/types.ts | 0 .../app/styles/custom-properties.css | 0 .../{ => apps/remark42}/app/styles/global.css | 0 .../{ => apps/remark42}/app/tests/utils.tsx | 0 .../remark42}/app/typings/css-modules.d.ts | 0 .../remark42}/app/typings/enzyme.d.ts | 0 .../remark42}/app/typings/global.d.ts | 0 .../app/typings/jest-localstorage-mock.d.ts | 0 .../remark42}/app/typings/preact.d.ts | 0 .../{ => apps/remark42}/app/typings/svg.d.ts | 0 .../remark42}/app/utils/actionBinder.ts | 0 .../{ => apps/remark42}/app/utils/bench.ts | 0 .../app/utils/capitalize-first-letter.spec.ts | 0 .../app/utils/capitalize-first-letter.ts | 0 .../{ => apps/remark42}/app/utils/cmpRef.ts | 0 .../remark42}/app/utils/create-iframe.ts | 0 .../{ => apps/remark42}/app/utils/debounce.ts | 0 .../remark42}/app/utils/debug-node.ts | 0 .../remark42}/app/utils/derequire.ts | 0 .../{ => apps/remark42}/app/utils/email.ts | 0 .../remark42}/app/utils/errorUtils.ts | 0 .../app/utils/get-hidden-users.test.ts | 0 .../remark42}/app/utils/get-hidden-users.ts | 0 .../remark42}/app/utils/getLocale.ts | 0 .../remark42}/app/utils/is-object.spec.ts | 0 .../remark42}/app/utils/is-object.ts | 0 .../app/utils/isUserAnonymous.test.ts | 0 .../remark42}/app/utils/isUserAnonymous.ts | 0 .../{ => apps/remark42}/app/utils/jwt.test.ts | 0 frontend/{ => apps/remark42}/app/utils/jwt.ts | 0 .../remark42}/app/utils/loadLocale.ts | 0 .../remark42}/app/utils/parse-query.test.ts | 0 .../remark42}/app/utils/parse-query.ts | 0 .../remark42}/app/utils/post-message.ts | 0 .../remark42}/app/utils/replaceSelection.ts | 0 .../remark42}/app/utils/set-dom-props.ts | 0 .../remark42}/app/utils/shallowCompare.ts | 0 .../{ => apps/remark42}/app/utils/sleep.ts | 0 .../remark42}/app/utils/ttl-to-time.ts | 0 frontend/{ => apps/remark42}/codecov.yml | 0 frontend/{ => apps/remark42}/jest.config.ts | 0 frontend/{ => apps/remark42}/jest.setup.ts | 0 frontend/apps/remark42/package.json | 132 +++ frontend/{ => apps/remark42}/remark.image | Bin .../remark42}/tasks/checkTranslation.js | 0 .../remark42}/tasks/generateDictionary.js | 0 .../remark42}/tasks/getLocalePath.js | 0 .../remark42}/tasks/getSupportedLocales.js | 0 .../remark42}/tasks/getTranslationKeys.js | 0 .../remark42}/tasks/localeLoadTemplate.js | 0 .../remark42}/tasks/supportedLocales.json | 0 .../remark42}/templates/comments.ejs | 0 .../{ => apps/remark42}/templates/counter.ejs | 0 .../remark42}/templates/deleteme.ejs | 0 .../{ => apps/remark42}/templates/demo.ejs | 0 .../{ => apps/remark42}/templates/iframe.ejs | 0 .../remark42}/templates/last-comments.ejs | 0 .../remark42}/templates/markdown-help.html | 0 .../remark42}/templates/privacy.html | 0 frontend/{ => apps/remark42}/tsconfig.json | 0 .../{ => apps/remark42}/webpack.config.js | 0 frontend/package.json | 135 +-- frontend/packages/api/.lintstagedrc.cjs | 3 + frontend/packages/api/dist/index.d.ts | 1 + frontend/packages/api/dist/index.js | 1 + frontend/packages/api/jest.config.ts | 23 + frontend/packages/api/package.json | 43 + frontend/packages/api/src/index.spec.ts | 7 + frontend/packages/api/src/index.ts | 1 + frontend/packages/api/tsconfig.json | 23 + frontend/pnpm-lock.yaml | 948 ++++++++++++++---- frontend/pnpm-workspace.yaml | 3 + frontend/turbo.json | 25 + .../development/frontend/index.md | 66 +- 385 files changed, 1146 insertions(+), 506 deletions(-) delete mode 100644 frontend/.lintstagedrc.js rename frontend/{ => apps/remark42}/.babelrc.js (100%) rename frontend/{ => apps/remark42}/.eslintignore (100%) rename frontend/{ => apps/remark42}/.eslintrc.js (100%) create mode 100644 frontend/apps/remark42/.lintstagedrc.cjs rename frontend/{ => apps/remark42}/.nvmrc (100%) rename frontend/{ => apps/remark42}/.prettierignore (100%) rename frontend/{ => apps/remark42}/.prettierrc.js (100%) rename frontend/{ => apps/remark42}/.size-limit.js (100%) rename frontend/{ => apps/remark42}/.stylelintignore (100%) rename frontend/{ => apps/remark42}/.stylelintrc.js (100%) rename frontend/{ => apps/remark42}/README.md (100%) rename frontend/{ => apps/remark42}/app/__mocks__/fetch.ts (100%) rename frontend/{ => apps/remark42}/app/__mocks__/localstorage.ts (100%) rename frontend/{ => apps/remark42}/app/__stubs__/jwt.ts (100%) rename frontend/{ => apps/remark42}/app/__stubs__/remark-config.ts (100%) rename frontend/{ => apps/remark42}/app/__stubs__/static-config.ts (100%) rename frontend/{ => apps/remark42}/app/__stubs__/store.ts (100%) rename frontend/{ => apps/remark42}/app/__stubs__/svg.tsx (100%) rename frontend/{ => apps/remark42}/app/__stubs__/user.ts (100%) rename frontend/{ => apps/remark42}/app/assets/social/dev.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/facebook.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/github-dark.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/github-light.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/google.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/microsoft.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/patreon.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/telegram.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/twitter.svg (100%) rename frontend/{ => apps/remark42}/app/assets/social/yandex.svg (100%) rename frontend/{ => apps/remark42}/app/common/__mocks__/constants.ts (100%) rename frontend/{ => apps/remark42}/app/common/accessibility.ts (100%) rename frontend/{ => apps/remark42}/app/common/api.getLastComments.ts (100%) rename frontend/{ => apps/remark42}/app/common/api.test.ts (100%) rename frontend/{ => apps/remark42}/app/common/api.ts (100%) rename frontend/{ => apps/remark42}/app/common/constants.config.test.ts (100%) rename frontend/{ => apps/remark42}/app/common/constants.config.ts (100%) rename frontend/{ => apps/remark42}/app/common/constants.ts (100%) rename frontend/{ => apps/remark42}/app/common/cookies.ts (100%) rename frontend/{ => apps/remark42}/app/common/copy.test.ts (100%) rename frontend/{ => apps/remark42}/app/common/copy.ts (100%) rename frontend/{ => apps/remark42}/app/common/fetcher.test.ts (100%) rename frontend/{ => apps/remark42}/app/common/fetcher.ts (100%) rename frontend/{ => apps/remark42}/app/common/local-storage.test.ts (100%) rename frontend/{ => apps/remark42}/app/common/local-storage.ts (100%) rename frontend/{ => apps/remark42}/app/common/settings.ts (100%) rename frontend/{ => apps/remark42}/app/common/static-store.ts (100%) rename frontend/{ => apps/remark42}/app/common/types.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/__column/auth-panel__column.css (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/__readonly-label/auth-panel__readonly-label.css (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/auth-panel.css (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/auth-panel.module.css (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/auth-panel.test.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/auth-panel.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth-panel/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.api.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.hooks.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.messsages.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.module.css (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth/auth.utils.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/button.module.css (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/button.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/oauth.consts.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/oauth.module.css (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/oauth.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/oauth.tsx (100%) rename frontend/{ => apps/remark42}/app/components/auth/components/oauth.utils.ts (100%) rename frontend/{ => apps/remark42}/app/components/auth/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/avatar/assets/ghost.svg (100%) rename frontend/{ => apps/remark42}/app/components/avatar/avatar.module.css (100%) rename frontend/{ => apps/remark42}/app/components/avatar/avatar.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/avatar/avatar.tsx (100%) rename frontend/{ => apps/remark42}/app/components/avatar/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/button/_kind/_link/button_kind_link.css (100%) rename frontend/{ => apps/remark42}/app/components/button/_kind/_primary/button_kind_primary.css (100%) rename frontend/{ => apps/remark42}/app/components/button/_kind/_secondary/button_kind_secondary.css (100%) rename frontend/{ => apps/remark42}/app/components/button/_size/_large/button_size_large.css (100%) rename frontend/{ => apps/remark42}/app/components/button/_size/_middle/button_size_middle.css (100%) rename frontend/{ => apps/remark42}/app/components/button/_theme/_dark/button_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/button/button.css (100%) rename frontend/{ => apps/remark42}/app/components/button/button.tsx (100%) rename frontend/{ => apps/remark42}/app/components/button/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__actions/comment-form__actions.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__button/_type/_preview/comment-form__button_type_preview.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__button/_type/_send/comment-form__button_type_send.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__button/comment-form__button.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__control-panel/comment-form__control-panel.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__counter/comment-form__counter.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__error/comment-form__error.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__field-wrapper/comment-form__field-wrapper.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__field/comment-form__field.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__markdown-link/comment-form__markdown-link.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__markdown-toolbar/comment-form__markdown-toolbar.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__markdown/comment-form__markdown.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__preview-wrapper/comment-form__preview-wrapper.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__preview/comment-form__preview.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__rss-link/comment-form__rss-link.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__rss/comment-form__rss.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.test.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-email/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.test.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/__subscribe-by-rss/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/_simple/comment-form_simple.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/_theme/_dark/comment-form_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/_theme/_light/comment-form_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/comment-form.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/comment-form.persist.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/comment-form.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/comment-form.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/bold-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/code-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/header-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/image-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/italic-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/link-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/ordered-list-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/quote-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar-icons/unordered-list-icon.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/markdown-toolbar.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/text-expander.module.css (100%) rename frontend/{ => apps/remark42}/app/components/comment-form/text-expander.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/__body/comment__body.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__info/comment__info.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__input/comment__input.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__link-to-parent/_focused/comment__link-to-parent__focused.svg (100%) rename frontend/{ => apps/remark42}/app/components/comment/__link-to-parent/comment__link-to-parent.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__link-to-parent/comment__link-to-parent.svg (100%) rename frontend/{ => apps/remark42}/app/components/comment/__status/comment__status.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__text/comment__text.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__time/comment__time.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__user-id/comment__user-id.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/__username/comment__username.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_collapsed/comment_collapsed.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_editing/comment_editing.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_replying/comment_replying.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_theme/_dark/comment_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_theme/_light/comment_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_useless/comment_useless.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_view/_admin/comment_view_admin.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_view/_preview/comment_view_preview.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/_view/_user/comment_view_user.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-actions.module.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-actions.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-actions.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-votes.module.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-votes.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment-votes.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment.module.css (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment.test.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/comment.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/connected-comment.tsx (100%) rename frontend/{ => apps/remark42}/app/components/comment/getBlockingDurations.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/comment/styles.ts (100%) rename frontend/{ => apps/remark42}/app/components/countdown.tsx (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__content/dropdown__content.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__item/dropdown__item.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__item/dropdown__item.tsx (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__item/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__items/dropdown__items.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/__title/dropdown__title.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/_active/dropdown_active.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/_theme/_dark/dropdown_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/_theme/_light/dropdown_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/dropdown.css (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/dropdown.tsx (100%) rename frontend/{ => apps/remark42}/app/components/dropdown/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/icon-button/icon-button.module.css (100%) rename frontend/{ => apps/remark42}/app/components/icon-button/icon-button.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/arrow.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/arrow.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/cross.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/signout.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/verification.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/icons/verification.tsx (100%) rename frontend/{ => apps/remark42}/app/components/input/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/input/input.module.css (100%) rename frontend/{ => apps/remark42}/app/components/input/input.tsx (100%) rename frontend/{ => apps/remark42}/app/components/list-comments/__item/list-comments__item.css (100%) rename frontend/{ => apps/remark42}/app/components/list-comments/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/list-comments/list-comments.tsx (100%) rename frontend/{ => apps/remark42}/app/components/preloader.tsx (100%) rename frontend/{ => apps/remark42}/app/components/profile/components/counter/counter.module.css (100%) rename frontend/{ => apps/remark42}/app/components/profile/components/counter/counter.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/profile/components/counter/counter.tsx (100%) rename frontend/{ => apps/remark42}/app/components/profile/components/counter/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/profile/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/profile/profile.module.css (100%) rename frontend/{ => apps/remark42}/app/components/profile/profile.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/profile/profile.tsx (100%) rename frontend/{ => apps/remark42}/app/components/raw-content/_theme/_dark/raw-content_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/raw-content/_theme/_light/raw-content_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/raw-content/code-highlight.css (100%) rename frontend/{ => apps/remark42}/app/components/raw-content/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/raw-content/raw-content.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__copyright/root__copyright.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__input/root__input.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__pinned-comment/root__pinned-comment.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__pinned-comments/root__pinned-comments.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__preloader/root__preloader.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__thread/root__thread.css (100%) rename frontend/{ => apps/remark42}/app/components/root/__threads/root__threads.css (100%) rename frontend/{ => apps/remark42}/app/components/root/_theme/_dark/root_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/root/_theme/_light/root_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/root/in-view/in-view.tsx (100%) rename frontend/{ => apps/remark42}/app/components/root/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/root/root.css (100%) rename frontend/{ => apps/remark42}/app/components/root/root.module.css (100%) rename frontend/{ => apps/remark42}/app/components/root/root.tsx (100%) rename frontend/{ => apps/remark42}/app/components/select/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/select/select.module.css (100%) rename frontend/{ => apps/remark42}/app/components/select/select.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/select/select.tsx (100%) rename frontend/{ => apps/remark42}/app/components/settings/__action/settings__action.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__dimmed/settings__dimmed.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__invisible/settings__invisible.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__list/settings__list.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__section/settings__section.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__user-id/settings__user-id.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/__username/settings__username.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/_theme/_dark/settings_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/_theme/_light/settings_theme_light.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/settings/settings.css (100%) rename frontend/{ => apps/remark42}/app/components/settings/settings.tsx (100%) rename frontend/{ => apps/remark42}/app/components/sort-picker.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/sort-picker.tsx (100%) rename frontend/{ => apps/remark42}/app/components/spinner/spinner.module.css (100%) rename frontend/{ => apps/remark42}/app/components/spinner/spinner.tsx (100%) rename frontend/{ => apps/remark42}/app/components/textarea-autosize.tsx (100%) rename frontend/{ => apps/remark42}/app/components/thread/__collapse/thread__collapse.css (100%) rename frontend/{ => apps/remark42}/app/components/thread/_theme_dark/thread_theme_dark.css (100%) rename frontend/{ => apps/remark42}/app/components/thread/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/thread/thread.css (100%) rename frontend/{ => apps/remark42}/app/components/thread/thread.tsx (100%) rename frontend/{ => apps/remark42}/app/components/tooltip/index.ts (100%) rename frontend/{ => apps/remark42}/app/components/tooltip/tooltip.module.css (100%) rename frontend/{ => apps/remark42}/app/components/tooltip/tooltip.spec.tsx (100%) rename frontend/{ => apps/remark42}/app/components/tooltip/tooltip.tsx (100%) rename frontend/{ => apps/remark42}/app/counter.ts (100%) rename frontend/{ => apps/remark42}/app/deleteme.ts (100%) rename frontend/{ => apps/remark42}/app/embed.ts (100%) rename frontend/{ => apps/remark42}/app/hooks/useAction.ts (100%) rename frontend/{ => apps/remark42}/app/hooks/useTheme.ts (100%) rename frontend/{ => apps/remark42}/app/last-comments.tsx (100%) rename frontend/{ => apps/remark42}/app/locales/ar.json (100%) rename frontend/{ => apps/remark42}/app/locales/be.json (100%) rename frontend/{ => apps/remark42}/app/locales/bg.json (100%) rename frontend/{ => apps/remark42}/app/locales/bp.json (100%) rename frontend/{ => apps/remark42}/app/locales/de.json (100%) rename frontend/{ => apps/remark42}/app/locales/en.json (100%) rename frontend/{ => apps/remark42}/app/locales/es.json (100%) rename frontend/{ => apps/remark42}/app/locales/fi.json (100%) rename frontend/{ => apps/remark42}/app/locales/fr.json (100%) rename frontend/{ => apps/remark42}/app/locales/it.json (100%) rename frontend/{ => apps/remark42}/app/locales/ja.json (100%) rename frontend/{ => apps/remark42}/app/locales/ko.json (100%) rename frontend/{ => apps/remark42}/app/locales/pl.json (100%) rename frontend/{ => apps/remark42}/app/locales/ru.json (100%) rename frontend/{ => apps/remark42}/app/locales/tr.json (100%) rename frontend/{ => apps/remark42}/app/locales/ua.json (100%) rename frontend/{ => apps/remark42}/app/locales/vi.json (100%) rename frontend/{ => apps/remark42}/app/locales/zh.json (100%) rename frontend/{ => apps/remark42}/app/profile.ts (100%) rename frontend/{ => apps/remark42}/app/remark.tsx (100%) rename frontend/{ => apps/remark42}/app/store/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/actions.test.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/getters.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/types.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/utils.test.ts (100%) rename frontend/{ => apps/remark42}/app/store/comments/utils.ts (100%) rename frontend/{ => apps/remark42}/app/store/index.ts (100%) rename frontend/{ => apps/remark42}/app/store/post-info/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/post-info/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/post-info/types.ts (100%) rename frontend/{ => apps/remark42}/app/store/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/theme/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/theme/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/theme/types.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/getters.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/reducers.test.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/types.ts (100%) rename frontend/{ => apps/remark42}/app/store/thread/utils.ts (100%) rename frontend/{ => apps/remark42}/app/store/user/__stubs__/comments-store.json (100%) rename frontend/{ => apps/remark42}/app/store/user/actions.test.ts (100%) rename frontend/{ => apps/remark42}/app/store/user/actions.ts (100%) rename frontend/{ => apps/remark42}/app/store/user/reducers.test.ts (100%) rename frontend/{ => apps/remark42}/app/store/user/reducers.ts (100%) rename frontend/{ => apps/remark42}/app/store/user/types.ts (100%) rename frontend/{ => apps/remark42}/app/styles/custom-properties.css (100%) rename frontend/{ => apps/remark42}/app/styles/global.css (100%) rename frontend/{ => apps/remark42}/app/tests/utils.tsx (100%) rename frontend/{ => apps/remark42}/app/typings/css-modules.d.ts (100%) rename frontend/{ => apps/remark42}/app/typings/enzyme.d.ts (100%) rename frontend/{ => apps/remark42}/app/typings/global.d.ts (100%) rename frontend/{ => apps/remark42}/app/typings/jest-localstorage-mock.d.ts (100%) rename frontend/{ => apps/remark42}/app/typings/preact.d.ts (100%) rename frontend/{ => apps/remark42}/app/typings/svg.d.ts (100%) rename frontend/{ => apps/remark42}/app/utils/actionBinder.ts (100%) rename frontend/{ => apps/remark42}/app/utils/bench.ts (100%) rename frontend/{ => apps/remark42}/app/utils/capitalize-first-letter.spec.ts (100%) rename frontend/{ => apps/remark42}/app/utils/capitalize-first-letter.ts (100%) rename frontend/{ => apps/remark42}/app/utils/cmpRef.ts (100%) rename frontend/{ => apps/remark42}/app/utils/create-iframe.ts (100%) rename frontend/{ => apps/remark42}/app/utils/debounce.ts (100%) rename frontend/{ => apps/remark42}/app/utils/debug-node.ts (100%) rename frontend/{ => apps/remark42}/app/utils/derequire.ts (100%) rename frontend/{ => apps/remark42}/app/utils/email.ts (100%) rename frontend/{ => apps/remark42}/app/utils/errorUtils.ts (100%) rename frontend/{ => apps/remark42}/app/utils/get-hidden-users.test.ts (100%) rename frontend/{ => apps/remark42}/app/utils/get-hidden-users.ts (100%) rename frontend/{ => apps/remark42}/app/utils/getLocale.ts (100%) rename frontend/{ => apps/remark42}/app/utils/is-object.spec.ts (100%) rename frontend/{ => apps/remark42}/app/utils/is-object.ts (100%) rename frontend/{ => apps/remark42}/app/utils/isUserAnonymous.test.ts (100%) rename frontend/{ => apps/remark42}/app/utils/isUserAnonymous.ts (100%) rename frontend/{ => apps/remark42}/app/utils/jwt.test.ts (100%) rename frontend/{ => apps/remark42}/app/utils/jwt.ts (100%) rename frontend/{ => apps/remark42}/app/utils/loadLocale.ts (100%) rename frontend/{ => apps/remark42}/app/utils/parse-query.test.ts (100%) rename frontend/{ => apps/remark42}/app/utils/parse-query.ts (100%) rename frontend/{ => apps/remark42}/app/utils/post-message.ts (100%) rename frontend/{ => apps/remark42}/app/utils/replaceSelection.ts (100%) rename frontend/{ => apps/remark42}/app/utils/set-dom-props.ts (100%) rename frontend/{ => apps/remark42}/app/utils/shallowCompare.ts (100%) rename frontend/{ => apps/remark42}/app/utils/sleep.ts (100%) rename frontend/{ => apps/remark42}/app/utils/ttl-to-time.ts (100%) rename frontend/{ => apps/remark42}/codecov.yml (100%) rename frontend/{ => apps/remark42}/jest.config.ts (100%) rename frontend/{ => apps/remark42}/jest.setup.ts (100%) create mode 100644 frontend/apps/remark42/package.json rename frontend/{ => apps/remark42}/remark.image (100%) rename frontend/{ => apps/remark42}/tasks/checkTranslation.js (100%) rename frontend/{ => apps/remark42}/tasks/generateDictionary.js (100%) rename frontend/{ => apps/remark42}/tasks/getLocalePath.js (100%) rename frontend/{ => apps/remark42}/tasks/getSupportedLocales.js (100%) rename frontend/{ => apps/remark42}/tasks/getTranslationKeys.js (100%) rename frontend/{ => apps/remark42}/tasks/localeLoadTemplate.js (100%) rename frontend/{ => apps/remark42}/tasks/supportedLocales.json (100%) rename frontend/{ => apps/remark42}/templates/comments.ejs (100%) rename frontend/{ => apps/remark42}/templates/counter.ejs (100%) rename frontend/{ => apps/remark42}/templates/deleteme.ejs (100%) rename frontend/{ => apps/remark42}/templates/demo.ejs (100%) rename frontend/{ => apps/remark42}/templates/iframe.ejs (100%) rename frontend/{ => apps/remark42}/templates/last-comments.ejs (100%) rename frontend/{ => apps/remark42}/templates/markdown-help.html (100%) rename frontend/{ => apps/remark42}/templates/privacy.html (100%) rename frontend/{ => apps/remark42}/tsconfig.json (100%) rename frontend/{ => apps/remark42}/webpack.config.js (100%) create mode 100644 frontend/packages/api/.lintstagedrc.cjs create mode 100755 frontend/packages/api/dist/index.d.ts create mode 100755 frontend/packages/api/dist/index.js create mode 100644 frontend/packages/api/jest.config.ts create mode 100644 frontend/packages/api/package.json create mode 100644 frontend/packages/api/src/index.spec.ts create mode 100644 frontend/packages/api/src/index.ts create mode 100644 frontend/packages/api/tsconfig.json create mode 100644 frontend/pnpm-workspace.yaml create mode 100644 frontend/turbo.json diff --git a/.github/workflows/ci-frontend-size-limit.yml b/.github/workflows/ci-frontend-size-limit.yml index 7e06b48907..a65b52da8e 100644 --- a/.github/workflows/ci-frontend-size-limit.yml +++ b/.github/workflows/ci-frontend-size-limit.yml @@ -14,7 +14,7 @@ jobs: CI_JOB_NUMBER: 1 steps: - name: Checkout - uses: actions/checkout@v1 + uses: actions/checkout@v3 - name: Install pnpm uses: pnpm/action-setup@v2.0.1 @@ -27,4 +27,4 @@ jobs: uses: andresz1/size-limit-action@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} - directory: frontend + directory: frontend/apps/remark42 diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml index 77b82b79d8..af7748faa5 100644 --- a/.github/workflows/ci-frontend.yml +++ b/.github/workflows/ci-frontend.yml @@ -1,13 +1,6 @@ name: frontend on: - push: - branches: - tags: - paths: - - ".github/workflows/ci-frontend.yml" - - "frontend/**" - - "!**.md" pull_request: paths: - ".github/workflows/ci-frontend.yml" @@ -15,7 +8,7 @@ on: - "!**.md" jobs: - check-translations: + translations: runs-on: ubuntu-latest strategy: matrix: @@ -23,10 +16,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install node - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} @@ -51,57 +44,14 @@ jobs: ${{ runner.os }}-pnpm-store- - name: Install dependencies - run: pnpm i --loglevel warn + run: pnpm i working-directory: ./frontend - name: Run translations check - run: pnpm run check:translation - working-directory: ./frontend - - check-typescript: - runs-on: ubuntu-latest - strategy: - matrix: - node: [16.15.1] - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Install node - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node }} - - - name: Install pnpm - uses: pnpm/action-setup@v2.0.1 - id: pnpm-install - with: - version: 7 - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - run: | - echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + run: pnpm translation-check + working-directory: ./frontend/apps/remark42 - - name: Setup pnpm cache - uses: actions/cache@v3 - with: - path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - - name: Install dependencies - run: pnpm i --loglevel warn - working-directory: ./frontend - - - name: Run type check - run: pnpm run check:types - working-directory: ./frontend - - lint: + checks: runs-on: ubuntu-latest strategy: matrix: @@ -109,10 +59,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install node - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} @@ -140,8 +90,8 @@ jobs: run: pnpm i --loglevel warn working-directory: ./frontend - - name: Run linters - run: pnpm run lint + - name: Run checks + run: pnpm checks working-directory: ./frontend test: @@ -152,10 +102,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install node - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} @@ -180,14 +130,14 @@ jobs: ${{ runner.os }}-pnpm-store- - name: Install dependencies - run: pnpm i --loglevel warn + run: pnpm i working-directory: ./frontend - name: Collect tests coverage - run: pnpm run test --coverage - working-directory: ./frontend + run: pnpm coverage + working-directory: ./frontend/apps/remark42 - name: Submit coverage - run: ${{ github.workspace }}/frontend/node_modules/.bin/codecov + run: ${{ github.workspace }}/frontend/apps/remark42/node_modules/.bin/codecov env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/ci-site.yml b/.github/workflows/ci-site.yml index 8bd7f5529b..55b1f7d669 100644 --- a/.github/workflows/ci-site.yml +++ b/.github/workflows/ci-site.yml @@ -1,19 +1,12 @@ name: site on: - push: - branches: - tags: - paths: - - ".github/workflows/ci-site.yml" - - "site/**" pull_request: paths: - ".github/workflows/ci-site.yml" - "site/**" jobs: - build-site: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 78dc4bfbde..0655a1e246 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ debug.test remark42 /bin/ /backend/var/ -/backend/app/var/ +/var/ /backend/web/ /backend/*.html.tmpl compose-private-backend.yml diff --git a/Dockerfile b/Dockerfile index 191cda9bba..6460721f44 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,37 @@ +FROM --platform=$BUILDPLATFORM node:16.15.1-alpine AS frontend-deps + +ARG SKIP_FRONTEND_TEST +ARG SKIP_FRONTEND_BUILD + +WORKDIR /srv/frontend + +COPY ./frontend/package.json ./frontend/pnpm-lock.yaml ./frontend/pnpm-workspace.yaml /srv/frontend +COPY ./frontend/apps/remark42/package.json /srv/frontend/apps/remark42/package.json + +RUN \ + if [[ -z "$SKIP_FRONTEND_BUILD" || -z "$SKIP_FRONTEND_TEST" ]]; then \ + apk add --no-cache --update git && \ + npm i -g pnpm; \ + fi + +RUN --mount=type=cache,id=pnpm,target=/root/.pnpm-store/v3 \ + if [[ -z "$SKIP_FRONTEND_BUILD" || -z "$SKIP_FRONTEND_TEST" ]]; then \ + pnpm i; \ + fi + +FROM --platform=$BUILDPLATFORM frontend-deps AS build-frontend + +ARG SKIP_FRONTEND_TEST +ARG SKIP_FRONTEND_BUILD +ENV CI=true + +WORKDIR /srv/frontend + +COPY ./frontend/ /srv/frontend/ + +RUN [ -n "$SKIP_FRONTEND_TEST" ] && pnpm checks +RUN [ -n "$SKIP_FRONTEND_BUILD" ] && pnpm build + FROM umputun/baseimage:buildgo-v1.9.1 as build-backend ARG CI @@ -25,7 +59,7 @@ RUN \ cat /profile.cov_tmp | grep -v "_mock.go" > /profile.cov ; \ golangci-lint run --config ../.golangci.yml ./... ; \ else \ - echo "skip backend tests and linter" \ + echo "skip backend tests and linter" \ ; fi RUN \ @@ -33,45 +67,6 @@ RUN \ echo "version=$version" && \ go build -o remark42 -ldflags "-X main.revision=${version} -s -w" ./app -FROM --platform=$BUILDPLATFORM node:16.15.1-alpine as build-frontend-deps - -ARG CI -ARG SKIP_FRONTEND_BUILD -ENV HUSKY_SKIP_INSTALL=true - -RUN if [ -z "$SKIP_FRONTEND_BUILD" ] ; then \ - apk add --no-cache --update git \ - ; fi -ADD frontend/package.json /srv/frontend/package.json -ADD frontend/package-lock.json /srv/frontend/package-lock.json -WORKDIR /srv/frontend -RUN if [ -z "$SKIP_FRONTEND_BUILD" ] ; then \ - npm i -g pnpm && \ - CI=true pnpm i --loglevel warn \ - else \ - echo "skip frontend build" \ - ; fi - -FROM --platform=$BUILDPLATFORM node:16.15.1-alpine as build-frontend - -ARG CI -ARG SKIP_FRONTEND_TEST -ARG SKIP_FRONTEND_BUILD -ARG NODE_ENV=production - -COPY --from=build-frontend-deps /srv/frontend/node_modules /srv/frontend/node_modules -ADD frontend /srv/frontend -WORKDIR /srv/frontend -RUN mkdir public -RUN if [ -z "$SKIP_FRONTEND_BUILD" ] ; then \ - if [ -z "$SKIP_FRONTEND_TEST" ] ; then \ - npm run lint test check; \ - else \ - echo "skip frontend tests and lint" ; npm run build \ - ; fi \ - ; fi -RUN rm -rf ./node_modules - FROM umputun/baseimage:app-v1.9.1 WORKDIR /srv @@ -84,7 +79,7 @@ RUN chmod +x /entrypoint.sh /usr/local/bin/backup /usr/local/bin/restore /usr/lo COPY --from=build-backend /build/backend/remark42 /srv/remark42 COPY --from=build-backend /build/backend/templates /srv -COPY --from=build-frontend /srv/frontend/public/ /srv/web +COPY --from=build-frontend /srv/frontend/apps/remark42/public/ /srv/web/ COPY docker-init.sh /srv/init.sh RUN chown -R app:app /srv RUN ln -s /srv/remark42 /usr/bin/remark42 diff --git a/Dockerfile.artifacts b/Dockerfile.artifacts index 49bb6fd72e..d9d8559f36 100644 --- a/Dockerfile.artifacts +++ b/Dockerfile.artifacts @@ -1,30 +1,24 @@ -FROM node:16.15.1-alpine as build-frontend-deps +FROM node:16.15.1-alpine AS frontend-deps -ARG CI - -ENV SKIP_FRONTEND_TEST=true ENV CI=true -ADD frontend/package.json /srv/frontend/package.json -ADD frontend/package-lock.json /srv/frontend/package-lock.json -RUN - cd /srv/frontend && \ - apk add --no-cache --update git && \ - npm i -g pnpm && \ - pnpm i +WORKDIR /srv/frontend + +COPY ./frontend/package.json ./frontend/pnpm-lock.yaml ./frontend/pnpm-workspace.yaml /srv/frontend +COPY ./frontend/apps/remark42/package.json /srv/frontend/apps/remark42/package.json + +RUN apk add --no-cache --update git && npm i -g pnpm +RUN --mount=type=cache,id=pnpm,target=/root/.pnpm-store/v3 pnpm i -FROM node:16.15.1-alpine as build-frontend +FROM frontend-deps AS build-frontend + +ENV NODE_ENV=production +ENV CI=true -ARG CI -ARG NODE_ENV=production -ENV SKIP_FRONTEND_TEST=true -ENV HUSKY_SKIP_INSTALL=true +WORKDIR /srv/frontend -COPY --from=build-frontend-deps /srv/frontend/node_modules /srv/frontend/node_modules -ADD frontend /srv/frontend -RUN cd /srv/frontend && \ - npm run build && \ - rm -rf ./node_modules +COPY ./frontend/ /srv/frontend/ +RUN pnpm build FROM umputun/baseimage:buildgo-v1.9.1 as build-backend @@ -38,7 +32,7 @@ ADD backend /build/backend ADD README.md /build/ ADD LICENSE /build/ -COPY --from=build-frontend /srv/frontend/public/ web +COPY --from=build-frontend /srv/frontend/apps/remark42/public/ /build/backend/web/ RUN \ export WEB_ROOT=/build/backend/web && \ @@ -50,7 +44,7 @@ RUN \ ls -la /build/backend/web/ RUN \ - version=$("/script/version.sh") && echo "version=${version}" && \ + version=$("/script/version.sh") && echo "version=${version}" && \ export GOFLAGS="-mod=vendor" && \ GOOS=linux GOARCH=amd64 go build -o remark42.linux-amd64 -ldflags "-X main.revision=${version} -s -w" ./app && \ GOOS=linux GOARCH=386 go build -o remark42.linux-386 -ldflags "-X main.revision=${version} -s -w" ./app && \ diff --git a/Makefile b/Makefile index b398496117..b0b467d22c 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ dockerx: release: docker build -f Dockerfile.artifacts --no-cache --pull --build-arg CI=true \ - --build-arg GITHUB_REF=$(GITHUB_REF) --build-arg GITHUB_SHA=$(GITHUB_SHA) -t remark42.bin . + --build-arg GITHUB_REF=$(GITHUB_REF) --build-arg GITHUB_SHA=$(GITHUB_SHA) -t remark42.bin . - @docker rm -f remark42.bin 2>/dev/null || exit 0 - @mkdir -p bin docker run -d --name=remark42.bin remark42.bin diff --git a/compose-dev-frontend.yml b/compose-dev-frontend.yml index 3d5d4ca87d..e1fa4a8069 100644 --- a/compose-dev-frontend.yml +++ b/compose-dev-frontend.yml @@ -13,8 +13,8 @@ services: dockerfile: Dockerfile args: - SKIP_BACKEND_TEST=true - - SKIP_FRONTEND_BUILD=true - # - NODE_ENV=development + # - SKIP_FRONTEND_BUILD=true + # - SKIP_FRONTEND_TEST=true image: umputun/remark42:dev container_name: "remark42-dev" diff --git a/frontend/.gitignore b/frontend/.gitignore index fcf8fbbad6..ae7d20f10a 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,7 +1,10 @@ node_modules extracted-messages -public *.log .env tsconfig.tsbuildinfo coverage +.turbo +public +dist +!remark42 diff --git a/frontend/.husky/post-commit b/frontend/.husky/post-commit index 1fc985a62c..07682730e0 100644 --- a/frontend/.husky/post-commit +++ b/frontend/.husky/post-commit @@ -1,2 +1,3 @@ # .husky/post-commit +cd frontend git update-index --again diff --git a/frontend/.husky/pre-commit b/frontend/.husky/pre-commit index 66b0f0b08f..db457562ca 100644 --- a/frontend/.husky/pre-commit +++ b/frontend/.husky/pre-commit @@ -1,3 +1,4 @@ # .husky/pre-commit -npx --no-install lint-staged -lint-staged + +cd frontend +pnpm run lint-staged diff --git a/frontend/.lintstagedrc.js b/frontend/.lintstagedrc.js deleted file mode 100644 index 96730e4e24..0000000000 --- a/frontend/.lintstagedrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - './**/*.{ts,tsx,js,jsx}': ['eslint --fix --max-warnings=0', 'prettier --write'], - './**/*.css': ['prettier --write', 'stylelint'], - './templates/**.html': ['prettier --write', 'stylelint'], -}; diff --git a/frontend/.babelrc.js b/frontend/apps/remark42/.babelrc.js similarity index 100% rename from frontend/.babelrc.js rename to frontend/apps/remark42/.babelrc.js diff --git a/frontend/.eslintignore b/frontend/apps/remark42/.eslintignore similarity index 100% rename from frontend/.eslintignore rename to frontend/apps/remark42/.eslintignore diff --git a/frontend/.eslintrc.js b/frontend/apps/remark42/.eslintrc.js similarity index 100% rename from frontend/.eslintrc.js rename to frontend/apps/remark42/.eslintrc.js diff --git a/frontend/apps/remark42/.lintstagedrc.cjs b/frontend/apps/remark42/.lintstagedrc.cjs new file mode 100644 index 0000000000..895df8e47a --- /dev/null +++ b/frontend/apps/remark42/.lintstagedrc.cjs @@ -0,0 +1,5 @@ +module.exports = { + './**/*.{ts,tsx}': ['pnpm lint --fix', 'pnpm format'], + './**/*.css': ['pnpm stylelint --fix', 'pnpm format'], + './apps/remark42/templates/**.html': ['pnpm stylelint --fix', 'pnpm format'], +}; diff --git a/frontend/.nvmrc b/frontend/apps/remark42/.nvmrc similarity index 100% rename from frontend/.nvmrc rename to frontend/apps/remark42/.nvmrc diff --git a/frontend/.prettierignore b/frontend/apps/remark42/.prettierignore similarity index 100% rename from frontend/.prettierignore rename to frontend/apps/remark42/.prettierignore diff --git a/frontend/.prettierrc.js b/frontend/apps/remark42/.prettierrc.js similarity index 100% rename from frontend/.prettierrc.js rename to frontend/apps/remark42/.prettierrc.js diff --git a/frontend/.size-limit.js b/frontend/apps/remark42/.size-limit.js similarity index 100% rename from frontend/.size-limit.js rename to frontend/apps/remark42/.size-limit.js diff --git a/frontend/.stylelintignore b/frontend/apps/remark42/.stylelintignore similarity index 100% rename from frontend/.stylelintignore rename to frontend/apps/remark42/.stylelintignore diff --git a/frontend/.stylelintrc.js b/frontend/apps/remark42/.stylelintrc.js similarity index 100% rename from frontend/.stylelintrc.js rename to frontend/apps/remark42/.stylelintrc.js diff --git a/frontend/README.md b/frontend/apps/remark42/README.md similarity index 100% rename from frontend/README.md rename to frontend/apps/remark42/README.md diff --git a/frontend/app/__mocks__/fetch.ts b/frontend/apps/remark42/app/__mocks__/fetch.ts similarity index 100% rename from frontend/app/__mocks__/fetch.ts rename to frontend/apps/remark42/app/__mocks__/fetch.ts diff --git a/frontend/app/__mocks__/localstorage.ts b/frontend/apps/remark42/app/__mocks__/localstorage.ts similarity index 100% rename from frontend/app/__mocks__/localstorage.ts rename to frontend/apps/remark42/app/__mocks__/localstorage.ts diff --git a/frontend/app/__stubs__/jwt.ts b/frontend/apps/remark42/app/__stubs__/jwt.ts similarity index 100% rename from frontend/app/__stubs__/jwt.ts rename to frontend/apps/remark42/app/__stubs__/jwt.ts diff --git a/frontend/app/__stubs__/remark-config.ts b/frontend/apps/remark42/app/__stubs__/remark-config.ts similarity index 100% rename from frontend/app/__stubs__/remark-config.ts rename to frontend/apps/remark42/app/__stubs__/remark-config.ts diff --git a/frontend/app/__stubs__/static-config.ts b/frontend/apps/remark42/app/__stubs__/static-config.ts similarity index 100% rename from frontend/app/__stubs__/static-config.ts rename to frontend/apps/remark42/app/__stubs__/static-config.ts diff --git a/frontend/app/__stubs__/store.ts b/frontend/apps/remark42/app/__stubs__/store.ts similarity index 100% rename from frontend/app/__stubs__/store.ts rename to frontend/apps/remark42/app/__stubs__/store.ts diff --git a/frontend/app/__stubs__/svg.tsx b/frontend/apps/remark42/app/__stubs__/svg.tsx similarity index 100% rename from frontend/app/__stubs__/svg.tsx rename to frontend/apps/remark42/app/__stubs__/svg.tsx diff --git a/frontend/app/__stubs__/user.ts b/frontend/apps/remark42/app/__stubs__/user.ts similarity index 100% rename from frontend/app/__stubs__/user.ts rename to frontend/apps/remark42/app/__stubs__/user.ts diff --git a/frontend/app/assets/social/dev.svg b/frontend/apps/remark42/app/assets/social/dev.svg similarity index 100% rename from frontend/app/assets/social/dev.svg rename to frontend/apps/remark42/app/assets/social/dev.svg diff --git a/frontend/app/assets/social/facebook.svg b/frontend/apps/remark42/app/assets/social/facebook.svg similarity index 100% rename from frontend/app/assets/social/facebook.svg rename to frontend/apps/remark42/app/assets/social/facebook.svg diff --git a/frontend/app/assets/social/github-dark.svg b/frontend/apps/remark42/app/assets/social/github-dark.svg similarity index 100% rename from frontend/app/assets/social/github-dark.svg rename to frontend/apps/remark42/app/assets/social/github-dark.svg diff --git a/frontend/app/assets/social/github-light.svg b/frontend/apps/remark42/app/assets/social/github-light.svg similarity index 100% rename from frontend/app/assets/social/github-light.svg rename to frontend/apps/remark42/app/assets/social/github-light.svg diff --git a/frontend/app/assets/social/google.svg b/frontend/apps/remark42/app/assets/social/google.svg similarity index 100% rename from frontend/app/assets/social/google.svg rename to frontend/apps/remark42/app/assets/social/google.svg diff --git a/frontend/app/assets/social/microsoft.svg b/frontend/apps/remark42/app/assets/social/microsoft.svg similarity index 100% rename from frontend/app/assets/social/microsoft.svg rename to frontend/apps/remark42/app/assets/social/microsoft.svg diff --git a/frontend/app/assets/social/patreon.svg b/frontend/apps/remark42/app/assets/social/patreon.svg similarity index 100% rename from frontend/app/assets/social/patreon.svg rename to frontend/apps/remark42/app/assets/social/patreon.svg diff --git a/frontend/app/assets/social/telegram.svg b/frontend/apps/remark42/app/assets/social/telegram.svg similarity index 100% rename from frontend/app/assets/social/telegram.svg rename to frontend/apps/remark42/app/assets/social/telegram.svg diff --git a/frontend/app/assets/social/twitter.svg b/frontend/apps/remark42/app/assets/social/twitter.svg similarity index 100% rename from frontend/app/assets/social/twitter.svg rename to frontend/apps/remark42/app/assets/social/twitter.svg diff --git a/frontend/app/assets/social/yandex.svg b/frontend/apps/remark42/app/assets/social/yandex.svg similarity index 100% rename from frontend/app/assets/social/yandex.svg rename to frontend/apps/remark42/app/assets/social/yandex.svg diff --git a/frontend/app/common/__mocks__/constants.ts b/frontend/apps/remark42/app/common/__mocks__/constants.ts similarity index 100% rename from frontend/app/common/__mocks__/constants.ts rename to frontend/apps/remark42/app/common/__mocks__/constants.ts diff --git a/frontend/app/common/accessibility.ts b/frontend/apps/remark42/app/common/accessibility.ts similarity index 100% rename from frontend/app/common/accessibility.ts rename to frontend/apps/remark42/app/common/accessibility.ts diff --git a/frontend/app/common/api.getLastComments.ts b/frontend/apps/remark42/app/common/api.getLastComments.ts similarity index 100% rename from frontend/app/common/api.getLastComments.ts rename to frontend/apps/remark42/app/common/api.getLastComments.ts diff --git a/frontend/app/common/api.test.ts b/frontend/apps/remark42/app/common/api.test.ts similarity index 100% rename from frontend/app/common/api.test.ts rename to frontend/apps/remark42/app/common/api.test.ts diff --git a/frontend/app/common/api.ts b/frontend/apps/remark42/app/common/api.ts similarity index 100% rename from frontend/app/common/api.ts rename to frontend/apps/remark42/app/common/api.ts diff --git a/frontend/app/common/constants.config.test.ts b/frontend/apps/remark42/app/common/constants.config.test.ts similarity index 100% rename from frontend/app/common/constants.config.test.ts rename to frontend/apps/remark42/app/common/constants.config.test.ts diff --git a/frontend/app/common/constants.config.ts b/frontend/apps/remark42/app/common/constants.config.ts similarity index 100% rename from frontend/app/common/constants.config.ts rename to frontend/apps/remark42/app/common/constants.config.ts diff --git a/frontend/app/common/constants.ts b/frontend/apps/remark42/app/common/constants.ts similarity index 100% rename from frontend/app/common/constants.ts rename to frontend/apps/remark42/app/common/constants.ts diff --git a/frontend/app/common/cookies.ts b/frontend/apps/remark42/app/common/cookies.ts similarity index 100% rename from frontend/app/common/cookies.ts rename to frontend/apps/remark42/app/common/cookies.ts diff --git a/frontend/app/common/copy.test.ts b/frontend/apps/remark42/app/common/copy.test.ts similarity index 100% rename from frontend/app/common/copy.test.ts rename to frontend/apps/remark42/app/common/copy.test.ts diff --git a/frontend/app/common/copy.ts b/frontend/apps/remark42/app/common/copy.ts similarity index 100% rename from frontend/app/common/copy.ts rename to frontend/apps/remark42/app/common/copy.ts diff --git a/frontend/app/common/fetcher.test.ts b/frontend/apps/remark42/app/common/fetcher.test.ts similarity index 100% rename from frontend/app/common/fetcher.test.ts rename to frontend/apps/remark42/app/common/fetcher.test.ts diff --git a/frontend/app/common/fetcher.ts b/frontend/apps/remark42/app/common/fetcher.ts similarity index 100% rename from frontend/app/common/fetcher.ts rename to frontend/apps/remark42/app/common/fetcher.ts diff --git a/frontend/app/common/local-storage.test.ts b/frontend/apps/remark42/app/common/local-storage.test.ts similarity index 100% rename from frontend/app/common/local-storage.test.ts rename to frontend/apps/remark42/app/common/local-storage.test.ts diff --git a/frontend/app/common/local-storage.ts b/frontend/apps/remark42/app/common/local-storage.ts similarity index 100% rename from frontend/app/common/local-storage.ts rename to frontend/apps/remark42/app/common/local-storage.ts diff --git a/frontend/app/common/settings.ts b/frontend/apps/remark42/app/common/settings.ts similarity index 100% rename from frontend/app/common/settings.ts rename to frontend/apps/remark42/app/common/settings.ts diff --git a/frontend/app/common/static-store.ts b/frontend/apps/remark42/app/common/static-store.ts similarity index 100% rename from frontend/app/common/static-store.ts rename to frontend/apps/remark42/app/common/static-store.ts diff --git a/frontend/app/common/types.ts b/frontend/apps/remark42/app/common/types.ts similarity index 100% rename from frontend/app/common/types.ts rename to frontend/apps/remark42/app/common/types.ts diff --git a/frontend/app/components/auth-panel/__column/auth-panel__column.css b/frontend/apps/remark42/app/components/auth-panel/__column/auth-panel__column.css similarity index 100% rename from frontend/app/components/auth-panel/__column/auth-panel__column.css rename to frontend/apps/remark42/app/components/auth-panel/__column/auth-panel__column.css diff --git a/frontend/app/components/auth-panel/__readonly-label/auth-panel__readonly-label.css b/frontend/apps/remark42/app/components/auth-panel/__readonly-label/auth-panel__readonly-label.css similarity index 100% rename from frontend/app/components/auth-panel/__readonly-label/auth-panel__readonly-label.css rename to frontend/apps/remark42/app/components/auth-panel/__readonly-label/auth-panel__readonly-label.css diff --git a/frontend/app/components/auth-panel/auth-panel.css b/frontend/apps/remark42/app/components/auth-panel/auth-panel.css similarity index 100% rename from frontend/app/components/auth-panel/auth-panel.css rename to frontend/apps/remark42/app/components/auth-panel/auth-panel.css diff --git a/frontend/app/components/auth-panel/auth-panel.module.css b/frontend/apps/remark42/app/components/auth-panel/auth-panel.module.css similarity index 100% rename from frontend/app/components/auth-panel/auth-panel.module.css rename to frontend/apps/remark42/app/components/auth-panel/auth-panel.module.css diff --git a/frontend/app/components/auth-panel/auth-panel.test.tsx b/frontend/apps/remark42/app/components/auth-panel/auth-panel.test.tsx similarity index 100% rename from frontend/app/components/auth-panel/auth-panel.test.tsx rename to frontend/apps/remark42/app/components/auth-panel/auth-panel.test.tsx diff --git a/frontend/app/components/auth-panel/auth-panel.tsx b/frontend/apps/remark42/app/components/auth-panel/auth-panel.tsx similarity index 100% rename from frontend/app/components/auth-panel/auth-panel.tsx rename to frontend/apps/remark42/app/components/auth-panel/auth-panel.tsx diff --git a/frontend/app/components/auth-panel/index.ts b/frontend/apps/remark42/app/components/auth-panel/index.ts similarity index 100% rename from frontend/app/components/auth-panel/index.ts rename to frontend/apps/remark42/app/components/auth-panel/index.ts diff --git a/frontend/app/components/auth/auth.api.ts b/frontend/apps/remark42/app/components/auth/auth.api.ts similarity index 100% rename from frontend/app/components/auth/auth.api.ts rename to frontend/apps/remark42/app/components/auth/auth.api.ts diff --git a/frontend/app/components/auth/auth.hooks.ts b/frontend/apps/remark42/app/components/auth/auth.hooks.ts similarity index 100% rename from frontend/app/components/auth/auth.hooks.ts rename to frontend/apps/remark42/app/components/auth/auth.hooks.ts diff --git a/frontend/app/components/auth/auth.messsages.ts b/frontend/apps/remark42/app/components/auth/auth.messsages.ts similarity index 100% rename from frontend/app/components/auth/auth.messsages.ts rename to frontend/apps/remark42/app/components/auth/auth.messsages.ts diff --git a/frontend/app/components/auth/auth.module.css b/frontend/apps/remark42/app/components/auth/auth.module.css similarity index 100% rename from frontend/app/components/auth/auth.module.css rename to frontend/apps/remark42/app/components/auth/auth.module.css diff --git a/frontend/app/components/auth/auth.spec.tsx b/frontend/apps/remark42/app/components/auth/auth.spec.tsx similarity index 100% rename from frontend/app/components/auth/auth.spec.tsx rename to frontend/apps/remark42/app/components/auth/auth.spec.tsx diff --git a/frontend/app/components/auth/auth.tsx b/frontend/apps/remark42/app/components/auth/auth.tsx similarity index 100% rename from frontend/app/components/auth/auth.tsx rename to frontend/apps/remark42/app/components/auth/auth.tsx diff --git a/frontend/app/components/auth/auth.utils.ts b/frontend/apps/remark42/app/components/auth/auth.utils.ts similarity index 100% rename from frontend/app/components/auth/auth.utils.ts rename to frontend/apps/remark42/app/components/auth/auth.utils.ts diff --git a/frontend/app/components/auth/components/button.module.css b/frontend/apps/remark42/app/components/auth/components/button.module.css similarity index 100% rename from frontend/app/components/auth/components/button.module.css rename to frontend/apps/remark42/app/components/auth/components/button.module.css diff --git a/frontend/app/components/auth/components/button.tsx b/frontend/apps/remark42/app/components/auth/components/button.tsx similarity index 100% rename from frontend/app/components/auth/components/button.tsx rename to frontend/apps/remark42/app/components/auth/components/button.tsx diff --git a/frontend/app/components/auth/components/oauth.consts.ts b/frontend/apps/remark42/app/components/auth/components/oauth.consts.ts similarity index 100% rename from frontend/app/components/auth/components/oauth.consts.ts rename to frontend/apps/remark42/app/components/auth/components/oauth.consts.ts diff --git a/frontend/app/components/auth/components/oauth.module.css b/frontend/apps/remark42/app/components/auth/components/oauth.module.css similarity index 100% rename from frontend/app/components/auth/components/oauth.module.css rename to frontend/apps/remark42/app/components/auth/components/oauth.module.css diff --git a/frontend/app/components/auth/components/oauth.spec.tsx b/frontend/apps/remark42/app/components/auth/components/oauth.spec.tsx similarity index 100% rename from frontend/app/components/auth/components/oauth.spec.tsx rename to frontend/apps/remark42/app/components/auth/components/oauth.spec.tsx diff --git a/frontend/app/components/auth/components/oauth.tsx b/frontend/apps/remark42/app/components/auth/components/oauth.tsx similarity index 100% rename from frontend/app/components/auth/components/oauth.tsx rename to frontend/apps/remark42/app/components/auth/components/oauth.tsx diff --git a/frontend/app/components/auth/components/oauth.utils.ts b/frontend/apps/remark42/app/components/auth/components/oauth.utils.ts similarity index 100% rename from frontend/app/components/auth/components/oauth.utils.ts rename to frontend/apps/remark42/app/components/auth/components/oauth.utils.ts diff --git a/frontend/app/components/auth/index.ts b/frontend/apps/remark42/app/components/auth/index.ts similarity index 100% rename from frontend/app/components/auth/index.ts rename to frontend/apps/remark42/app/components/auth/index.ts diff --git a/frontend/app/components/avatar/assets/ghost.svg b/frontend/apps/remark42/app/components/avatar/assets/ghost.svg similarity index 100% rename from frontend/app/components/avatar/assets/ghost.svg rename to frontend/apps/remark42/app/components/avatar/assets/ghost.svg diff --git a/frontend/app/components/avatar/avatar.module.css b/frontend/apps/remark42/app/components/avatar/avatar.module.css similarity index 100% rename from frontend/app/components/avatar/avatar.module.css rename to frontend/apps/remark42/app/components/avatar/avatar.module.css diff --git a/frontend/app/components/avatar/avatar.spec.tsx b/frontend/apps/remark42/app/components/avatar/avatar.spec.tsx similarity index 100% rename from frontend/app/components/avatar/avatar.spec.tsx rename to frontend/apps/remark42/app/components/avatar/avatar.spec.tsx diff --git a/frontend/app/components/avatar/avatar.tsx b/frontend/apps/remark42/app/components/avatar/avatar.tsx similarity index 100% rename from frontend/app/components/avatar/avatar.tsx rename to frontend/apps/remark42/app/components/avatar/avatar.tsx diff --git a/frontend/app/components/avatar/index.ts b/frontend/apps/remark42/app/components/avatar/index.ts similarity index 100% rename from frontend/app/components/avatar/index.ts rename to frontend/apps/remark42/app/components/avatar/index.ts diff --git a/frontend/app/components/button/_kind/_link/button_kind_link.css b/frontend/apps/remark42/app/components/button/_kind/_link/button_kind_link.css similarity index 100% rename from frontend/app/components/button/_kind/_link/button_kind_link.css rename to frontend/apps/remark42/app/components/button/_kind/_link/button_kind_link.css diff --git a/frontend/app/components/button/_kind/_primary/button_kind_primary.css b/frontend/apps/remark42/app/components/button/_kind/_primary/button_kind_primary.css similarity index 100% rename from frontend/app/components/button/_kind/_primary/button_kind_primary.css rename to frontend/apps/remark42/app/components/button/_kind/_primary/button_kind_primary.css diff --git a/frontend/app/components/button/_kind/_secondary/button_kind_secondary.css b/frontend/apps/remark42/app/components/button/_kind/_secondary/button_kind_secondary.css similarity index 100% rename from frontend/app/components/button/_kind/_secondary/button_kind_secondary.css rename to frontend/apps/remark42/app/components/button/_kind/_secondary/button_kind_secondary.css diff --git a/frontend/app/components/button/_size/_large/button_size_large.css b/frontend/apps/remark42/app/components/button/_size/_large/button_size_large.css similarity index 100% rename from frontend/app/components/button/_size/_large/button_size_large.css rename to frontend/apps/remark42/app/components/button/_size/_large/button_size_large.css diff --git a/frontend/app/components/button/_size/_middle/button_size_middle.css b/frontend/apps/remark42/app/components/button/_size/_middle/button_size_middle.css similarity index 100% rename from frontend/app/components/button/_size/_middle/button_size_middle.css rename to frontend/apps/remark42/app/components/button/_size/_middle/button_size_middle.css diff --git a/frontend/app/components/button/_theme/_dark/button_theme_dark.css b/frontend/apps/remark42/app/components/button/_theme/_dark/button_theme_dark.css similarity index 100% rename from frontend/app/components/button/_theme/_dark/button_theme_dark.css rename to frontend/apps/remark42/app/components/button/_theme/_dark/button_theme_dark.css diff --git a/frontend/app/components/button/button.css b/frontend/apps/remark42/app/components/button/button.css similarity index 100% rename from frontend/app/components/button/button.css rename to frontend/apps/remark42/app/components/button/button.css diff --git a/frontend/app/components/button/button.tsx b/frontend/apps/remark42/app/components/button/button.tsx similarity index 100% rename from frontend/app/components/button/button.tsx rename to frontend/apps/remark42/app/components/button/button.tsx diff --git a/frontend/app/components/button/index.ts b/frontend/apps/remark42/app/components/button/index.ts similarity index 100% rename from frontend/app/components/button/index.ts rename to frontend/apps/remark42/app/components/button/index.ts diff --git a/frontend/app/components/comment-form/__actions/comment-form__actions.css b/frontend/apps/remark42/app/components/comment-form/__actions/comment-form__actions.css similarity index 100% rename from frontend/app/components/comment-form/__actions/comment-form__actions.css rename to frontend/apps/remark42/app/components/comment-form/__actions/comment-form__actions.css diff --git a/frontend/app/components/comment-form/__button/_type/_preview/comment-form__button_type_preview.css b/frontend/apps/remark42/app/components/comment-form/__button/_type/_preview/comment-form__button_type_preview.css similarity index 100% rename from frontend/app/components/comment-form/__button/_type/_preview/comment-form__button_type_preview.css rename to frontend/apps/remark42/app/components/comment-form/__button/_type/_preview/comment-form__button_type_preview.css diff --git a/frontend/app/components/comment-form/__button/_type/_send/comment-form__button_type_send.css b/frontend/apps/remark42/app/components/comment-form/__button/_type/_send/comment-form__button_type_send.css similarity index 100% rename from frontend/app/components/comment-form/__button/_type/_send/comment-form__button_type_send.css rename to frontend/apps/remark42/app/components/comment-form/__button/_type/_send/comment-form__button_type_send.css diff --git a/frontend/app/components/comment-form/__button/comment-form__button.css b/frontend/apps/remark42/app/components/comment-form/__button/comment-form__button.css similarity index 100% rename from frontend/app/components/comment-form/__button/comment-form__button.css rename to frontend/apps/remark42/app/components/comment-form/__button/comment-form__button.css diff --git a/frontend/app/components/comment-form/__control-panel/comment-form__control-panel.css b/frontend/apps/remark42/app/components/comment-form/__control-panel/comment-form__control-panel.css similarity index 100% rename from frontend/app/components/comment-form/__control-panel/comment-form__control-panel.css rename to frontend/apps/remark42/app/components/comment-form/__control-panel/comment-form__control-panel.css diff --git a/frontend/app/components/comment-form/__counter/comment-form__counter.css b/frontend/apps/remark42/app/components/comment-form/__counter/comment-form__counter.css similarity index 100% rename from frontend/app/components/comment-form/__counter/comment-form__counter.css rename to frontend/apps/remark42/app/components/comment-form/__counter/comment-form__counter.css diff --git a/frontend/app/components/comment-form/__error/comment-form__error.css b/frontend/apps/remark42/app/components/comment-form/__error/comment-form__error.css similarity index 100% rename from frontend/app/components/comment-form/__error/comment-form__error.css rename to frontend/apps/remark42/app/components/comment-form/__error/comment-form__error.css diff --git a/frontend/app/components/comment-form/__field-wrapper/comment-form__field-wrapper.css b/frontend/apps/remark42/app/components/comment-form/__field-wrapper/comment-form__field-wrapper.css similarity index 100% rename from frontend/app/components/comment-form/__field-wrapper/comment-form__field-wrapper.css rename to frontend/apps/remark42/app/components/comment-form/__field-wrapper/comment-form__field-wrapper.css diff --git a/frontend/app/components/comment-form/__field/comment-form__field.css b/frontend/apps/remark42/app/components/comment-form/__field/comment-form__field.css similarity index 100% rename from frontend/app/components/comment-form/__field/comment-form__field.css rename to frontend/apps/remark42/app/components/comment-form/__field/comment-form__field.css diff --git a/frontend/app/components/comment-form/__markdown-link/comment-form__markdown-link.css b/frontend/apps/remark42/app/components/comment-form/__markdown-link/comment-form__markdown-link.css similarity index 100% rename from frontend/app/components/comment-form/__markdown-link/comment-form__markdown-link.css rename to frontend/apps/remark42/app/components/comment-form/__markdown-link/comment-form__markdown-link.css diff --git a/frontend/app/components/comment-form/__markdown-toolbar/comment-form__markdown-toolbar.css b/frontend/apps/remark42/app/components/comment-form/__markdown-toolbar/comment-form__markdown-toolbar.css similarity index 100% rename from frontend/app/components/comment-form/__markdown-toolbar/comment-form__markdown-toolbar.css rename to frontend/apps/remark42/app/components/comment-form/__markdown-toolbar/comment-form__markdown-toolbar.css diff --git a/frontend/app/components/comment-form/__markdown/comment-form__markdown.css b/frontend/apps/remark42/app/components/comment-form/__markdown/comment-form__markdown.css similarity index 100% rename from frontend/app/components/comment-form/__markdown/comment-form__markdown.css rename to frontend/apps/remark42/app/components/comment-form/__markdown/comment-form__markdown.css diff --git a/frontend/app/components/comment-form/__preview-wrapper/comment-form__preview-wrapper.css b/frontend/apps/remark42/app/components/comment-form/__preview-wrapper/comment-form__preview-wrapper.css similarity index 100% rename from frontend/app/components/comment-form/__preview-wrapper/comment-form__preview-wrapper.css rename to frontend/apps/remark42/app/components/comment-form/__preview-wrapper/comment-form__preview-wrapper.css diff --git a/frontend/app/components/comment-form/__preview/comment-form__preview.css b/frontend/apps/remark42/app/components/comment-form/__preview/comment-form__preview.css similarity index 100% rename from frontend/app/components/comment-form/__preview/comment-form__preview.css rename to frontend/apps/remark42/app/components/comment-form/__preview/comment-form__preview.css diff --git a/frontend/app/components/comment-form/__rss-link/comment-form__rss-link.css b/frontend/apps/remark42/app/components/comment-form/__rss-link/comment-form__rss-link.css similarity index 100% rename from frontend/app/components/comment-form/__rss-link/comment-form__rss-link.css rename to frontend/apps/remark42/app/components/comment-form/__rss-link/comment-form__rss-link.css diff --git a/frontend/app/components/comment-form/__rss/comment-form__rss.css b/frontend/apps/remark42/app/components/comment-form/__rss/comment-form__rss.css similarity index 100% rename from frontend/app/components/comment-form/__rss/comment-form__rss.css rename to frontend/apps/remark42/app/components/comment-form/__rss/comment-form__rss.css diff --git a/frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.css b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.css similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.css rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.css diff --git a/frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.test.tsx b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.test.tsx similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.test.tsx rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.test.tsx diff --git a/frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.tsx b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.tsx similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.tsx rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/comment-form__subscribe-by-email.tsx diff --git a/frontend/app/components/comment-form/__subscribe-by-email/index.ts b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/index.ts similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-email/index.ts rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-email/index.ts diff --git a/frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.css b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.css similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.css rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.css diff --git a/frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.test.tsx b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.test.tsx similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.test.tsx rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.test.tsx diff --git a/frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.tsx b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.tsx similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.tsx rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/comment-form__subscribe-by-rss.tsx diff --git a/frontend/app/components/comment-form/__subscribe-by-rss/index.ts b/frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/index.ts similarity index 100% rename from frontend/app/components/comment-form/__subscribe-by-rss/index.ts rename to frontend/apps/remark42/app/components/comment-form/__subscribe-by-rss/index.ts diff --git a/frontend/app/components/comment-form/_simple/comment-form_simple.css b/frontend/apps/remark42/app/components/comment-form/_simple/comment-form_simple.css similarity index 100% rename from frontend/app/components/comment-form/_simple/comment-form_simple.css rename to frontend/apps/remark42/app/components/comment-form/_simple/comment-form_simple.css diff --git a/frontend/app/components/comment-form/_theme/_dark/comment-form_theme_dark.css b/frontend/apps/remark42/app/components/comment-form/_theme/_dark/comment-form_theme_dark.css similarity index 100% rename from frontend/app/components/comment-form/_theme/_dark/comment-form_theme_dark.css rename to frontend/apps/remark42/app/components/comment-form/_theme/_dark/comment-form_theme_dark.css diff --git a/frontend/app/components/comment-form/_theme/_light/comment-form_theme_light.css b/frontend/apps/remark42/app/components/comment-form/_theme/_light/comment-form_theme_light.css similarity index 100% rename from frontend/app/components/comment-form/_theme/_light/comment-form_theme_light.css rename to frontend/apps/remark42/app/components/comment-form/_theme/_light/comment-form_theme_light.css diff --git a/frontend/app/components/comment-form/comment-form.css b/frontend/apps/remark42/app/components/comment-form/comment-form.css similarity index 100% rename from frontend/app/components/comment-form/comment-form.css rename to frontend/apps/remark42/app/components/comment-form/comment-form.css diff --git a/frontend/app/components/comment-form/comment-form.persist.ts b/frontend/apps/remark42/app/components/comment-form/comment-form.persist.ts similarity index 100% rename from frontend/app/components/comment-form/comment-form.persist.ts rename to frontend/apps/remark42/app/components/comment-form/comment-form.persist.ts diff --git a/frontend/app/components/comment-form/comment-form.spec.tsx b/frontend/apps/remark42/app/components/comment-form/comment-form.spec.tsx similarity index 100% rename from frontend/app/components/comment-form/comment-form.spec.tsx rename to frontend/apps/remark42/app/components/comment-form/comment-form.spec.tsx diff --git a/frontend/app/components/comment-form/comment-form.tsx b/frontend/apps/remark42/app/components/comment-form/comment-form.tsx similarity index 100% rename from frontend/app/components/comment-form/comment-form.tsx rename to frontend/apps/remark42/app/components/comment-form/comment-form.tsx diff --git a/frontend/app/components/comment-form/index.ts b/frontend/apps/remark42/app/components/comment-form/index.ts similarity index 100% rename from frontend/app/components/comment-form/index.ts rename to frontend/apps/remark42/app/components/comment-form/index.ts diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/bold-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/bold-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/bold-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/bold-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/code-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/code-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/code-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/code-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/header-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/header-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/header-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/header-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/image-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/image-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/image-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/image-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/italic-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/italic-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/italic-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/italic-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/link-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/link-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/link-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/link-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/ordered-list-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/ordered-list-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/ordered-list-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/ordered-list-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/quote-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/quote-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/quote-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/quote-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar-icons/unordered-list-icon.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/unordered-list-icon.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar-icons/unordered-list-icon.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar-icons/unordered-list-icon.tsx diff --git a/frontend/app/components/comment-form/markdown-toolbar.tsx b/frontend/apps/remark42/app/components/comment-form/markdown-toolbar.tsx similarity index 100% rename from frontend/app/components/comment-form/markdown-toolbar.tsx rename to frontend/apps/remark42/app/components/comment-form/markdown-toolbar.tsx diff --git a/frontend/app/components/comment-form/text-expander.module.css b/frontend/apps/remark42/app/components/comment-form/text-expander.module.css similarity index 100% rename from frontend/app/components/comment-form/text-expander.module.css rename to frontend/apps/remark42/app/components/comment-form/text-expander.module.css diff --git a/frontend/app/components/comment-form/text-expander.tsx b/frontend/apps/remark42/app/components/comment-form/text-expander.tsx similarity index 100% rename from frontend/app/components/comment-form/text-expander.tsx rename to frontend/apps/remark42/app/components/comment-form/text-expander.tsx diff --git a/frontend/app/components/comment/__body/comment__body.css b/frontend/apps/remark42/app/components/comment/__body/comment__body.css similarity index 100% rename from frontend/app/components/comment/__body/comment__body.css rename to frontend/apps/remark42/app/components/comment/__body/comment__body.css diff --git a/frontend/app/components/comment/__info/comment__info.css b/frontend/apps/remark42/app/components/comment/__info/comment__info.css similarity index 100% rename from frontend/app/components/comment/__info/comment__info.css rename to frontend/apps/remark42/app/components/comment/__info/comment__info.css diff --git a/frontend/app/components/comment/__input/comment__input.css b/frontend/apps/remark42/app/components/comment/__input/comment__input.css similarity index 100% rename from frontend/app/components/comment/__input/comment__input.css rename to frontend/apps/remark42/app/components/comment/__input/comment__input.css diff --git a/frontend/app/components/comment/__link-to-parent/_focused/comment__link-to-parent__focused.svg b/frontend/apps/remark42/app/components/comment/__link-to-parent/_focused/comment__link-to-parent__focused.svg similarity index 100% rename from frontend/app/components/comment/__link-to-parent/_focused/comment__link-to-parent__focused.svg rename to frontend/apps/remark42/app/components/comment/__link-to-parent/_focused/comment__link-to-parent__focused.svg diff --git a/frontend/app/components/comment/__link-to-parent/comment__link-to-parent.css b/frontend/apps/remark42/app/components/comment/__link-to-parent/comment__link-to-parent.css similarity index 100% rename from frontend/app/components/comment/__link-to-parent/comment__link-to-parent.css rename to frontend/apps/remark42/app/components/comment/__link-to-parent/comment__link-to-parent.css diff --git a/frontend/app/components/comment/__link-to-parent/comment__link-to-parent.svg b/frontend/apps/remark42/app/components/comment/__link-to-parent/comment__link-to-parent.svg similarity index 100% rename from frontend/app/components/comment/__link-to-parent/comment__link-to-parent.svg rename to frontend/apps/remark42/app/components/comment/__link-to-parent/comment__link-to-parent.svg diff --git a/frontend/app/components/comment/__status/comment__status.css b/frontend/apps/remark42/app/components/comment/__status/comment__status.css similarity index 100% rename from frontend/app/components/comment/__status/comment__status.css rename to frontend/apps/remark42/app/components/comment/__status/comment__status.css diff --git a/frontend/app/components/comment/__text/comment__text.css b/frontend/apps/remark42/app/components/comment/__text/comment__text.css similarity index 100% rename from frontend/app/components/comment/__text/comment__text.css rename to frontend/apps/remark42/app/components/comment/__text/comment__text.css diff --git a/frontend/app/components/comment/__time/comment__time.css b/frontend/apps/remark42/app/components/comment/__time/comment__time.css similarity index 100% rename from frontend/app/components/comment/__time/comment__time.css rename to frontend/apps/remark42/app/components/comment/__time/comment__time.css diff --git a/frontend/app/components/comment/__user-id/comment__user-id.css b/frontend/apps/remark42/app/components/comment/__user-id/comment__user-id.css similarity index 100% rename from frontend/app/components/comment/__user-id/comment__user-id.css rename to frontend/apps/remark42/app/components/comment/__user-id/comment__user-id.css diff --git a/frontend/app/components/comment/__username/comment__username.css b/frontend/apps/remark42/app/components/comment/__username/comment__username.css similarity index 100% rename from frontend/app/components/comment/__username/comment__username.css rename to frontend/apps/remark42/app/components/comment/__username/comment__username.css diff --git a/frontend/app/components/comment/_collapsed/comment_collapsed.css b/frontend/apps/remark42/app/components/comment/_collapsed/comment_collapsed.css similarity index 100% rename from frontend/app/components/comment/_collapsed/comment_collapsed.css rename to frontend/apps/remark42/app/components/comment/_collapsed/comment_collapsed.css diff --git a/frontend/app/components/comment/_editing/comment_editing.css b/frontend/apps/remark42/app/components/comment/_editing/comment_editing.css similarity index 100% rename from frontend/app/components/comment/_editing/comment_editing.css rename to frontend/apps/remark42/app/components/comment/_editing/comment_editing.css diff --git a/frontend/app/components/comment/_replying/comment_replying.css b/frontend/apps/remark42/app/components/comment/_replying/comment_replying.css similarity index 100% rename from frontend/app/components/comment/_replying/comment_replying.css rename to frontend/apps/remark42/app/components/comment/_replying/comment_replying.css diff --git a/frontend/app/components/comment/_theme/_dark/comment_theme_dark.css b/frontend/apps/remark42/app/components/comment/_theme/_dark/comment_theme_dark.css similarity index 100% rename from frontend/app/components/comment/_theme/_dark/comment_theme_dark.css rename to frontend/apps/remark42/app/components/comment/_theme/_dark/comment_theme_dark.css diff --git a/frontend/app/components/comment/_theme/_light/comment_theme_light.css b/frontend/apps/remark42/app/components/comment/_theme/_light/comment_theme_light.css similarity index 100% rename from frontend/app/components/comment/_theme/_light/comment_theme_light.css rename to frontend/apps/remark42/app/components/comment/_theme/_light/comment_theme_light.css diff --git a/frontend/app/components/comment/_useless/comment_useless.css b/frontend/apps/remark42/app/components/comment/_useless/comment_useless.css similarity index 100% rename from frontend/app/components/comment/_useless/comment_useless.css rename to frontend/apps/remark42/app/components/comment/_useless/comment_useless.css diff --git a/frontend/app/components/comment/_view/_admin/comment_view_admin.css b/frontend/apps/remark42/app/components/comment/_view/_admin/comment_view_admin.css similarity index 100% rename from frontend/app/components/comment/_view/_admin/comment_view_admin.css rename to frontend/apps/remark42/app/components/comment/_view/_admin/comment_view_admin.css diff --git a/frontend/app/components/comment/_view/_preview/comment_view_preview.css b/frontend/apps/remark42/app/components/comment/_view/_preview/comment_view_preview.css similarity index 100% rename from frontend/app/components/comment/_view/_preview/comment_view_preview.css rename to frontend/apps/remark42/app/components/comment/_view/_preview/comment_view_preview.css diff --git a/frontend/app/components/comment/_view/_user/comment_view_user.css b/frontend/apps/remark42/app/components/comment/_view/_user/comment_view_user.css similarity index 100% rename from frontend/app/components/comment/_view/_user/comment_view_user.css rename to frontend/apps/remark42/app/components/comment/_view/_user/comment_view_user.css diff --git a/frontend/app/components/comment/comment-actions.module.css b/frontend/apps/remark42/app/components/comment/comment-actions.module.css similarity index 100% rename from frontend/app/components/comment/comment-actions.module.css rename to frontend/apps/remark42/app/components/comment/comment-actions.module.css diff --git a/frontend/app/components/comment/comment-actions.spec.tsx b/frontend/apps/remark42/app/components/comment/comment-actions.spec.tsx similarity index 100% rename from frontend/app/components/comment/comment-actions.spec.tsx rename to frontend/apps/remark42/app/components/comment/comment-actions.spec.tsx diff --git a/frontend/app/components/comment/comment-actions.tsx b/frontend/apps/remark42/app/components/comment/comment-actions.tsx similarity index 100% rename from frontend/app/components/comment/comment-actions.tsx rename to frontend/apps/remark42/app/components/comment/comment-actions.tsx diff --git a/frontend/app/components/comment/comment-votes.module.css b/frontend/apps/remark42/app/components/comment/comment-votes.module.css similarity index 100% rename from frontend/app/components/comment/comment-votes.module.css rename to frontend/apps/remark42/app/components/comment/comment-votes.module.css diff --git a/frontend/app/components/comment/comment-votes.spec.tsx b/frontend/apps/remark42/app/components/comment/comment-votes.spec.tsx similarity index 100% rename from frontend/app/components/comment/comment-votes.spec.tsx rename to frontend/apps/remark42/app/components/comment/comment-votes.spec.tsx diff --git a/frontend/app/components/comment/comment-votes.tsx b/frontend/apps/remark42/app/components/comment/comment-votes.tsx similarity index 100% rename from frontend/app/components/comment/comment-votes.tsx rename to frontend/apps/remark42/app/components/comment/comment-votes.tsx diff --git a/frontend/app/components/comment/comment.css b/frontend/apps/remark42/app/components/comment/comment.css similarity index 100% rename from frontend/app/components/comment/comment.css rename to frontend/apps/remark42/app/components/comment/comment.css diff --git a/frontend/app/components/comment/comment.module.css b/frontend/apps/remark42/app/components/comment/comment.module.css similarity index 100% rename from frontend/app/components/comment/comment.module.css rename to frontend/apps/remark42/app/components/comment/comment.module.css diff --git a/frontend/app/components/comment/comment.test.tsx b/frontend/apps/remark42/app/components/comment/comment.test.tsx similarity index 100% rename from frontend/app/components/comment/comment.test.tsx rename to frontend/apps/remark42/app/components/comment/comment.test.tsx diff --git a/frontend/app/components/comment/comment.tsx b/frontend/apps/remark42/app/components/comment/comment.tsx similarity index 100% rename from frontend/app/components/comment/comment.tsx rename to frontend/apps/remark42/app/components/comment/comment.tsx diff --git a/frontend/app/components/comment/connected-comment.tsx b/frontend/apps/remark42/app/components/comment/connected-comment.tsx similarity index 100% rename from frontend/app/components/comment/connected-comment.tsx rename to frontend/apps/remark42/app/components/comment/connected-comment.tsx diff --git a/frontend/app/components/comment/getBlockingDurations.ts b/frontend/apps/remark42/app/components/comment/getBlockingDurations.ts similarity index 100% rename from frontend/app/components/comment/getBlockingDurations.ts rename to frontend/apps/remark42/app/components/comment/getBlockingDurations.ts diff --git a/frontend/app/components/comment/index.ts b/frontend/apps/remark42/app/components/comment/index.ts similarity index 100% rename from frontend/app/components/comment/index.ts rename to frontend/apps/remark42/app/components/comment/index.ts diff --git a/frontend/app/components/comment/styles.ts b/frontend/apps/remark42/app/components/comment/styles.ts similarity index 100% rename from frontend/app/components/comment/styles.ts rename to frontend/apps/remark42/app/components/comment/styles.ts diff --git a/frontend/app/components/countdown.tsx b/frontend/apps/remark42/app/components/countdown.tsx similarity index 100% rename from frontend/app/components/countdown.tsx rename to frontend/apps/remark42/app/components/countdown.tsx diff --git a/frontend/app/components/dropdown/__content/dropdown__content.css b/frontend/apps/remark42/app/components/dropdown/__content/dropdown__content.css similarity index 100% rename from frontend/app/components/dropdown/__content/dropdown__content.css rename to frontend/apps/remark42/app/components/dropdown/__content/dropdown__content.css diff --git a/frontend/app/components/dropdown/__item/dropdown__item.css b/frontend/apps/remark42/app/components/dropdown/__item/dropdown__item.css similarity index 100% rename from frontend/app/components/dropdown/__item/dropdown__item.css rename to frontend/apps/remark42/app/components/dropdown/__item/dropdown__item.css diff --git a/frontend/app/components/dropdown/__item/dropdown__item.tsx b/frontend/apps/remark42/app/components/dropdown/__item/dropdown__item.tsx similarity index 100% rename from frontend/app/components/dropdown/__item/dropdown__item.tsx rename to frontend/apps/remark42/app/components/dropdown/__item/dropdown__item.tsx diff --git a/frontend/app/components/dropdown/__item/index.ts b/frontend/apps/remark42/app/components/dropdown/__item/index.ts similarity index 100% rename from frontend/app/components/dropdown/__item/index.ts rename to frontend/apps/remark42/app/components/dropdown/__item/index.ts diff --git a/frontend/app/components/dropdown/__items/dropdown__items.css b/frontend/apps/remark42/app/components/dropdown/__items/dropdown__items.css similarity index 100% rename from frontend/app/components/dropdown/__items/dropdown__items.css rename to frontend/apps/remark42/app/components/dropdown/__items/dropdown__items.css diff --git a/frontend/app/components/dropdown/__title/dropdown__title.css b/frontend/apps/remark42/app/components/dropdown/__title/dropdown__title.css similarity index 100% rename from frontend/app/components/dropdown/__title/dropdown__title.css rename to frontend/apps/remark42/app/components/dropdown/__title/dropdown__title.css diff --git a/frontend/app/components/dropdown/_active/dropdown_active.css b/frontend/apps/remark42/app/components/dropdown/_active/dropdown_active.css similarity index 100% rename from frontend/app/components/dropdown/_active/dropdown_active.css rename to frontend/apps/remark42/app/components/dropdown/_active/dropdown_active.css diff --git a/frontend/app/components/dropdown/_theme/_dark/dropdown_theme_dark.css b/frontend/apps/remark42/app/components/dropdown/_theme/_dark/dropdown_theme_dark.css similarity index 100% rename from frontend/app/components/dropdown/_theme/_dark/dropdown_theme_dark.css rename to frontend/apps/remark42/app/components/dropdown/_theme/_dark/dropdown_theme_dark.css diff --git a/frontend/app/components/dropdown/_theme/_light/dropdown_theme_light.css b/frontend/apps/remark42/app/components/dropdown/_theme/_light/dropdown_theme_light.css similarity index 100% rename from frontend/app/components/dropdown/_theme/_light/dropdown_theme_light.css rename to frontend/apps/remark42/app/components/dropdown/_theme/_light/dropdown_theme_light.css diff --git a/frontend/app/components/dropdown/dropdown.css b/frontend/apps/remark42/app/components/dropdown/dropdown.css similarity index 100% rename from frontend/app/components/dropdown/dropdown.css rename to frontend/apps/remark42/app/components/dropdown/dropdown.css diff --git a/frontend/app/components/dropdown/dropdown.tsx b/frontend/apps/remark42/app/components/dropdown/dropdown.tsx similarity index 100% rename from frontend/app/components/dropdown/dropdown.tsx rename to frontend/apps/remark42/app/components/dropdown/dropdown.tsx diff --git a/frontend/app/components/dropdown/index.ts b/frontend/apps/remark42/app/components/dropdown/index.ts similarity index 100% rename from frontend/app/components/dropdown/index.ts rename to frontend/apps/remark42/app/components/dropdown/index.ts diff --git a/frontend/app/components/icon-button/icon-button.module.css b/frontend/apps/remark42/app/components/icon-button/icon-button.module.css similarity index 100% rename from frontend/app/components/icon-button/icon-button.module.css rename to frontend/apps/remark42/app/components/icon-button/icon-button.module.css diff --git a/frontend/app/components/icon-button/icon-button.tsx b/frontend/apps/remark42/app/components/icon-button/icon-button.tsx similarity index 100% rename from frontend/app/components/icon-button/icon-button.tsx rename to frontend/apps/remark42/app/components/icon-button/icon-button.tsx diff --git a/frontend/app/components/icons/arrow.spec.tsx b/frontend/apps/remark42/app/components/icons/arrow.spec.tsx similarity index 100% rename from frontend/app/components/icons/arrow.spec.tsx rename to frontend/apps/remark42/app/components/icons/arrow.spec.tsx diff --git a/frontend/app/components/icons/arrow.tsx b/frontend/apps/remark42/app/components/icons/arrow.tsx similarity index 100% rename from frontend/app/components/icons/arrow.tsx rename to frontend/apps/remark42/app/components/icons/arrow.tsx diff --git a/frontend/app/components/icons/cross.tsx b/frontend/apps/remark42/app/components/icons/cross.tsx similarity index 100% rename from frontend/app/components/icons/cross.tsx rename to frontend/apps/remark42/app/components/icons/cross.tsx diff --git a/frontend/app/components/icons/signout.tsx b/frontend/apps/remark42/app/components/icons/signout.tsx similarity index 100% rename from frontend/app/components/icons/signout.tsx rename to frontend/apps/remark42/app/components/icons/signout.tsx diff --git a/frontend/app/components/icons/verification.spec.tsx b/frontend/apps/remark42/app/components/icons/verification.spec.tsx similarity index 100% rename from frontend/app/components/icons/verification.spec.tsx rename to frontend/apps/remark42/app/components/icons/verification.spec.tsx diff --git a/frontend/app/components/icons/verification.tsx b/frontend/apps/remark42/app/components/icons/verification.tsx similarity index 100% rename from frontend/app/components/icons/verification.tsx rename to frontend/apps/remark42/app/components/icons/verification.tsx diff --git a/frontend/app/components/input/index.ts b/frontend/apps/remark42/app/components/input/index.ts similarity index 100% rename from frontend/app/components/input/index.ts rename to frontend/apps/remark42/app/components/input/index.ts diff --git a/frontend/app/components/input/input.module.css b/frontend/apps/remark42/app/components/input/input.module.css similarity index 100% rename from frontend/app/components/input/input.module.css rename to frontend/apps/remark42/app/components/input/input.module.css diff --git a/frontend/app/components/input/input.tsx b/frontend/apps/remark42/app/components/input/input.tsx similarity index 100% rename from frontend/app/components/input/input.tsx rename to frontend/apps/remark42/app/components/input/input.tsx diff --git a/frontend/app/components/list-comments/__item/list-comments__item.css b/frontend/apps/remark42/app/components/list-comments/__item/list-comments__item.css similarity index 100% rename from frontend/app/components/list-comments/__item/list-comments__item.css rename to frontend/apps/remark42/app/components/list-comments/__item/list-comments__item.css diff --git a/frontend/app/components/list-comments/index.ts b/frontend/apps/remark42/app/components/list-comments/index.ts similarity index 100% rename from frontend/app/components/list-comments/index.ts rename to frontend/apps/remark42/app/components/list-comments/index.ts diff --git a/frontend/app/components/list-comments/list-comments.tsx b/frontend/apps/remark42/app/components/list-comments/list-comments.tsx similarity index 100% rename from frontend/app/components/list-comments/list-comments.tsx rename to frontend/apps/remark42/app/components/list-comments/list-comments.tsx diff --git a/frontend/app/components/preloader.tsx b/frontend/apps/remark42/app/components/preloader.tsx similarity index 100% rename from frontend/app/components/preloader.tsx rename to frontend/apps/remark42/app/components/preloader.tsx diff --git a/frontend/app/components/profile/components/counter/counter.module.css b/frontend/apps/remark42/app/components/profile/components/counter/counter.module.css similarity index 100% rename from frontend/app/components/profile/components/counter/counter.module.css rename to frontend/apps/remark42/app/components/profile/components/counter/counter.module.css diff --git a/frontend/app/components/profile/components/counter/counter.spec.tsx b/frontend/apps/remark42/app/components/profile/components/counter/counter.spec.tsx similarity index 100% rename from frontend/app/components/profile/components/counter/counter.spec.tsx rename to frontend/apps/remark42/app/components/profile/components/counter/counter.spec.tsx diff --git a/frontend/app/components/profile/components/counter/counter.tsx b/frontend/apps/remark42/app/components/profile/components/counter/counter.tsx similarity index 100% rename from frontend/app/components/profile/components/counter/counter.tsx rename to frontend/apps/remark42/app/components/profile/components/counter/counter.tsx diff --git a/frontend/app/components/profile/components/counter/index.ts b/frontend/apps/remark42/app/components/profile/components/counter/index.ts similarity index 100% rename from frontend/app/components/profile/components/counter/index.ts rename to frontend/apps/remark42/app/components/profile/components/counter/index.ts diff --git a/frontend/app/components/profile/index.ts b/frontend/apps/remark42/app/components/profile/index.ts similarity index 100% rename from frontend/app/components/profile/index.ts rename to frontend/apps/remark42/app/components/profile/index.ts diff --git a/frontend/app/components/profile/profile.module.css b/frontend/apps/remark42/app/components/profile/profile.module.css similarity index 100% rename from frontend/app/components/profile/profile.module.css rename to frontend/apps/remark42/app/components/profile/profile.module.css diff --git a/frontend/app/components/profile/profile.spec.tsx b/frontend/apps/remark42/app/components/profile/profile.spec.tsx similarity index 100% rename from frontend/app/components/profile/profile.spec.tsx rename to frontend/apps/remark42/app/components/profile/profile.spec.tsx diff --git a/frontend/app/components/profile/profile.tsx b/frontend/apps/remark42/app/components/profile/profile.tsx similarity index 100% rename from frontend/app/components/profile/profile.tsx rename to frontend/apps/remark42/app/components/profile/profile.tsx diff --git a/frontend/app/components/raw-content/_theme/_dark/raw-content_theme_dark.css b/frontend/apps/remark42/app/components/raw-content/_theme/_dark/raw-content_theme_dark.css similarity index 100% rename from frontend/app/components/raw-content/_theme/_dark/raw-content_theme_dark.css rename to frontend/apps/remark42/app/components/raw-content/_theme/_dark/raw-content_theme_dark.css diff --git a/frontend/app/components/raw-content/_theme/_light/raw-content_theme_light.css b/frontend/apps/remark42/app/components/raw-content/_theme/_light/raw-content_theme_light.css similarity index 100% rename from frontend/app/components/raw-content/_theme/_light/raw-content_theme_light.css rename to frontend/apps/remark42/app/components/raw-content/_theme/_light/raw-content_theme_light.css diff --git a/frontend/app/components/raw-content/code-highlight.css b/frontend/apps/remark42/app/components/raw-content/code-highlight.css similarity index 100% rename from frontend/app/components/raw-content/code-highlight.css rename to frontend/apps/remark42/app/components/raw-content/code-highlight.css diff --git a/frontend/app/components/raw-content/index.ts b/frontend/apps/remark42/app/components/raw-content/index.ts similarity index 100% rename from frontend/app/components/raw-content/index.ts rename to frontend/apps/remark42/app/components/raw-content/index.ts diff --git a/frontend/app/components/raw-content/raw-content.css b/frontend/apps/remark42/app/components/raw-content/raw-content.css similarity index 100% rename from frontend/app/components/raw-content/raw-content.css rename to frontend/apps/remark42/app/components/raw-content/raw-content.css diff --git a/frontend/app/components/root/__copyright/root__copyright.css b/frontend/apps/remark42/app/components/root/__copyright/root__copyright.css similarity index 100% rename from frontend/app/components/root/__copyright/root__copyright.css rename to frontend/apps/remark42/app/components/root/__copyright/root__copyright.css diff --git a/frontend/app/components/root/__input/root__input.css b/frontend/apps/remark42/app/components/root/__input/root__input.css similarity index 100% rename from frontend/app/components/root/__input/root__input.css rename to frontend/apps/remark42/app/components/root/__input/root__input.css diff --git a/frontend/app/components/root/__pinned-comment/root__pinned-comment.css b/frontend/apps/remark42/app/components/root/__pinned-comment/root__pinned-comment.css similarity index 100% rename from frontend/app/components/root/__pinned-comment/root__pinned-comment.css rename to frontend/apps/remark42/app/components/root/__pinned-comment/root__pinned-comment.css diff --git a/frontend/app/components/root/__pinned-comments/root__pinned-comments.css b/frontend/apps/remark42/app/components/root/__pinned-comments/root__pinned-comments.css similarity index 100% rename from frontend/app/components/root/__pinned-comments/root__pinned-comments.css rename to frontend/apps/remark42/app/components/root/__pinned-comments/root__pinned-comments.css diff --git a/frontend/app/components/root/__preloader/root__preloader.css b/frontend/apps/remark42/app/components/root/__preloader/root__preloader.css similarity index 100% rename from frontend/app/components/root/__preloader/root__preloader.css rename to frontend/apps/remark42/app/components/root/__preloader/root__preloader.css diff --git a/frontend/app/components/root/__thread/root__thread.css b/frontend/apps/remark42/app/components/root/__thread/root__thread.css similarity index 100% rename from frontend/app/components/root/__thread/root__thread.css rename to frontend/apps/remark42/app/components/root/__thread/root__thread.css diff --git a/frontend/app/components/root/__threads/root__threads.css b/frontend/apps/remark42/app/components/root/__threads/root__threads.css similarity index 100% rename from frontend/app/components/root/__threads/root__threads.css rename to frontend/apps/remark42/app/components/root/__threads/root__threads.css diff --git a/frontend/app/components/root/_theme/_dark/root_theme_dark.css b/frontend/apps/remark42/app/components/root/_theme/_dark/root_theme_dark.css similarity index 100% rename from frontend/app/components/root/_theme/_dark/root_theme_dark.css rename to frontend/apps/remark42/app/components/root/_theme/_dark/root_theme_dark.css diff --git a/frontend/app/components/root/_theme/_light/root_theme_light.css b/frontend/apps/remark42/app/components/root/_theme/_light/root_theme_light.css similarity index 100% rename from frontend/app/components/root/_theme/_light/root_theme_light.css rename to frontend/apps/remark42/app/components/root/_theme/_light/root_theme_light.css diff --git a/frontend/app/components/root/in-view/in-view.tsx b/frontend/apps/remark42/app/components/root/in-view/in-view.tsx similarity index 100% rename from frontend/app/components/root/in-view/in-view.tsx rename to frontend/apps/remark42/app/components/root/in-view/in-view.tsx diff --git a/frontend/app/components/root/index.ts b/frontend/apps/remark42/app/components/root/index.ts similarity index 100% rename from frontend/app/components/root/index.ts rename to frontend/apps/remark42/app/components/root/index.ts diff --git a/frontend/app/components/root/root.css b/frontend/apps/remark42/app/components/root/root.css similarity index 100% rename from frontend/app/components/root/root.css rename to frontend/apps/remark42/app/components/root/root.css diff --git a/frontend/app/components/root/root.module.css b/frontend/apps/remark42/app/components/root/root.module.css similarity index 100% rename from frontend/app/components/root/root.module.css rename to frontend/apps/remark42/app/components/root/root.module.css diff --git a/frontend/app/components/root/root.tsx b/frontend/apps/remark42/app/components/root/root.tsx similarity index 100% rename from frontend/app/components/root/root.tsx rename to frontend/apps/remark42/app/components/root/root.tsx diff --git a/frontend/app/components/select/index.ts b/frontend/apps/remark42/app/components/select/index.ts similarity index 100% rename from frontend/app/components/select/index.ts rename to frontend/apps/remark42/app/components/select/index.ts diff --git a/frontend/app/components/select/select.module.css b/frontend/apps/remark42/app/components/select/select.module.css similarity index 100% rename from frontend/app/components/select/select.module.css rename to frontend/apps/remark42/app/components/select/select.module.css diff --git a/frontend/app/components/select/select.spec.tsx b/frontend/apps/remark42/app/components/select/select.spec.tsx similarity index 100% rename from frontend/app/components/select/select.spec.tsx rename to frontend/apps/remark42/app/components/select/select.spec.tsx diff --git a/frontend/app/components/select/select.tsx b/frontend/apps/remark42/app/components/select/select.tsx similarity index 100% rename from frontend/app/components/select/select.tsx rename to frontend/apps/remark42/app/components/select/select.tsx diff --git a/frontend/app/components/settings/__action/settings__action.css b/frontend/apps/remark42/app/components/settings/__action/settings__action.css similarity index 100% rename from frontend/app/components/settings/__action/settings__action.css rename to frontend/apps/remark42/app/components/settings/__action/settings__action.css diff --git a/frontend/app/components/settings/__dimmed/settings__dimmed.css b/frontend/apps/remark42/app/components/settings/__dimmed/settings__dimmed.css similarity index 100% rename from frontend/app/components/settings/__dimmed/settings__dimmed.css rename to frontend/apps/remark42/app/components/settings/__dimmed/settings__dimmed.css diff --git a/frontend/app/components/settings/__invisible/settings__invisible.css b/frontend/apps/remark42/app/components/settings/__invisible/settings__invisible.css similarity index 100% rename from frontend/app/components/settings/__invisible/settings__invisible.css rename to frontend/apps/remark42/app/components/settings/__invisible/settings__invisible.css diff --git a/frontend/app/components/settings/__list/settings__list.css b/frontend/apps/remark42/app/components/settings/__list/settings__list.css similarity index 100% rename from frontend/app/components/settings/__list/settings__list.css rename to frontend/apps/remark42/app/components/settings/__list/settings__list.css diff --git a/frontend/app/components/settings/__section/settings__section.css b/frontend/apps/remark42/app/components/settings/__section/settings__section.css similarity index 100% rename from frontend/app/components/settings/__section/settings__section.css rename to frontend/apps/remark42/app/components/settings/__section/settings__section.css diff --git a/frontend/app/components/settings/__user-id/settings__user-id.css b/frontend/apps/remark42/app/components/settings/__user-id/settings__user-id.css similarity index 100% rename from frontend/app/components/settings/__user-id/settings__user-id.css rename to frontend/apps/remark42/app/components/settings/__user-id/settings__user-id.css diff --git a/frontend/app/components/settings/__username/settings__username.css b/frontend/apps/remark42/app/components/settings/__username/settings__username.css similarity index 100% rename from frontend/app/components/settings/__username/settings__username.css rename to frontend/apps/remark42/app/components/settings/__username/settings__username.css diff --git a/frontend/app/components/settings/_theme/_dark/settings_theme_dark.css b/frontend/apps/remark42/app/components/settings/_theme/_dark/settings_theme_dark.css similarity index 100% rename from frontend/app/components/settings/_theme/_dark/settings_theme_dark.css rename to frontend/apps/remark42/app/components/settings/_theme/_dark/settings_theme_dark.css diff --git a/frontend/app/components/settings/_theme/_light/settings_theme_light.css b/frontend/apps/remark42/app/components/settings/_theme/_light/settings_theme_light.css similarity index 100% rename from frontend/app/components/settings/_theme/_light/settings_theme_light.css rename to frontend/apps/remark42/app/components/settings/_theme/_light/settings_theme_light.css diff --git a/frontend/app/components/settings/index.ts b/frontend/apps/remark42/app/components/settings/index.ts similarity index 100% rename from frontend/app/components/settings/index.ts rename to frontend/apps/remark42/app/components/settings/index.ts diff --git a/frontend/app/components/settings/settings.css b/frontend/apps/remark42/app/components/settings/settings.css similarity index 100% rename from frontend/app/components/settings/settings.css rename to frontend/apps/remark42/app/components/settings/settings.css diff --git a/frontend/app/components/settings/settings.tsx b/frontend/apps/remark42/app/components/settings/settings.tsx similarity index 100% rename from frontend/app/components/settings/settings.tsx rename to frontend/apps/remark42/app/components/settings/settings.tsx diff --git a/frontend/app/components/sort-picker.spec.tsx b/frontend/apps/remark42/app/components/sort-picker.spec.tsx similarity index 100% rename from frontend/app/components/sort-picker.spec.tsx rename to frontend/apps/remark42/app/components/sort-picker.spec.tsx diff --git a/frontend/app/components/sort-picker.tsx b/frontend/apps/remark42/app/components/sort-picker.tsx similarity index 100% rename from frontend/app/components/sort-picker.tsx rename to frontend/apps/remark42/app/components/sort-picker.tsx diff --git a/frontend/app/components/spinner/spinner.module.css b/frontend/apps/remark42/app/components/spinner/spinner.module.css similarity index 100% rename from frontend/app/components/spinner/spinner.module.css rename to frontend/apps/remark42/app/components/spinner/spinner.module.css diff --git a/frontend/app/components/spinner/spinner.tsx b/frontend/apps/remark42/app/components/spinner/spinner.tsx similarity index 100% rename from frontend/app/components/spinner/spinner.tsx rename to frontend/apps/remark42/app/components/spinner/spinner.tsx diff --git a/frontend/app/components/textarea-autosize.tsx b/frontend/apps/remark42/app/components/textarea-autosize.tsx similarity index 100% rename from frontend/app/components/textarea-autosize.tsx rename to frontend/apps/remark42/app/components/textarea-autosize.tsx diff --git a/frontend/app/components/thread/__collapse/thread__collapse.css b/frontend/apps/remark42/app/components/thread/__collapse/thread__collapse.css similarity index 100% rename from frontend/app/components/thread/__collapse/thread__collapse.css rename to frontend/apps/remark42/app/components/thread/__collapse/thread__collapse.css diff --git a/frontend/app/components/thread/_theme_dark/thread_theme_dark.css b/frontend/apps/remark42/app/components/thread/_theme_dark/thread_theme_dark.css similarity index 100% rename from frontend/app/components/thread/_theme_dark/thread_theme_dark.css rename to frontend/apps/remark42/app/components/thread/_theme_dark/thread_theme_dark.css diff --git a/frontend/app/components/thread/index.ts b/frontend/apps/remark42/app/components/thread/index.ts similarity index 100% rename from frontend/app/components/thread/index.ts rename to frontend/apps/remark42/app/components/thread/index.ts diff --git a/frontend/app/components/thread/thread.css b/frontend/apps/remark42/app/components/thread/thread.css similarity index 100% rename from frontend/app/components/thread/thread.css rename to frontend/apps/remark42/app/components/thread/thread.css diff --git a/frontend/app/components/thread/thread.tsx b/frontend/apps/remark42/app/components/thread/thread.tsx similarity index 100% rename from frontend/app/components/thread/thread.tsx rename to frontend/apps/remark42/app/components/thread/thread.tsx diff --git a/frontend/app/components/tooltip/index.ts b/frontend/apps/remark42/app/components/tooltip/index.ts similarity index 100% rename from frontend/app/components/tooltip/index.ts rename to frontend/apps/remark42/app/components/tooltip/index.ts diff --git a/frontend/app/components/tooltip/tooltip.module.css b/frontend/apps/remark42/app/components/tooltip/tooltip.module.css similarity index 100% rename from frontend/app/components/tooltip/tooltip.module.css rename to frontend/apps/remark42/app/components/tooltip/tooltip.module.css diff --git a/frontend/app/components/tooltip/tooltip.spec.tsx b/frontend/apps/remark42/app/components/tooltip/tooltip.spec.tsx similarity index 100% rename from frontend/app/components/tooltip/tooltip.spec.tsx rename to frontend/apps/remark42/app/components/tooltip/tooltip.spec.tsx diff --git a/frontend/app/components/tooltip/tooltip.tsx b/frontend/apps/remark42/app/components/tooltip/tooltip.tsx similarity index 100% rename from frontend/app/components/tooltip/tooltip.tsx rename to frontend/apps/remark42/app/components/tooltip/tooltip.tsx diff --git a/frontend/app/counter.ts b/frontend/apps/remark42/app/counter.ts similarity index 100% rename from frontend/app/counter.ts rename to frontend/apps/remark42/app/counter.ts diff --git a/frontend/app/deleteme.ts b/frontend/apps/remark42/app/deleteme.ts similarity index 100% rename from frontend/app/deleteme.ts rename to frontend/apps/remark42/app/deleteme.ts diff --git a/frontend/app/embed.ts b/frontend/apps/remark42/app/embed.ts similarity index 100% rename from frontend/app/embed.ts rename to frontend/apps/remark42/app/embed.ts diff --git a/frontend/app/hooks/useAction.ts b/frontend/apps/remark42/app/hooks/useAction.ts similarity index 100% rename from frontend/app/hooks/useAction.ts rename to frontend/apps/remark42/app/hooks/useAction.ts diff --git a/frontend/app/hooks/useTheme.ts b/frontend/apps/remark42/app/hooks/useTheme.ts similarity index 100% rename from frontend/app/hooks/useTheme.ts rename to frontend/apps/remark42/app/hooks/useTheme.ts diff --git a/frontend/app/last-comments.tsx b/frontend/apps/remark42/app/last-comments.tsx similarity index 100% rename from frontend/app/last-comments.tsx rename to frontend/apps/remark42/app/last-comments.tsx diff --git a/frontend/app/locales/ar.json b/frontend/apps/remark42/app/locales/ar.json similarity index 100% rename from frontend/app/locales/ar.json rename to frontend/apps/remark42/app/locales/ar.json diff --git a/frontend/app/locales/be.json b/frontend/apps/remark42/app/locales/be.json similarity index 100% rename from frontend/app/locales/be.json rename to frontend/apps/remark42/app/locales/be.json diff --git a/frontend/app/locales/bg.json b/frontend/apps/remark42/app/locales/bg.json similarity index 100% rename from frontend/app/locales/bg.json rename to frontend/apps/remark42/app/locales/bg.json diff --git a/frontend/app/locales/bp.json b/frontend/apps/remark42/app/locales/bp.json similarity index 100% rename from frontend/app/locales/bp.json rename to frontend/apps/remark42/app/locales/bp.json diff --git a/frontend/app/locales/de.json b/frontend/apps/remark42/app/locales/de.json similarity index 100% rename from frontend/app/locales/de.json rename to frontend/apps/remark42/app/locales/de.json diff --git a/frontend/app/locales/en.json b/frontend/apps/remark42/app/locales/en.json similarity index 100% rename from frontend/app/locales/en.json rename to frontend/apps/remark42/app/locales/en.json diff --git a/frontend/app/locales/es.json b/frontend/apps/remark42/app/locales/es.json similarity index 100% rename from frontend/app/locales/es.json rename to frontend/apps/remark42/app/locales/es.json diff --git a/frontend/app/locales/fi.json b/frontend/apps/remark42/app/locales/fi.json similarity index 100% rename from frontend/app/locales/fi.json rename to frontend/apps/remark42/app/locales/fi.json diff --git a/frontend/app/locales/fr.json b/frontend/apps/remark42/app/locales/fr.json similarity index 100% rename from frontend/app/locales/fr.json rename to frontend/apps/remark42/app/locales/fr.json diff --git a/frontend/app/locales/it.json b/frontend/apps/remark42/app/locales/it.json similarity index 100% rename from frontend/app/locales/it.json rename to frontend/apps/remark42/app/locales/it.json diff --git a/frontend/app/locales/ja.json b/frontend/apps/remark42/app/locales/ja.json similarity index 100% rename from frontend/app/locales/ja.json rename to frontend/apps/remark42/app/locales/ja.json diff --git a/frontend/app/locales/ko.json b/frontend/apps/remark42/app/locales/ko.json similarity index 100% rename from frontend/app/locales/ko.json rename to frontend/apps/remark42/app/locales/ko.json diff --git a/frontend/app/locales/pl.json b/frontend/apps/remark42/app/locales/pl.json similarity index 100% rename from frontend/app/locales/pl.json rename to frontend/apps/remark42/app/locales/pl.json diff --git a/frontend/app/locales/ru.json b/frontend/apps/remark42/app/locales/ru.json similarity index 100% rename from frontend/app/locales/ru.json rename to frontend/apps/remark42/app/locales/ru.json diff --git a/frontend/app/locales/tr.json b/frontend/apps/remark42/app/locales/tr.json similarity index 100% rename from frontend/app/locales/tr.json rename to frontend/apps/remark42/app/locales/tr.json diff --git a/frontend/app/locales/ua.json b/frontend/apps/remark42/app/locales/ua.json similarity index 100% rename from frontend/app/locales/ua.json rename to frontend/apps/remark42/app/locales/ua.json diff --git a/frontend/app/locales/vi.json b/frontend/apps/remark42/app/locales/vi.json similarity index 100% rename from frontend/app/locales/vi.json rename to frontend/apps/remark42/app/locales/vi.json diff --git a/frontend/app/locales/zh.json b/frontend/apps/remark42/app/locales/zh.json similarity index 100% rename from frontend/app/locales/zh.json rename to frontend/apps/remark42/app/locales/zh.json diff --git a/frontend/app/profile.ts b/frontend/apps/remark42/app/profile.ts similarity index 100% rename from frontend/app/profile.ts rename to frontend/apps/remark42/app/profile.ts diff --git a/frontend/app/remark.tsx b/frontend/apps/remark42/app/remark.tsx similarity index 100% rename from frontend/app/remark.tsx rename to frontend/apps/remark42/app/remark.tsx diff --git a/frontend/app/store/actions.ts b/frontend/apps/remark42/app/store/actions.ts similarity index 100% rename from frontend/app/store/actions.ts rename to frontend/apps/remark42/app/store/actions.ts diff --git a/frontend/app/store/comments/actions.test.ts b/frontend/apps/remark42/app/store/comments/actions.test.ts similarity index 100% rename from frontend/app/store/comments/actions.test.ts rename to frontend/apps/remark42/app/store/comments/actions.test.ts diff --git a/frontend/app/store/comments/actions.ts b/frontend/apps/remark42/app/store/comments/actions.ts similarity index 100% rename from frontend/app/store/comments/actions.ts rename to frontend/apps/remark42/app/store/comments/actions.ts diff --git a/frontend/app/store/comments/getters.ts b/frontend/apps/remark42/app/store/comments/getters.ts similarity index 100% rename from frontend/app/store/comments/getters.ts rename to frontend/apps/remark42/app/store/comments/getters.ts diff --git a/frontend/app/store/comments/reducers.ts b/frontend/apps/remark42/app/store/comments/reducers.ts similarity index 100% rename from frontend/app/store/comments/reducers.ts rename to frontend/apps/remark42/app/store/comments/reducers.ts diff --git a/frontend/app/store/comments/types.ts b/frontend/apps/remark42/app/store/comments/types.ts similarity index 100% rename from frontend/app/store/comments/types.ts rename to frontend/apps/remark42/app/store/comments/types.ts diff --git a/frontend/app/store/comments/utils.test.ts b/frontend/apps/remark42/app/store/comments/utils.test.ts similarity index 100% rename from frontend/app/store/comments/utils.test.ts rename to frontend/apps/remark42/app/store/comments/utils.test.ts diff --git a/frontend/app/store/comments/utils.ts b/frontend/apps/remark42/app/store/comments/utils.ts similarity index 100% rename from frontend/app/store/comments/utils.ts rename to frontend/apps/remark42/app/store/comments/utils.ts diff --git a/frontend/app/store/index.ts b/frontend/apps/remark42/app/store/index.ts similarity index 100% rename from frontend/app/store/index.ts rename to frontend/apps/remark42/app/store/index.ts diff --git a/frontend/app/store/post-info/actions.ts b/frontend/apps/remark42/app/store/post-info/actions.ts similarity index 100% rename from frontend/app/store/post-info/actions.ts rename to frontend/apps/remark42/app/store/post-info/actions.ts diff --git a/frontend/app/store/post-info/reducers.ts b/frontend/apps/remark42/app/store/post-info/reducers.ts similarity index 100% rename from frontend/app/store/post-info/reducers.ts rename to frontend/apps/remark42/app/store/post-info/reducers.ts diff --git a/frontend/app/store/post-info/types.ts b/frontend/apps/remark42/app/store/post-info/types.ts similarity index 100% rename from frontend/app/store/post-info/types.ts rename to frontend/apps/remark42/app/store/post-info/types.ts diff --git a/frontend/app/store/reducers.ts b/frontend/apps/remark42/app/store/reducers.ts similarity index 100% rename from frontend/app/store/reducers.ts rename to frontend/apps/remark42/app/store/reducers.ts diff --git a/frontend/app/store/theme/actions.ts b/frontend/apps/remark42/app/store/theme/actions.ts similarity index 100% rename from frontend/app/store/theme/actions.ts rename to frontend/apps/remark42/app/store/theme/actions.ts diff --git a/frontend/app/store/theme/reducers.ts b/frontend/apps/remark42/app/store/theme/reducers.ts similarity index 100% rename from frontend/app/store/theme/reducers.ts rename to frontend/apps/remark42/app/store/theme/reducers.ts diff --git a/frontend/app/store/theme/types.ts b/frontend/apps/remark42/app/store/theme/types.ts similarity index 100% rename from frontend/app/store/theme/types.ts rename to frontend/apps/remark42/app/store/theme/types.ts diff --git a/frontend/app/store/thread/actions.ts b/frontend/apps/remark42/app/store/thread/actions.ts similarity index 100% rename from frontend/app/store/thread/actions.ts rename to frontend/apps/remark42/app/store/thread/actions.ts diff --git a/frontend/app/store/thread/getters.ts b/frontend/apps/remark42/app/store/thread/getters.ts similarity index 100% rename from frontend/app/store/thread/getters.ts rename to frontend/apps/remark42/app/store/thread/getters.ts diff --git a/frontend/app/store/thread/reducers.test.ts b/frontend/apps/remark42/app/store/thread/reducers.test.ts similarity index 100% rename from frontend/app/store/thread/reducers.test.ts rename to frontend/apps/remark42/app/store/thread/reducers.test.ts diff --git a/frontend/app/store/thread/reducers.ts b/frontend/apps/remark42/app/store/thread/reducers.ts similarity index 100% rename from frontend/app/store/thread/reducers.ts rename to frontend/apps/remark42/app/store/thread/reducers.ts diff --git a/frontend/app/store/thread/types.ts b/frontend/apps/remark42/app/store/thread/types.ts similarity index 100% rename from frontend/app/store/thread/types.ts rename to frontend/apps/remark42/app/store/thread/types.ts diff --git a/frontend/app/store/thread/utils.ts b/frontend/apps/remark42/app/store/thread/utils.ts similarity index 100% rename from frontend/app/store/thread/utils.ts rename to frontend/apps/remark42/app/store/thread/utils.ts diff --git a/frontend/app/store/user/__stubs__/comments-store.json b/frontend/apps/remark42/app/store/user/__stubs__/comments-store.json similarity index 100% rename from frontend/app/store/user/__stubs__/comments-store.json rename to frontend/apps/remark42/app/store/user/__stubs__/comments-store.json diff --git a/frontend/app/store/user/actions.test.ts b/frontend/apps/remark42/app/store/user/actions.test.ts similarity index 100% rename from frontend/app/store/user/actions.test.ts rename to frontend/apps/remark42/app/store/user/actions.test.ts diff --git a/frontend/app/store/user/actions.ts b/frontend/apps/remark42/app/store/user/actions.ts similarity index 100% rename from frontend/app/store/user/actions.ts rename to frontend/apps/remark42/app/store/user/actions.ts diff --git a/frontend/app/store/user/reducers.test.ts b/frontend/apps/remark42/app/store/user/reducers.test.ts similarity index 100% rename from frontend/app/store/user/reducers.test.ts rename to frontend/apps/remark42/app/store/user/reducers.test.ts diff --git a/frontend/app/store/user/reducers.ts b/frontend/apps/remark42/app/store/user/reducers.ts similarity index 100% rename from frontend/app/store/user/reducers.ts rename to frontend/apps/remark42/app/store/user/reducers.ts diff --git a/frontend/app/store/user/types.ts b/frontend/apps/remark42/app/store/user/types.ts similarity index 100% rename from frontend/app/store/user/types.ts rename to frontend/apps/remark42/app/store/user/types.ts diff --git a/frontend/app/styles/custom-properties.css b/frontend/apps/remark42/app/styles/custom-properties.css similarity index 100% rename from frontend/app/styles/custom-properties.css rename to frontend/apps/remark42/app/styles/custom-properties.css diff --git a/frontend/app/styles/global.css b/frontend/apps/remark42/app/styles/global.css similarity index 100% rename from frontend/app/styles/global.css rename to frontend/apps/remark42/app/styles/global.css diff --git a/frontend/app/tests/utils.tsx b/frontend/apps/remark42/app/tests/utils.tsx similarity index 100% rename from frontend/app/tests/utils.tsx rename to frontend/apps/remark42/app/tests/utils.tsx diff --git a/frontend/app/typings/css-modules.d.ts b/frontend/apps/remark42/app/typings/css-modules.d.ts similarity index 100% rename from frontend/app/typings/css-modules.d.ts rename to frontend/apps/remark42/app/typings/css-modules.d.ts diff --git a/frontend/app/typings/enzyme.d.ts b/frontend/apps/remark42/app/typings/enzyme.d.ts similarity index 100% rename from frontend/app/typings/enzyme.d.ts rename to frontend/apps/remark42/app/typings/enzyme.d.ts diff --git a/frontend/app/typings/global.d.ts b/frontend/apps/remark42/app/typings/global.d.ts similarity index 100% rename from frontend/app/typings/global.d.ts rename to frontend/apps/remark42/app/typings/global.d.ts diff --git a/frontend/app/typings/jest-localstorage-mock.d.ts b/frontend/apps/remark42/app/typings/jest-localstorage-mock.d.ts similarity index 100% rename from frontend/app/typings/jest-localstorage-mock.d.ts rename to frontend/apps/remark42/app/typings/jest-localstorage-mock.d.ts diff --git a/frontend/app/typings/preact.d.ts b/frontend/apps/remark42/app/typings/preact.d.ts similarity index 100% rename from frontend/app/typings/preact.d.ts rename to frontend/apps/remark42/app/typings/preact.d.ts diff --git a/frontend/app/typings/svg.d.ts b/frontend/apps/remark42/app/typings/svg.d.ts similarity index 100% rename from frontend/app/typings/svg.d.ts rename to frontend/apps/remark42/app/typings/svg.d.ts diff --git a/frontend/app/utils/actionBinder.ts b/frontend/apps/remark42/app/utils/actionBinder.ts similarity index 100% rename from frontend/app/utils/actionBinder.ts rename to frontend/apps/remark42/app/utils/actionBinder.ts diff --git a/frontend/app/utils/bench.ts b/frontend/apps/remark42/app/utils/bench.ts similarity index 100% rename from frontend/app/utils/bench.ts rename to frontend/apps/remark42/app/utils/bench.ts diff --git a/frontend/app/utils/capitalize-first-letter.spec.ts b/frontend/apps/remark42/app/utils/capitalize-first-letter.spec.ts similarity index 100% rename from frontend/app/utils/capitalize-first-letter.spec.ts rename to frontend/apps/remark42/app/utils/capitalize-first-letter.spec.ts diff --git a/frontend/app/utils/capitalize-first-letter.ts b/frontend/apps/remark42/app/utils/capitalize-first-letter.ts similarity index 100% rename from frontend/app/utils/capitalize-first-letter.ts rename to frontend/apps/remark42/app/utils/capitalize-first-letter.ts diff --git a/frontend/app/utils/cmpRef.ts b/frontend/apps/remark42/app/utils/cmpRef.ts similarity index 100% rename from frontend/app/utils/cmpRef.ts rename to frontend/apps/remark42/app/utils/cmpRef.ts diff --git a/frontend/app/utils/create-iframe.ts b/frontend/apps/remark42/app/utils/create-iframe.ts similarity index 100% rename from frontend/app/utils/create-iframe.ts rename to frontend/apps/remark42/app/utils/create-iframe.ts diff --git a/frontend/app/utils/debounce.ts b/frontend/apps/remark42/app/utils/debounce.ts similarity index 100% rename from frontend/app/utils/debounce.ts rename to frontend/apps/remark42/app/utils/debounce.ts diff --git a/frontend/app/utils/debug-node.ts b/frontend/apps/remark42/app/utils/debug-node.ts similarity index 100% rename from frontend/app/utils/debug-node.ts rename to frontend/apps/remark42/app/utils/debug-node.ts diff --git a/frontend/app/utils/derequire.ts b/frontend/apps/remark42/app/utils/derequire.ts similarity index 100% rename from frontend/app/utils/derequire.ts rename to frontend/apps/remark42/app/utils/derequire.ts diff --git a/frontend/app/utils/email.ts b/frontend/apps/remark42/app/utils/email.ts similarity index 100% rename from frontend/app/utils/email.ts rename to frontend/apps/remark42/app/utils/email.ts diff --git a/frontend/app/utils/errorUtils.ts b/frontend/apps/remark42/app/utils/errorUtils.ts similarity index 100% rename from frontend/app/utils/errorUtils.ts rename to frontend/apps/remark42/app/utils/errorUtils.ts diff --git a/frontend/app/utils/get-hidden-users.test.ts b/frontend/apps/remark42/app/utils/get-hidden-users.test.ts similarity index 100% rename from frontend/app/utils/get-hidden-users.test.ts rename to frontend/apps/remark42/app/utils/get-hidden-users.test.ts diff --git a/frontend/app/utils/get-hidden-users.ts b/frontend/apps/remark42/app/utils/get-hidden-users.ts similarity index 100% rename from frontend/app/utils/get-hidden-users.ts rename to frontend/apps/remark42/app/utils/get-hidden-users.ts diff --git a/frontend/app/utils/getLocale.ts b/frontend/apps/remark42/app/utils/getLocale.ts similarity index 100% rename from frontend/app/utils/getLocale.ts rename to frontend/apps/remark42/app/utils/getLocale.ts diff --git a/frontend/app/utils/is-object.spec.ts b/frontend/apps/remark42/app/utils/is-object.spec.ts similarity index 100% rename from frontend/app/utils/is-object.spec.ts rename to frontend/apps/remark42/app/utils/is-object.spec.ts diff --git a/frontend/app/utils/is-object.ts b/frontend/apps/remark42/app/utils/is-object.ts similarity index 100% rename from frontend/app/utils/is-object.ts rename to frontend/apps/remark42/app/utils/is-object.ts diff --git a/frontend/app/utils/isUserAnonymous.test.ts b/frontend/apps/remark42/app/utils/isUserAnonymous.test.ts similarity index 100% rename from frontend/app/utils/isUserAnonymous.test.ts rename to frontend/apps/remark42/app/utils/isUserAnonymous.test.ts diff --git a/frontend/app/utils/isUserAnonymous.ts b/frontend/apps/remark42/app/utils/isUserAnonymous.ts similarity index 100% rename from frontend/app/utils/isUserAnonymous.ts rename to frontend/apps/remark42/app/utils/isUserAnonymous.ts diff --git a/frontend/app/utils/jwt.test.ts b/frontend/apps/remark42/app/utils/jwt.test.ts similarity index 100% rename from frontend/app/utils/jwt.test.ts rename to frontend/apps/remark42/app/utils/jwt.test.ts diff --git a/frontend/app/utils/jwt.ts b/frontend/apps/remark42/app/utils/jwt.ts similarity index 100% rename from frontend/app/utils/jwt.ts rename to frontend/apps/remark42/app/utils/jwt.ts diff --git a/frontend/app/utils/loadLocale.ts b/frontend/apps/remark42/app/utils/loadLocale.ts similarity index 100% rename from frontend/app/utils/loadLocale.ts rename to frontend/apps/remark42/app/utils/loadLocale.ts diff --git a/frontend/app/utils/parse-query.test.ts b/frontend/apps/remark42/app/utils/parse-query.test.ts similarity index 100% rename from frontend/app/utils/parse-query.test.ts rename to frontend/apps/remark42/app/utils/parse-query.test.ts diff --git a/frontend/app/utils/parse-query.ts b/frontend/apps/remark42/app/utils/parse-query.ts similarity index 100% rename from frontend/app/utils/parse-query.ts rename to frontend/apps/remark42/app/utils/parse-query.ts diff --git a/frontend/app/utils/post-message.ts b/frontend/apps/remark42/app/utils/post-message.ts similarity index 100% rename from frontend/app/utils/post-message.ts rename to frontend/apps/remark42/app/utils/post-message.ts diff --git a/frontend/app/utils/replaceSelection.ts b/frontend/apps/remark42/app/utils/replaceSelection.ts similarity index 100% rename from frontend/app/utils/replaceSelection.ts rename to frontend/apps/remark42/app/utils/replaceSelection.ts diff --git a/frontend/app/utils/set-dom-props.ts b/frontend/apps/remark42/app/utils/set-dom-props.ts similarity index 100% rename from frontend/app/utils/set-dom-props.ts rename to frontend/apps/remark42/app/utils/set-dom-props.ts diff --git a/frontend/app/utils/shallowCompare.ts b/frontend/apps/remark42/app/utils/shallowCompare.ts similarity index 100% rename from frontend/app/utils/shallowCompare.ts rename to frontend/apps/remark42/app/utils/shallowCompare.ts diff --git a/frontend/app/utils/sleep.ts b/frontend/apps/remark42/app/utils/sleep.ts similarity index 100% rename from frontend/app/utils/sleep.ts rename to frontend/apps/remark42/app/utils/sleep.ts diff --git a/frontend/app/utils/ttl-to-time.ts b/frontend/apps/remark42/app/utils/ttl-to-time.ts similarity index 100% rename from frontend/app/utils/ttl-to-time.ts rename to frontend/apps/remark42/app/utils/ttl-to-time.ts diff --git a/frontend/codecov.yml b/frontend/apps/remark42/codecov.yml similarity index 100% rename from frontend/codecov.yml rename to frontend/apps/remark42/codecov.yml diff --git a/frontend/jest.config.ts b/frontend/apps/remark42/jest.config.ts similarity index 100% rename from frontend/jest.config.ts rename to frontend/apps/remark42/jest.config.ts diff --git a/frontend/jest.setup.ts b/frontend/apps/remark42/jest.setup.ts similarity index 100% rename from frontend/jest.setup.ts rename to frontend/apps/remark42/jest.setup.ts diff --git a/frontend/apps/remark42/package.json b/frontend/apps/remark42/package.json new file mode 100644 index 0000000000..d5f029a57a --- /dev/null +++ b/frontend/apps/remark42/package.json @@ -0,0 +1,132 @@ +{ + "name": "remark42", + "version": "0.16.0", + "license": "MIT", + "scripts": { + "start": "cross-env REMARK_API_BASE_URL=https://demo.remark42.com webpack serve --mode development", + "dev": "cross-env REMARK_URL=http://127.0.0.1:8080 webpack serve --mode development", + "build": "webpack --mode production", + "build:analyze": "webpack --mode production --analyze", + "test": "jest", + "coverage": "jest --coverage", + "checks": "cross-env NODE_ENV=production run-s build && run-p type-check translation-check", + "type-check": "tsc", + "translation-check": "run-s translation:extract translation:check", + "lint": "eslint --max-warnings=0 \"**/*.{ts?(x),js}\"", + "lint:fix": "pnpm lint --fix", + "stylelint": "stylelint \"app/**/*.css\" \"templates/**\"", + "stylelint:fix": "pnpm stylelint --fix", + "size": "cross-env NODE_ENV=production npm run build && size-limit", + "prettier": "prettier --write \"./**/*.{js,ts,tsx,css,html}\"", + "translation:extract": "formatjs extract --out-file=./extracted-messages/messages.json \"**/*.{ts,tsx}\" --ignore=\"**/*.d.ts\"", + "translation:generate": "node ./tasks/generateDictionary.js", + "translation:check": "node ./tasks/checkTranslation.js" + }, + "engines": { + "node": ">=16.15 <=17.*", + "npm": ">=8.1.0 <=8.*" + }, + "dependencies": { + "@github/markdown-toolbar-element": "^2.1.1", + "@github/text-expander-element": "^2.2.2", + "@ungap/custom-elements": "^1.1.0", + "bem-react-helper": "^1.2.2", + "clsx": "^1.1.1", + "core-js": "^3.23.3", + "intersection-observer": "^0.12.2", + "lodash-es": "^4.17.21", + "node-emoji": "^1.11.0", + "preact": "10.6.2", + "react": "npm:@preact/compat@^17.1.1", + "react-dom": "npm:@preact/compat@^17.1.1", + "react-intl": "^6.0.4", + "react-redux": "^8.0.2", + "redux": "^4.2.0", + "redux-thunk": "^2.4.1" + }, + "devDependencies": { + "@babel/core": "^7.18.6", + "@babel/plugin-syntax-flow": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@formatjs/cli": "^5.0.2", + "@mavrin/stylelint-declaration-use-css-custom-properties": "^2.0.0", + "@prefresh/babel-plugin": "^0.4.3", + "@prefresh/webpack": "^3.3.4", + "@size-limit/preset-app": "^7.0.8", + "@swc/core": "1.2.205", + "@swc/jest": "^0.2.21", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/preact": "^3.2.2", + "@types/enzyme": "^3.10.12", + "@types/eslint": "^8.4.5", + "@types/jest": "^28.1.4", + "@types/lodash-es": "^4.17.6", + "@types/node": "^18.0.1", + "@types/node-emoji": "^1.8.1", + "@types/react-redux": "^7.1.24", + "@types/redux-mock-store": "^1.0.3", + "@types/testing-library__jest-dom": "^5.14.5", + "@types/webpack-env": "^1.17.0", + "@typescript-eslint/eslint-plugin": "^5.30.3", + "@typescript-eslint/parser": "^5.30.3", + "babel-loader": "^8.2.5", + "babel-plugin-jsx-remove-data-test-id": "^3.0.0", + "clean-webpack-plugin": "^4.0.0", + "codecov": "^3.8.3", + "cross-env": "^7.0.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "dotenv": "^16.0.1", + "enzyme": "^3.11.0", + "enzyme-adapter-preact-pure": "^4.0.1", + "eslint": "^8.18.0", + "eslint-config-preact": "^1.3.0", + "eslint-config-prettier": "^8.5.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-testing-library": "^5.5.1", + "fast-async": "^6.3.8", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^7.2.11", + "html-webpack-plugin": "^5.5.0", + "husky": "^8.0.0", + "identity-obj-proxy": "^3.0.0", + "incstr": "^1.2.3", + "jest": "^28.1.2", + "jest-environment-jsdom": "^28.1.2", + "jest-fetch-mock": "^3.0.3", + "jest-localstorage-mock": "^2.4.21", + "lint-staged": "^13.0.3", + "mini-css-extract-plugin": "^2.6.1", + "npm-run-all": "^4.1.5", + "postcss": "^8.4.14", + "postcss-html": "^1.4.1", + "postcss-loader": "^7.0.0", + "postcss-preset-env": "^7.7.2", + "prettier": "^2.7.1", + "redux-mock-store": "^1.5.4", + "size-limit": "^7.0.8", + "style-loader": "^3.3.1", + "stylelint": "^14.9.1", + "stylelint-config-prettier": "^9.0.3", + "stylelint-config-standard": "^26.0.0", + "stylelint-value-no-unknown-custom-properties": "^4.0.0", + "ts-loader": "^9.3.1", + "ts-node": "^10.8.1", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "typescript": "^4.7.4", + "url-loader": "^4.1.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.9.3" + } +} diff --git a/frontend/remark.image b/frontend/apps/remark42/remark.image similarity index 100% rename from frontend/remark.image rename to frontend/apps/remark42/remark.image diff --git a/frontend/tasks/checkTranslation.js b/frontend/apps/remark42/tasks/checkTranslation.js similarity index 100% rename from frontend/tasks/checkTranslation.js rename to frontend/apps/remark42/tasks/checkTranslation.js diff --git a/frontend/tasks/generateDictionary.js b/frontend/apps/remark42/tasks/generateDictionary.js similarity index 100% rename from frontend/tasks/generateDictionary.js rename to frontend/apps/remark42/tasks/generateDictionary.js diff --git a/frontend/tasks/getLocalePath.js b/frontend/apps/remark42/tasks/getLocalePath.js similarity index 100% rename from frontend/tasks/getLocalePath.js rename to frontend/apps/remark42/tasks/getLocalePath.js diff --git a/frontend/tasks/getSupportedLocales.js b/frontend/apps/remark42/tasks/getSupportedLocales.js similarity index 100% rename from frontend/tasks/getSupportedLocales.js rename to frontend/apps/remark42/tasks/getSupportedLocales.js diff --git a/frontend/tasks/getTranslationKeys.js b/frontend/apps/remark42/tasks/getTranslationKeys.js similarity index 100% rename from frontend/tasks/getTranslationKeys.js rename to frontend/apps/remark42/tasks/getTranslationKeys.js diff --git a/frontend/tasks/localeLoadTemplate.js b/frontend/apps/remark42/tasks/localeLoadTemplate.js similarity index 100% rename from frontend/tasks/localeLoadTemplate.js rename to frontend/apps/remark42/tasks/localeLoadTemplate.js diff --git a/frontend/tasks/supportedLocales.json b/frontend/apps/remark42/tasks/supportedLocales.json similarity index 100% rename from frontend/tasks/supportedLocales.json rename to frontend/apps/remark42/tasks/supportedLocales.json diff --git a/frontend/templates/comments.ejs b/frontend/apps/remark42/templates/comments.ejs similarity index 100% rename from frontend/templates/comments.ejs rename to frontend/apps/remark42/templates/comments.ejs diff --git a/frontend/templates/counter.ejs b/frontend/apps/remark42/templates/counter.ejs similarity index 100% rename from frontend/templates/counter.ejs rename to frontend/apps/remark42/templates/counter.ejs diff --git a/frontend/templates/deleteme.ejs b/frontend/apps/remark42/templates/deleteme.ejs similarity index 100% rename from frontend/templates/deleteme.ejs rename to frontend/apps/remark42/templates/deleteme.ejs diff --git a/frontend/templates/demo.ejs b/frontend/apps/remark42/templates/demo.ejs similarity index 100% rename from frontend/templates/demo.ejs rename to frontend/apps/remark42/templates/demo.ejs diff --git a/frontend/templates/iframe.ejs b/frontend/apps/remark42/templates/iframe.ejs similarity index 100% rename from frontend/templates/iframe.ejs rename to frontend/apps/remark42/templates/iframe.ejs diff --git a/frontend/templates/last-comments.ejs b/frontend/apps/remark42/templates/last-comments.ejs similarity index 100% rename from frontend/templates/last-comments.ejs rename to frontend/apps/remark42/templates/last-comments.ejs diff --git a/frontend/templates/markdown-help.html b/frontend/apps/remark42/templates/markdown-help.html similarity index 100% rename from frontend/templates/markdown-help.html rename to frontend/apps/remark42/templates/markdown-help.html diff --git a/frontend/templates/privacy.html b/frontend/apps/remark42/templates/privacy.html similarity index 100% rename from frontend/templates/privacy.html rename to frontend/apps/remark42/templates/privacy.html diff --git a/frontend/tsconfig.json b/frontend/apps/remark42/tsconfig.json similarity index 100% rename from frontend/tsconfig.json rename to frontend/apps/remark42/tsconfig.json diff --git a/frontend/webpack.config.js b/frontend/apps/remark42/webpack.config.js similarity index 100% rename from frontend/webpack.config.js rename to frontend/apps/remark42/webpack.config.js diff --git a/frontend/package.json b/frontend/package.json index 63d146b05b..6269aab0bf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,131 +1,22 @@ { "name": "remark42", - "version": "0.16.0", "license": "MIT", "scripts": { - "build": "webpack --mode production", - "build:analyze": "webpack --mode production --analyze", - "start": "cross-env REMARK_API_BASE_URL=https://demo.remark42.com webpack serve --mode development", - "dev": "cross-env REMARK_URL=http://127.0.0.1:8080 webpack serve --mode development", - "lint": "run-p lint:*", - "test": "jest", - "test:coverage": "jest --coverage", - "check": "cross-env NODE_ENV=production run-s build && run-p check:*", - "check:types": "tsc -p tsconfig.json --noEmit", - "check:translation": "run-s translation:extract translation:check", - "lint:eslint": "eslint --max-warnings=0 \"**/*.{ts?(x),js}\"", - "lint:stylelint": "stylelint \"app/**/*.css\" \"templates/**\"", - "size": "cross-env NODE_ENV=production npm run build && size-limit", - "prettier": "prettier --write \"./**/*.{js,ts,tsx,css,html}\"", - "translation:extract": "formatjs extract --out-file=./extracted-messages/messages.json \"**/*.{ts,tsx}\" --ignore=\"**/*.d.ts\"", - "translation:generate": "node ./tasks/generateDictionary.js", - "translation:check": "node ./tasks/checkTranslation.js" - }, - "engines": { - "node": ">=16.15 <=17.*", - "npm": ">=8.1.0 <=8.*" - }, - "dependencies": { - "@github/markdown-toolbar-element": "^2.1.1", - "@github/text-expander-element": "^2.2.2", - "@ungap/custom-elements": "^1.1.0", - "bem-react-helper": "^1.2.2", - "clsx": "^1.1.1", - "core-js": "^3.23.3", - "intersection-observer": "^0.12.2", - "lodash-es": "^4.17.21", - "node-emoji": "^1.11.0", - "preact": "10.6.2", - "react": "npm:@preact/compat@^17.1.1", - "react-dom": "npm:@preact/compat@^17.1.1", - "react-intl": "^6.0.4", - "react-redux": "^8.0.2", - "redux": "^4.2.0", - "redux-thunk": "^2.4.1" + "prepare": "if [ -z \"$CI\" ]; then cd .. && husky install frontend/.husky; else echo \"Skip Husky Hooks\"; fi", + "start": "turbo run start", + "dev": "turbo run dev", + "dev:app": "turbo run dev --scope remark42", + "build": "turbo run build", + "test": "turbo run test", + "lint": "turbo run lint", + "stylelint": "turbo run stylelint", + "checks": "turbo run type-check lint stylelint --parallel", + "format": "turbo run format --parallel", + "lint-staged": "turbo run lint-staged" }, "devDependencies": { - "@babel/core": "^7.18.6", - "@babel/plugin-syntax-flow": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@formatjs/cli": "^5.0.2", - "@mavrin/stylelint-declaration-use-css-custom-properties": "^2.0.0", - "@prefresh/babel-plugin": "^0.4.3", - "@prefresh/webpack": "^3.3.4", - "@size-limit/file": "^7.0.8", - "@swc/core": "1.2.205", - "@swc/jest": "^0.2.21", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/preact": "^3.2.2", - "@types/enzyme": "^3.10.12", - "@types/eslint": "^8.4.5", - "@types/jest": "^28.1.4", - "@types/lodash-es": "^4.17.6", - "@types/node": "^18.0.1", - "@types/node-emoji": "^1.8.1", - "@types/react-redux": "^7.1.24", - "@types/redux-mock-store": "^1.0.3", - "@types/testing-library__jest-dom": "^5.14.5", - "@types/webpack-env": "^1.17.0", - "@typescript-eslint/eslint-plugin": "^5.30.3", - "@typescript-eslint/parser": "^5.30.3", - "babel-loader": "^8.2.5", - "babel-plugin-jsx-remove-data-test-id": "^3.0.0", - "clean-webpack-plugin": "^4.0.0", - "codecov": "^3.8.3", - "cross-env": "^7.0.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "dotenv": "^16.0.1", - "enzyme": "^3.11.0", - "enzyme-adapter-preact-pure": "^4.0.1", - "eslint": "^8.18.0", - "eslint-config-preact": "^1.3.0", - "eslint-config-prettier": "^8.5.0", - "eslint-config-react-app": "^7.0.1", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-testing-library": "^5.5.1", - "fast-async": "^6.3.8", - "file-loader": "^6.2.0", - "fork-ts-checker-webpack-plugin": "^7.2.11", - "html-webpack-plugin": "^5.5.0", - "husky": "^8.0.1", - "identity-obj-proxy": "^3.0.0", - "incstr": "^1.2.3", - "jest": "^28.1.2", - "jest-environment-jsdom": "^28.1.2", - "jest-fetch-mock": "^3.0.3", - "jest-localstorage-mock": "^2.4.21", + "husky": "^8.0.0", "lint-staged": "^13.0.3", - "mini-css-extract-plugin": "^2.6.1", - "npm-run-all": "^4.1.5", - "postcss": "^8.4.14", - "postcss-html": "^1.4.1", - "postcss-loader": "^7.0.0", - "postcss-preset-env": "^7.7.2", - "prettier": "^2.7.1", - "redux-mock-store": "^1.5.4", - "size-limit": "^7.0.8", - "style-loader": "^3.3.1", - "stylelint": "^14.9.1", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-standard": "^26.0.0", - "stylelint-value-no-unknown-custom-properties": "^4.0.0", - "ts-loader": "^9.3.1", - "ts-node": "^10.8.1", - "tsconfig-paths-webpack-plugin": "^3.5.2", - "typescript": "^4.7.4", - "url-loader": "^4.1.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.3" + "turbo": "^1.3.1" } } diff --git a/frontend/packages/api/.lintstagedrc.cjs b/frontend/packages/api/.lintstagedrc.cjs new file mode 100644 index 0000000000..572b961b5c --- /dev/null +++ b/frontend/packages/api/.lintstagedrc.cjs @@ -0,0 +1,3 @@ +module.exports = { + "./**/*.ts": ["pnpm type-check", "pnpm format"], +}; diff --git a/frontend/packages/api/dist/index.d.ts b/frontend/packages/api/dist/index.d.ts new file mode 100755 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/frontend/packages/api/dist/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/frontend/packages/api/dist/index.js b/frontend/packages/api/dist/index.js new file mode 100755 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/frontend/packages/api/dist/index.js @@ -0,0 +1 @@ +export {}; diff --git a/frontend/packages/api/jest.config.ts b/frontend/packages/api/jest.config.ts new file mode 100644 index 0000000000..490f826bf6 --- /dev/null +++ b/frontend/packages/api/jest.config.ts @@ -0,0 +1,23 @@ +import type { Config } from "jest"; + +const config: Config = { + testEnvironment: "jsdom", + transform: { + "^.+\\.ts$": [ + "@swc/jest", + { + jsc: { + parser: { + syntax: "typescript", + decorators: false, + }, + target: "es2021", + }, + }, + ], + }, + moduleDirectories: ["node_modules", "src"], + collectCoverageFrom: ["src/**/*.ts"], +}; + +export default config; diff --git a/frontend/packages/api/package.json b/frontend/packages/api/package.json new file mode 100644 index 0000000000..3c3381ec21 --- /dev/null +++ b/frontend/packages/api/package.json @@ -0,0 +1,43 @@ +{ + "name": "api", + "version": "0.1.0", + "description": "Implementation of API methods for Remark42", + "author": "Paul Mineev", + "license": "MIT", + "main": "src/index.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/umputun/remark42.git#master" + }, + "bugs": { + "url": "https://github.com/umputun/remark42/issues" + }, + "homepage": "https://github.com/umputun/remark42/tree/master/frontend/packages/api#readme", + "keywords": [ + "remark42", + "comments" + ], + "scripts": { + "dev": "tsc -w", + "build": "tsc", + "prebuild": "rm -rf dist", + "prepublish": "./prepublish.sh", + "postpublish": "./postpublish.sh", + "test": "jest", + "coverage": "jest --coverage", + "type-check": "tsc --noEmit", + "lint": "echo 'lint'", + "format": "prettier --write '**/*.{ts,js,json}'", + "checks": "pnpm type-check lint" + }, + "devDependencies": { + "@swc/core": "1.2.205", + "@swc/jest": "^0.2.21", + "@types/jest": "^28.1.4", + "@types/node": "^18.0.1", + "eslint": "^8.18.0", + "jest": "^28.1.2", + "prettier": "^2.7.1", + "typescript": "^4.7.4" + } +} diff --git a/frontend/packages/api/src/index.spec.ts b/frontend/packages/api/src/index.spec.ts new file mode 100644 index 0000000000..8b873c5b81 --- /dev/null +++ b/frontend/packages/api/src/index.spec.ts @@ -0,0 +1,7 @@ +import { client } from "index"; + +describe("module", () => { + it("should export client", () => { + expect(client).toBeDefined(); + }); +}); diff --git a/frontend/packages/api/src/index.ts b/frontend/packages/api/src/index.ts new file mode 100644 index 0000000000..e90bf198cb --- /dev/null +++ b/frontend/packages/api/src/index.ts @@ -0,0 +1 @@ +export function client() {} diff --git a/frontend/packages/api/tsconfig.json b/frontend/packages/api/tsconfig.json new file mode 100644 index 0000000000..a7961f7e5a --- /dev/null +++ b/frontend/packages/api/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "ESNext", + "module": "ESNext", + "lib": ["ESNext", "dom"], + "outDir": "./dist", + "strict": true, + "noEmit": false, + "declaration": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "isolatedModules": true, + "baseUrl": "./src", + "paths": { + "@test/*": ["../test/*"] + } + }, + "include": ["**/*.ts"], + "exclude": ["node_modules/*", "dist/*", "coverage/*"] +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 30866a3c64..e6329ff39c 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1,208 +1,239 @@ lockfileVersion: 5.4 -specifiers: - '@babel/core': ^7.18.6 - '@babel/plugin-syntax-flow': ^7.18.6 - '@babel/plugin-transform-react-jsx': ^7.18.6 - '@babel/preset-env': ^7.18.6 - '@babel/preset-react': ^7.18.6 - '@formatjs/cli': ^5.0.2 - '@github/markdown-toolbar-element': ^2.1.1 - '@github/text-expander-element': ^2.2.2 - '@mavrin/stylelint-declaration-use-css-custom-properties': ^2.0.0 - '@prefresh/babel-plugin': ^0.4.3 - '@prefresh/webpack': ^3.3.4 - '@size-limit/file': ^7.0.8 - '@swc/core': 1.2.205 - '@swc/jest': ^0.2.21 - '@testing-library/jest-dom': ^5.16.4 - '@testing-library/preact': ^3.2.2 - '@types/enzyme': ^3.10.12 - '@types/eslint': ^8.4.5 - '@types/jest': ^28.1.4 - '@types/lodash-es': ^4.17.6 - '@types/node': ^18.0.1 - '@types/node-emoji': ^1.8.1 - '@types/react-redux': ^7.1.24 - '@types/redux-mock-store': ^1.0.3 - '@types/testing-library__jest-dom': ^5.14.5 - '@types/webpack-env': ^1.17.0 - '@typescript-eslint/eslint-plugin': ^5.30.3 - '@typescript-eslint/parser': ^5.30.3 - '@ungap/custom-elements': ^1.1.0 - babel-loader: ^8.2.5 - babel-plugin-jsx-remove-data-test-id: ^3.0.0 - bem-react-helper: ^1.2.2 - clean-webpack-plugin: ^4.0.0 - clsx: ^1.1.1 - codecov: ^3.8.3 - core-js: ^3.23.3 - cross-env: ^7.0.3 - css-loader: ^6.7.1 - css-minimizer-webpack-plugin: ^4.0.0 - cssnano: ^5.1.12 - dotenv: ^16.0.1 - enzyme: ^3.11.0 - enzyme-adapter-preact-pure: ^4.0.1 - eslint: ^8.18.0 - eslint-config-preact: ^1.3.0 - eslint-config-prettier: ^8.5.0 - eslint-config-react-app: ^7.0.1 - eslint-plugin-flowtype: ^8.0.3 - eslint-plugin-import: ^2.26.0 - eslint-plugin-jsx-a11y: ^6.6.0 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-react: ^7.30.1 - eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-testing-library: ^5.5.1 - fast-async: ^6.3.8 - file-loader: ^6.2.0 - fork-ts-checker-webpack-plugin: ^7.2.11 - html-webpack-plugin: ^5.5.0 - husky: ^8.0.1 - identity-obj-proxy: ^3.0.0 - incstr: ^1.2.3 - intersection-observer: ^0.12.2 - jest: ^28.1.2 - jest-environment-jsdom: ^28.1.2 - jest-fetch-mock: ^3.0.3 - jest-localstorage-mock: ^2.4.21 - lint-staged: ^13.0.3 - lodash-es: ^4.17.21 - mini-css-extract-plugin: ^2.6.1 - node-emoji: ^1.11.0 - npm-run-all: ^4.1.5 - postcss: ^8.4.14 - postcss-html: ^1.4.1 - postcss-loader: ^7.0.0 - postcss-preset-env: ^7.7.2 - preact: 10.6.2 - prettier: ^2.7.1 - react: npm:@preact/compat@^17.1.1 - react-dom: npm:@preact/compat@^17.1.1 - react-intl: ^6.0.4 - react-redux: ^8.0.2 - redux: ^4.2.0 - redux-mock-store: ^1.5.4 - redux-thunk: ^2.4.1 - size-limit: ^7.0.8 - style-loader: ^3.3.1 - stylelint: ^14.9.1 - stylelint-config-prettier: ^9.0.3 - stylelint-config-standard: ^26.0.0 - stylelint-value-no-unknown-custom-properties: ^4.0.0 - ts-loader: ^9.3.1 - ts-node: ^10.8.1 - tsconfig-paths-webpack-plugin: ^3.5.2 - typescript: ^4.7.4 - url-loader: ^4.1.1 - webpack: ^5.73.0 - webpack-bundle-analyzer: ^4.5.0 - webpack-cli: ^4.10.0 - webpack-dev-server: ^4.9.3 - -dependencies: - '@github/markdown-toolbar-element': 2.1.1 - '@github/text-expander-element': 2.2.2 - '@ungap/custom-elements': 1.1.0 - bem-react-helper: 1.2.2 - clsx: 1.1.1 - core-js: 3.23.3 - intersection-observer: 0.12.2 - lodash-es: 4.17.21 - node-emoji: 1.11.0 - preact: 10.6.2 - react: /@preact/compat/17.1.1_preact@10.6.2 - react-dom: /@preact/compat/17.1.1_preact@10.6.2 - react-intl: 6.0.4_p7eosiy3chzp3uuudv3bugb7ua - react-redux: 8.0.2_25k65sdkbkm2abvdniihdcenlq - redux: 4.2.0 - redux-thunk: 2.4.1_redux@4.2.0 - -devDependencies: - '@babel/core': 7.18.6 - '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.18.6 - '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.6 - '@babel/preset-env': 7.18.6_@babel+core@7.18.6 - '@babel/preset-react': 7.18.6_@babel+core@7.18.6 - '@formatjs/cli': 5.0.2 - '@mavrin/stylelint-declaration-use-css-custom-properties': 2.0.0_stylelint@14.9.1 - '@prefresh/babel-plugin': 0.4.3 - '@prefresh/webpack': 3.3.4_aygq4fhb36ivjwsmiykvhlqsje - '@size-limit/file': 7.0.8_size-limit@7.0.8 - '@swc/core': 1.2.205 - '@swc/jest': 0.2.21_@swc+core@1.2.205 - '@testing-library/jest-dom': 5.16.4 - '@testing-library/preact': 3.2.2_preact@10.6.2 - '@types/enzyme': 3.10.12 - '@types/eslint': 8.4.5 - '@types/jest': 28.1.4 - '@types/lodash-es': 4.17.6 - '@types/node': 18.0.1 - '@types/node-emoji': 1.8.1 - '@types/react-redux': 7.1.24 - '@types/redux-mock-store': 1.0.3 - '@types/testing-library__jest-dom': 5.14.5 - '@types/webpack-env': 1.17.0 - '@typescript-eslint/eslint-plugin': 5.30.3_uhfrv6c56y4b7yuzllo3ym4bou - '@typescript-eslint/parser': 5.30.3_b5e7v2qnwxfo6hmiq56u52mz3e - babel-loader: 8.2.5_fswvdo7jykdwhfxrdcvghfn6pa - babel-plugin-jsx-remove-data-test-id: 3.0.0_@babel+core@7.18.6 - clean-webpack-plugin: 4.0.0_webpack@5.73.0 - codecov: 3.8.3 - cross-env: 7.0.3 - css-loader: 6.7.1_webpack@5.73.0 - css-minimizer-webpack-plugin: 4.0.0_webpack@5.73.0 - cssnano: 5.1.12_postcss@8.4.14 - dotenv: 16.0.1 - enzyme: 3.11.0 - enzyme-adapter-preact-pure: 4.0.1_ya7uhiupouol3lwzvanow3b4ky - eslint: 8.18.0 - eslint-config-preact: 1.3.0_7mj6cl6nctrt27s5myc3ohapqe - eslint-config-prettier: 8.5.0_eslint@8.18.0 - eslint-config-react-app: 7.0.1_o3zumcjzhrxqm4rk4z3wi6c4mq - eslint-plugin-flowtype: 8.0.3_uj23m7lwigzrbwb5oku667qxh4 - eslint-plugin-import: 2.26.0_stpfporf4ezjetv6zdnl75453m - eslint-plugin-jsx-a11y: 6.6.0_eslint@8.18.0 - eslint-plugin-prettier: 4.2.1_xu6ewijrtliw5q5lksq5uixwby - eslint-plugin-react: 7.30.1_eslint@8.18.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.18.0 - eslint-plugin-testing-library: 5.5.1_b5e7v2qnwxfo6hmiq56u52mz3e - fast-async: 6.3.8 - file-loader: 6.2.0_webpack@5.73.0 - fork-ts-checker-webpack-plugin: 7.2.11_3o2jfq6vfqxns3sz6wn2nnc3ei - html-webpack-plugin: 5.5.0_webpack@5.73.0 - husky: 8.0.1 - identity-obj-proxy: 3.0.0 - incstr: 1.2.3 - jest: 28.1.2_hjdndwgjqwbaqblgu6irbm6tqa - jest-environment-jsdom: 28.1.2 - jest-fetch-mock: 3.0.3 - jest-localstorage-mock: 2.4.21 - lint-staged: 13.0.3 - mini-css-extract-plugin: 2.6.1_webpack@5.73.0 - npm-run-all: 4.1.5 - postcss: 8.4.14 - postcss-html: 1.4.1 - postcss-loader: 7.0.0_mepnsno3xmng6eyses4tepu7bu - postcss-preset-env: 7.7.2_postcss@8.4.14 - prettier: 2.7.1 - redux-mock-store: 1.5.4 - size-limit: 7.0.8 - style-loader: 3.3.1_webpack@5.73.0 - stylelint: 14.9.1 - stylelint-config-prettier: 9.0.3_stylelint@14.9.1 - stylelint-config-standard: 26.0.0_stylelint@14.9.1 - stylelint-value-no-unknown-custom-properties: 4.0.0_stylelint@14.9.1 - ts-loader: 9.3.1_3o2jfq6vfqxns3sz6wn2nnc3ei - ts-node: 10.8.1_ul7vg5eqprg7bbfkmwpa5enrra - tsconfig-paths-webpack-plugin: 3.5.2 - typescript: 4.7.4 - url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm - webpack: 5.73.0_323cogk7mrkhphrh6zdbuggp4a - webpack-bundle-analyzer: 4.5.0 - webpack-cli: 4.10.0_orc2ewcajya4tocnqelr4vzh7u - webpack-dev-server: 4.9.3_77l47gmqkrqiei5z7sbwz5iaj4 +importers: + + .: + specifiers: + husky: ^8.0.0 + lint-staged: ^13.0.3 + turbo: ^1.3.1 + devDependencies: + husky: 8.0.1 + lint-staged: 13.0.3 + turbo: 1.3.1 + + apps/remark42: + specifiers: + '@babel/core': ^7.18.6 + '@babel/plugin-syntax-flow': ^7.18.6 + '@babel/plugin-transform-react-jsx': ^7.18.6 + '@babel/preset-env': ^7.18.6 + '@babel/preset-react': ^7.18.6 + '@formatjs/cli': ^5.0.2 + '@github/markdown-toolbar-element': ^2.1.1 + '@github/text-expander-element': ^2.2.2 + '@mavrin/stylelint-declaration-use-css-custom-properties': ^2.0.0 + '@prefresh/babel-plugin': ^0.4.3 + '@prefresh/webpack': ^3.3.4 + '@size-limit/preset-app': ^7.0.8 + '@swc/core': 1.2.205 + '@swc/jest': ^0.2.21 + '@testing-library/jest-dom': ^5.16.4 + '@testing-library/preact': ^3.2.2 + '@types/enzyme': ^3.10.12 + '@types/eslint': ^8.4.5 + '@types/jest': ^28.1.4 + '@types/lodash-es': ^4.17.6 + '@types/node': ^18.0.1 + '@types/node-emoji': ^1.8.1 + '@types/react-redux': ^7.1.24 + '@types/redux-mock-store': ^1.0.3 + '@types/testing-library__jest-dom': ^5.14.5 + '@types/webpack-env': ^1.17.0 + '@typescript-eslint/eslint-plugin': ^5.30.3 + '@typescript-eslint/parser': ^5.30.3 + '@ungap/custom-elements': ^1.1.0 + babel-loader: ^8.2.5 + babel-plugin-jsx-remove-data-test-id: ^3.0.0 + bem-react-helper: ^1.2.2 + clean-webpack-plugin: ^4.0.0 + clsx: ^1.1.1 + codecov: ^3.8.3 + core-js: ^3.23.3 + cross-env: ^7.0.3 + css-loader: ^6.7.1 + css-minimizer-webpack-plugin: ^4.0.0 + cssnano: ^5.1.12 + dotenv: ^16.0.1 + enzyme: ^3.11.0 + enzyme-adapter-preact-pure: ^4.0.1 + eslint: ^8.18.0 + eslint-config-preact: ^1.3.0 + eslint-config-prettier: ^8.5.0 + eslint-config-react-app: ^7.0.1 + eslint-plugin-flowtype: ^8.0.3 + eslint-plugin-import: ^2.26.0 + eslint-plugin-jsx-a11y: ^6.6.0 + eslint-plugin-prettier: ^4.2.1 + eslint-plugin-react: ^7.30.1 + eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-testing-library: ^5.5.1 + fast-async: ^6.3.8 + file-loader: ^6.2.0 + fork-ts-checker-webpack-plugin: ^7.2.11 + html-webpack-plugin: ^5.5.0 + husky: ^8.0.0 + identity-obj-proxy: ^3.0.0 + incstr: ^1.2.3 + intersection-observer: ^0.12.2 + jest: ^28.1.2 + jest-environment-jsdom: ^28.1.2 + jest-fetch-mock: ^3.0.3 + jest-localstorage-mock: ^2.4.21 + lint-staged: ^13.0.3 + lodash-es: ^4.17.21 + mini-css-extract-plugin: ^2.6.1 + node-emoji: ^1.11.0 + npm-run-all: ^4.1.5 + postcss: ^8.4.14 + postcss-html: ^1.4.1 + postcss-loader: ^7.0.0 + postcss-preset-env: ^7.7.2 + preact: 10.6.2 + prettier: ^2.7.1 + react: npm:@preact/compat@^17.1.1 + react-dom: npm:@preact/compat@^17.1.1 + react-intl: ^6.0.4 + react-redux: ^8.0.2 + redux: ^4.2.0 + redux-mock-store: ^1.5.4 + redux-thunk: ^2.4.1 + size-limit: ^7.0.8 + style-loader: ^3.3.1 + stylelint: ^14.9.1 + stylelint-config-prettier: ^9.0.3 + stylelint-config-standard: ^26.0.0 + stylelint-value-no-unknown-custom-properties: ^4.0.0 + ts-loader: ^9.3.1 + ts-node: ^10.8.1 + tsconfig-paths-webpack-plugin: ^3.5.2 + typescript: ^4.7.4 + url-loader: ^4.1.1 + webpack: ^5.73.0 + webpack-bundle-analyzer: ^4.5.0 + webpack-cli: ^4.10.0 + webpack-dev-server: ^4.9.3 + dependencies: + '@github/markdown-toolbar-element': 2.1.1 + '@github/text-expander-element': 2.2.2 + '@ungap/custom-elements': 1.1.0 + bem-react-helper: 1.2.2 + clsx: 1.1.1 + core-js: 3.23.3 + intersection-observer: 0.12.2 + lodash-es: 4.17.21 + node-emoji: 1.11.0 + preact: 10.6.2 + react: /@preact/compat/17.1.1_preact@10.6.2 + react-dom: /@preact/compat/17.1.1_preact@10.6.2 + react-intl: 6.0.4_p7eosiy3chzp3uuudv3bugb7ua + react-redux: 8.0.2_25k65sdkbkm2abvdniihdcenlq + redux: 4.2.0 + redux-thunk: 2.4.1_redux@4.2.0 + devDependencies: + '@babel/core': 7.18.6 + '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.18.6 + '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.6 + '@babel/preset-env': 7.18.6_@babel+core@7.18.6 + '@babel/preset-react': 7.18.6_@babel+core@7.18.6 + '@formatjs/cli': 5.0.2 + '@mavrin/stylelint-declaration-use-css-custom-properties': 2.0.0_stylelint@14.9.1 + '@prefresh/babel-plugin': 0.4.3 + '@prefresh/webpack': 3.3.4_aygq4fhb36ivjwsmiykvhlqsje + '@size-limit/preset-app': 7.0.8_size-limit@7.0.8 + '@swc/core': 1.2.205 + '@swc/jest': 0.2.21_@swc+core@1.2.205 + '@testing-library/jest-dom': 5.16.4 + '@testing-library/preact': 3.2.2_preact@10.6.2 + '@types/enzyme': 3.10.12 + '@types/eslint': 8.4.5 + '@types/jest': 28.1.4 + '@types/lodash-es': 4.17.6 + '@types/node': 18.0.1 + '@types/node-emoji': 1.8.1 + '@types/react-redux': 7.1.24 + '@types/redux-mock-store': 1.0.3 + '@types/testing-library__jest-dom': 5.14.5 + '@types/webpack-env': 1.17.0 + '@typescript-eslint/eslint-plugin': 5.30.3_uhfrv6c56y4b7yuzllo3ym4bou + '@typescript-eslint/parser': 5.30.3_b5e7v2qnwxfo6hmiq56u52mz3e + babel-loader: 8.2.5_fswvdo7jykdwhfxrdcvghfn6pa + babel-plugin-jsx-remove-data-test-id: 3.0.0_@babel+core@7.18.6 + clean-webpack-plugin: 4.0.0_webpack@5.73.0 + codecov: 3.8.3 + cross-env: 7.0.3 + css-loader: 6.7.1_webpack@5.73.0 + css-minimizer-webpack-plugin: 4.0.0_webpack@5.73.0 + cssnano: 5.1.12_postcss@8.4.14 + dotenv: 16.0.1 + enzyme: 3.11.0 + enzyme-adapter-preact-pure: 4.0.1_ya7uhiupouol3lwzvanow3b4ky + eslint: 8.18.0 + eslint-config-preact: 1.3.0_7mj6cl6nctrt27s5myc3ohapqe + eslint-config-prettier: 8.5.0_eslint@8.18.0 + eslint-config-react-app: 7.0.1_o3zumcjzhrxqm4rk4z3wi6c4mq + eslint-plugin-flowtype: 8.0.3_uj23m7lwigzrbwb5oku667qxh4 + eslint-plugin-import: 2.26.0_stpfporf4ezjetv6zdnl75453m + eslint-plugin-jsx-a11y: 6.6.0_eslint@8.18.0 + eslint-plugin-prettier: 4.2.1_xu6ewijrtliw5q5lksq5uixwby + eslint-plugin-react: 7.30.1_eslint@8.18.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.18.0 + eslint-plugin-testing-library: 5.5.1_b5e7v2qnwxfo6hmiq56u52mz3e + fast-async: 6.3.8 + file-loader: 6.2.0_webpack@5.73.0 + fork-ts-checker-webpack-plugin: 7.2.11_3o2jfq6vfqxns3sz6wn2nnc3ei + html-webpack-plugin: 5.5.0_webpack@5.73.0 + husky: 8.0.1 + identity-obj-proxy: 3.0.0 + incstr: 1.2.3 + jest: 28.1.2_hjdndwgjqwbaqblgu6irbm6tqa + jest-environment-jsdom: 28.1.2 + jest-fetch-mock: 3.0.3 + jest-localstorage-mock: 2.4.21 + lint-staged: 13.0.3 + mini-css-extract-plugin: 2.6.1_webpack@5.73.0 + npm-run-all: 4.1.5 + postcss: 8.4.14 + postcss-html: 1.4.1 + postcss-loader: 7.0.0_mepnsno3xmng6eyses4tepu7bu + postcss-preset-env: 7.7.2_postcss@8.4.14 + prettier: 2.7.1 + redux-mock-store: 1.5.4 + size-limit: 7.0.8 + style-loader: 3.3.1_webpack@5.73.0 + stylelint: 14.9.1 + stylelint-config-prettier: 9.0.3_stylelint@14.9.1 + stylelint-config-standard: 26.0.0_stylelint@14.9.1 + stylelint-value-no-unknown-custom-properties: 4.0.0_stylelint@14.9.1 + ts-loader: 9.3.1_3o2jfq6vfqxns3sz6wn2nnc3ei + ts-node: 10.8.1_ul7vg5eqprg7bbfkmwpa5enrra + tsconfig-paths-webpack-plugin: 3.5.2 + typescript: 4.7.4 + url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm + webpack: 5.73.0_323cogk7mrkhphrh6zdbuggp4a + webpack-bundle-analyzer: 4.5.0 + webpack-cli: 4.10.0_orc2ewcajya4tocnqelr4vzh7u + webpack-dev-server: 4.9.3_77l47gmqkrqiei5z7sbwz5iaj4 + + packages/api: + specifiers: + '@swc/core': 1.2.205 + '@swc/jest': ^0.2.21 + '@types/jest': ^28.1.4 + '@types/node': ^18.0.1 + eslint: ^8.18.0 + jest: ^28.1.2 + prettier: ^2.7.1 + typescript: ^4.7.4 + devDependencies: + '@swc/core': 1.2.205 + '@swc/jest': 0.2.21_@swc+core@1.2.205 + '@types/jest': 28.1.4 + '@types/node': 18.0.1 + eslint: 8.18.0 + jest: 28.1.2_@types+node@18.0.1 + prettier: 2.7.1 + typescript: 4.7.4 packages: @@ -1864,6 +1895,49 @@ packages: slash: 3.0.0 dev: true + /@jest/core/28.1.2: + resolution: {integrity: sha512-Xo4E+Sb/nZODMGOPt2G3cMmCBqL4/W2Ijwr7/mrXlq4jdJwcFQ/9KrrJZT2adQRk2otVBXXOz1GRQ4Z5iOgvRQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 28.1.1 + '@jest/reporters': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + '@types/node': 18.0.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.3.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 28.0.2 + jest-config: 28.1.2_@types+node@18.0.1 + jest-haste-map: 28.1.1 + jest-message-util: 28.1.1 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-resolve-dependencies: 28.1.2 + jest-runner: 28.1.2 + jest-runtime: 28.1.2 + jest-snapshot: 28.1.2 + jest-util: 28.1.1 + jest-validate: 28.1.1 + jest-watcher: 28.1.1 + micromatch: 4.0.5 + pretty-format: 28.1.1 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /@jest/core/28.1.2_ts-node@10.8.1: resolution: {integrity: sha512-Xo4E+Sb/nZODMGOPt2G3cMmCBqL4/W2Ijwr7/mrXlq4jdJwcFQ/9KrrJZT2adQRk2otVBXXOz1GRQ4Z5iOgvRQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2240,6 +2314,15 @@ packages: '@sinonjs/commons': 1.8.3 dev: true + /@sitespeed.io/tracium/0.3.3: + resolution: {integrity: sha512-dNZafjM93Y+F+sfwTO5gTpsGXlnc/0Q+c2+62ViqP3gkMWvHEMSKkaEHgVJLcLg3i/g19GSIPziiKpgyne07Bw==} + engines: {node: '>=8'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /@size-limit/file/7.0.8_size-limit@7.0.8: resolution: {integrity: sha512-1KeFQuMXIXAH/iELqIX7x+YNYDFvzIvmxcp9PrdwEoSNL0dXdaDIo9WE/yz8xvOmUcKaLfqbWkL75DM0k91WHQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -2250,6 +2333,37 @@ packages: size-limit: 7.0.8 dev: true + /@size-limit/preset-app/7.0.8_size-limit@7.0.8: + resolution: {integrity: sha512-s1mgOXODeFCD1RCnx0ynyCbyQGrhFg4gIzVRSzVDUIVxIQWKstX/OiAXtudEYYF4XJWX6+jgGTwNwrgBZmGqMQ==} + peerDependencies: + size-limit: 7.0.8 + dependencies: + '@size-limit/file': 7.0.8_size-limit@7.0.8 + '@size-limit/time': 7.0.8_size-limit@7.0.8 + size-limit: 7.0.8 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@size-limit/time/7.0.8_size-limit@7.0.8: + resolution: {integrity: sha512-CS3pHTxeQXgrrMbhlqYfSR+b4QGp1rjEcYYkByIP+X/Go88R44yp19tyBFmmCQzs2Te2BAxfq3jv8FG+54oBew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + peerDependencies: + size-limit: 7.0.8 + dependencies: + estimo: 2.3.6 + react: 17.0.2 + size-limit: 7.0.8 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /@swc/core-android-arm-eabi/1.2.205: resolution: {integrity: sha512-HfiuVA1JDHMSRQ8nE1DcemUgZ1PKaPwit4i7q3xin0NVbVHY1xkJyQFuLVh3VxTvGKKkF3hi8GJMVQgOXWL6kg==} engines: {node: '>=10'} @@ -2543,7 +2657,7 @@ packages: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.4.5 - '@types/estree': 0.0.51 + '@types/estree': 0.0.52 dev: true /@types/eslint/8.4.5: @@ -2795,6 +2909,14 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 18.0.1 + dev: true + optional: true + /@typescript-eslint/eslint-plugin/5.30.3_uhfrv6c56y4b7yuzllo3ym4bou: resolution: {integrity: sha512-QEgE1uahnDbWEkZlidq7uKB630ny1NN8KbLPmznX+8hYsYpoV1/quG1Nzvs141FVuumuS7O0EpqYw3RB4AVzRg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3663,6 +3785,10 @@ packages: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} dev: true + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + /batch/0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} dev: true @@ -3680,6 +3806,14 @@ packages: engines: {node: '>=8'} dev: true + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /body-parser/1.20.0: resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3748,10 +3882,21 @@ packages: node-int64: 0.4.0 dev: true + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /bytes-iec/3.1.1: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} @@ -3887,6 +4032,10 @@ packages: fsevents: 2.3.2 dev: true + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + /chrome-trace-event/1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -4577,6 +4726,10 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true + /devtools-protocol/0.0.981744: + resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} + dev: true + /diff-sequences/28.1.1: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -4741,6 +4894,12 @@ packages: engines: {node: '>= 0.8'} dev: true + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + /enhanced-resolve/5.10.0: resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} engines: {node: '>=10.13.0'} @@ -5171,7 +5330,7 @@ packages: peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.30.0_b5e7v2qnwxfo6hmiq56u52mz3e + '@typescript-eslint/utils': 5.30.3_b5e7v2qnwxfo6hmiq56u52mz3e eslint: 8.18.0 transitivePeerDependencies: - supports-color @@ -5287,6 +5446,23 @@ packages: estraverse: 5.3.0 dev: true + /estimo/2.3.6: + resolution: {integrity: sha512-aPd3VTQAL1TyDyhFfn6fqBTJ9WvbRZVN4Z29Buk6+P6xsI0DuF5Mh3dGv6kYCUxWnZkB4Jt3aYglUxOtuwtxoA==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@sitespeed.io/tracium': 0.3.3 + commander: 9.3.0 + find-chrome-bin: 0.1.0 + nanoid: 3.3.4 + puppeteer-core: 13.7.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} @@ -5408,6 +5584,20 @@ packages: - supports-color dev: true + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + /fast-async/6.3.8: resolution: {integrity: sha512-TjlooyqrYm/gOXjD2UHNwfrWkvTbzU105Nk4bvcRTeRoL+wIeK6rqbqDg3CN9z5p37cE2iXhP6SxQFz8OVIaUg==} dependencies: @@ -5471,6 +5661,12 @@ packages: bser: 2.1.1 dev: true + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5520,6 +5716,11 @@ packages: pkg-dir: 4.2.0 dev: true + /find-chrome-bin/0.1.0: + resolution: {integrity: sha512-XoFZwaEn1R3pE6zNG8kH64l2e093hgB9+78eEKPmJK0o1EXEou+25cEWdtu2qq4DBQPDSe90VJAWVI2Sz9pX6Q==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /find-up/2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -5614,6 +5815,10 @@ packages: engines: {node: '>= 0.6'} dev: true + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + /fs-extra/10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -5689,6 +5894,13 @@ packages: engines: {node: '>=10'} dev: true + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6098,6 +6310,10 @@ packages: harmony-reflect: 1.6.2 dev: true + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore-walk/3.0.4: resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} dependencies: @@ -6493,6 +6709,34 @@ packages: - supports-color dev: true + /jest-cli/28.1.2_@types+node@18.0.1: + resolution: {integrity: sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/types': 28.1.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 28.1.2_@types+node@18.0.1 + jest-util: 28.1.1 + jest-validate: 28.1.1 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-cli/28.1.2_hjdndwgjqwbaqblgu6irbm6tqa: resolution: {integrity: sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6521,6 +6765,45 @@ packages: - ts-node dev: true + /jest-config/28.1.2_@types+node@18.0.1: + resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@jest/test-sequencer': 28.1.1 + '@jest/types': 28.1.1 + '@types/node': 18.0.1 + babel-jest: 28.1.2_@babel+core@7.18.6 + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 28.1.2 + jest-environment-node: 28.1.2 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-runner: 28.1.2 + jest-util: 28.1.1 + jest-validate: 28.1.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-config/28.1.2_hjdndwgjqwbaqblgu6irbm6tqa: resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6887,6 +7170,26 @@ packages: supports-color: 8.1.1 dev: true + /jest/28.1.2_@types+node@18.0.1: + resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.2 + '@jest/types': 28.1.1 + import-local: 3.1.0 + jest-cli: 28.1.2_@types+node@18.0.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest/28.1.2_hjdndwgjqwbaqblgu6irbm6tqa: resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -7419,6 +7722,10 @@ packages: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + /mkdirp/1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -7951,6 +8258,10 @@ packages: engines: {node: '>=8'} dev: true + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + /performance-now/2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true @@ -8777,6 +9088,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /promise-polyfill/8.2.3: resolution: {integrity: sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==} dev: true @@ -8805,10 +9121,21 @@ packages: ipaddr.js: 1.9.1 dev: true + /proxy-from-env/1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + /psl/1.8.0: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: true + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /punycode/1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true @@ -8818,6 +9145,29 @@ packages: engines: {node: '>=6'} dev: true + /puppeteer-core/13.7.0: + resolution: {integrity: sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==} + engines: {node: '>=10.18.1'} + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4 + devtools-protocol: 0.0.981744 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + /qs/6.10.3: resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} engines: {node: '>=0.6'} @@ -8938,6 +9288,14 @@ packages: use-sync-external-store: 1.2.0_@preact+compat@17.1.1 dev: false + /react/17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -9923,6 +10281,26 @@ packages: engines: {node: '>=6'} dev: true + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + /teeny-request/7.1.1: resolution: {integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==} engines: {node: '>=10'} @@ -10138,6 +10516,139 @@ packages: typescript: 4.7.4 dev: true + /turbo-android-arm64/1.3.1: + resolution: {integrity: sha512-JcnZh9tLbZDpKaXaao/s/k4qXt3TbNEc1xEYYXurVWnqiMueGeS7QAtThVB85ZSqzj7djk+ngSrZabPy5RG25Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-64/1.3.1: + resolution: {integrity: sha512-TIGDradVFoGck86VIuM38KaDeNxdKaP2ti93UpQeFw26ZhPIeTAa6wUgnz4DQP6bjIvQmXlYJ16ETZb4tFYygg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-arm64/1.3.1: + resolution: {integrity: sha512-aLBq8KiMMmop7uKBkvDt/y+eER2UzxZyUzh1KWcZ7DZB5tFZnknEUyf2qggY2vd2WcDVfQ1EUjZ0MFxhhVaVzA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-freebsd-64/1.3.1: + resolution: {integrity: sha512-BOr/ifmxjlBeuDkDQLUJtzqzXQ2zPHHcI14U9Ys+z4Mza1uzQn/oSJqQvU5RuyRBVai7noMrpPS7QuKtDz0Cyg==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /turbo-freebsd-arm64/1.3.1: + resolution: {integrity: sha512-bHPZjK4xnGLz6/oxl5XmWhdYOdtBMSadrGhptWSZ0wBGNn/gQzDTeZAkQeqhh25AD0eM1hzDe8QUz8GlS43lrA==} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-32/1.3.1: + resolution: {integrity: sha512-c5okimusfvivu9wS8MKSr+rXpQAV+M4TyR9JX+spIK8B1I7AjfECAqiK2D5WFWO1bQ33bUAuxXOEpUuLpgEm+g==} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-64/1.3.1: + resolution: {integrity: sha512-O0pNX+N5gbmRcyZT+jsCPUNCN3DpIZHqNN35j7MT5nr0IkZa83CGbZnrEc+7Qws//jFJ26EngqD/JyRB2E8nwQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm/1.3.1: + resolution: {integrity: sha512-f+r6JIwv/7ylxxJtgVi8cVw+6oNoD/r1IMTU6ejH8bfyMZZko4kkNwH9VYribQ44KDkJEgzdltnzFG5f6Hz10g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm64/1.3.1: + resolution: {integrity: sha512-D6+1MeS/x+/VCCooHPU4NIpB8qI/eW70eMRA79bqTPaxxluP0g2CaxXgucco05P51YtNsSxeVcH7X76iadON6Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-mips64le/1.3.1: + resolution: {integrity: sha512-yL64jgwVCziOpBcdpMxIsczkgwwOvmaqKObFKWyCNlk/LOl5NKODLwXEaryLaALtpwUAoS4ltMSI64gKqmLrOA==} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-ppc64le/1.3.1: + resolution: {integrity: sha512-tjnM+8RosykS1lBpOPLDXGOz/Po2h796ty17uBd7IFslWPOI16a/akFOFoLH8PCiGGJMe3CYgRhEKn4sPWNxFA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-32/1.3.1: + resolution: {integrity: sha512-Snnv+TVigulqwK6guHKndMlrLw88NXj8BtHRGrEksPR0QkyuHlwLf+tHYB4HmvpUl4W9lnXQf4hsljWP64BEdw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-64/1.3.1: + resolution: {integrity: sha512-gLeohHG07yIhON1Pp0YNE00i/yzip2GFhkA6HdJaK95uE5bKULpqxuO414hOS/WzGwrGVXBKCImfe24XXh5T+Q==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64/1.3.1: + resolution: {integrity: sha512-0MWcHLvYgs/qdcoTFZ55nu8HhrpeiwXEMw9cbNfgqTlzy3OsrAsovYEJFyQ8KSxeploiD+QJlCdvhxx+5C0tlA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo/1.3.1: + resolution: {integrity: sha512-DXckoGKlZgvTn/PrHpBI/57aeXR7tfyPf2dK+4LmBczt24ELA3o6eYHeA7KzfpSYhB2LE9qveYFQ6mJ1OzGjjg==} + hasBin: true + requiresBuild: true + optionalDependencies: + turbo-android-arm64: 1.3.1 + turbo-darwin-64: 1.3.1 + turbo-darwin-arm64: 1.3.1 + turbo-freebsd-64: 1.3.1 + turbo-freebsd-arm64: 1.3.1 + turbo-linux-32: 1.3.1 + turbo-linux-64: 1.3.1 + turbo-linux-arm: 1.3.1 + turbo-linux-arm64: 1.3.1 + turbo-linux-mips64le: 1.3.1 + turbo-linux-ppc64le: 1.3.1 + turbo-windows-32: 1.3.1 + turbo-windows-64: 1.3.1 + turbo-windows-arm64: 1.3.1 + dev: true + /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -10204,6 +10715,13 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unbzip2-stream/1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + /unicode-canonical-property-names-ecmascript/2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -10678,6 +11196,19 @@ packages: optional: true dev: true + /ws/8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.8.0: resolution: {integrity: sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==} engines: {node: '>=10.0.0'} @@ -10742,6 +11273,13 @@ packages: yargs-parser: 21.0.1 dev: true + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/frontend/pnpm-workspace.yaml b/frontend/pnpm-workspace.yaml new file mode 100644 index 0000000000..0e5a0737c3 --- /dev/null +++ b/frontend/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "packages/*" + - "apps/*" diff --git a/frontend/turbo.json b/frontend/turbo.json new file mode 100644 index 0000000000..ab7985d5ad --- /dev/null +++ b/frontend/turbo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://turborepo.org/schema.json", + "baseBranch": "origin/master", + "pipeline": { + "start": {}, + "dev": {}, + "build": { + "outputs": ["public/**"] + }, + "test": { + "inputs": ["**/*.tsx", "**/*.ts"] + }, + "lint": { + "inputs": ["**/*.tsx", "**/*.ts"] + }, + "stylelint": { + "inputs": ["**/*.css"] + }, + "type-check": { + "inputs": ["**/*.tsx", "**/*.ts"] + }, + "format": {}, + "lint-staged": {} + } +} diff --git a/site/src/docs/contributing/development/frontend/index.md b/site/src/docs/contributing/development/frontend/index.md index 777565b553..bc520fb25c 100644 --- a/site/src/docs/contributing/development/frontend/index.md +++ b/site/src/docs/contributing/development/frontend/index.md @@ -4,35 +4,41 @@ title: Frontend Development Guidelines ### Frontend development -#### Development tools installation +#### Installation You must have at least 2GB RAM or swap enabled for building. -- install [Node.js 16.15](https://nodejs.org/en/) or higher (we recommend using [NVM](https://github.com/nvm-sh/nvm) for node version autoswitch) -- install [NPM 8.1](https://www.npmjs.com/package/npm) -- run `npm install` inside `./frontend` +- install [Node.js 16](https://nodejs.org/en/) or higher (we recommend using [NVM](https://github.com/nvm-sh/nvm) for node version autoswitch) +- install [PNPM 7](https://pnpm.io/installation) +- run `pnpm i` inside `./frontend` -Running `npm install` will set up pre-commit hooks into your git repository. They are used to reformat your frontend code using `prettier` and lint with `eslint` and `stylelint` before every commit. +Running `pnpm i` will set up pre-commit hooks into your git repository. They are used to reformat your frontend code using `prettier` and lint with `eslint` and `stylelint` before every commit. -**Important**: use `127.0.0.1` and not `localhost` to access the server, as otherwise, CORS will prevent your browser from authentication to work correctly. +::: note 🚨 +use `127.0.0.1` and not `localhost` to access the server, as otherwise, CORS will prevent your browser from authentication to work correctly. +::: -#### Development against demo.remark42.com +#### Development + +##### Run frontend locally against demo.remark42.com This variant of running Remark42 frontend code is preferred when you make a translation or visual adjustments that are easy to see without extensive testing. -For local development mode with Hot Reloading, use `npm start`. In this case, `webpack` will serve files using `webpack-dev-server` on `127.0.0.1:9000`. By visiting , you will get a page with the main comments' widget communicating with a demo server backend running on `https://demo.remark42.com`. But you will not be able to log in with any OAuth providers due to security reasons. +For local development mode with Hot Reloading, use `pnpm start:app`. In this case, `webpack` will serve files using `webpack-dev-server` on `127.0.0.1:9000`. By visiting , you will get a page with the main comments' widget communicating with a demo server backend running on `https://demo.remark42.com`. But you will not be able to log in with any OAuth providers due to security reasons. You can attach the frontend to the locally running backend by providing the `REMARK_URL` environment variable. ```shell -npx cross-env REMARK_URL=http://127.0.0.1:8080 npm start +npx cross-env REMARK_URL=http://127.0.0.1:8080 pnpm dev:app ``` -**Note:** If you want to redefine env variables such as `PORT` on your local instance, you can add the `.env` file to the `./frontend` folder and rewrite variables as you wish. For such functional, we use `dotenv`. +::: note ℹī¸ +If you want to redefine env variables such as `PORT` on your local instance, you can add the `.env` file to the `./frontend` folder and rewrite variables as you wish. For such functional, we use `dotenv`. +::: -#### Development against the local backend +##### Run whole local environment -This variant of running Remark42 frontend code is preferred when you need extensive testing of your code changes, as you'll have your backend and configure it as you want, for example, enable any auth and notifications method you need to test. You can use that set up to develop and test both frontend and backend. +This option of running Remark42 frontend code is preferred when you need extensive testing of your code changes, as you'll have your backend and configure it as you want, for example, enable any auth and notifications method you need to test. You can use that set up to develop and test both frontend and backend. To bring the backend up, run: @@ -48,35 +54,39 @@ Then in the new terminal tab or window, run the following to start the frontend ```shell cd frontend -npm run dev +pnpm dev:app ``` Developer build running by `webpack-dev-server` supports devtools for [React](https://reactjs.org/blog/2019/08/15/new-react-devtools.html#how-do-i-get-the-new-devtools) and [Redux](https://github.com/reduxjs/redux-devtools). It starts Remark42 backend on `127.0.0.1:8080` and adds local OAuth2 provider "Dev". To access the frontend running by Node, go to . By default, you would be logged in as `dev_user`, defined as admin. You can tweak any of the [supported parameters](https://remark42.com/docs/configuration/parameters/) in corresponded yml file. -Frontend Docker Compose config (`compose-dev-frontend.yml`) by default skips running backend related tests and sets `NODE_ENV=development` for frontend build. +##### Manual testing after changes + +Frontend Docker Compose config (`compose-dev-frontend.yml`) by default skips running backend related tests. -**Important**: Before submitting your changes as a Pull Request, run the backend using the `docker-compose -f compose-dev-frontend.yml build --build-arg SKIP_FRONTEND_BUILD=""; docker-compose -f compose-private.yml up` command and test your changes against , frontend, built statically (unlike frontend on port 9000, which runs dynamically). That is how Remark42 authors will test your changes once you submit them. +::: note 🚨 +Before submitting your changes as a Pull Request, run the backend using the `docker-compose -f compose-dev-frontend.yml build --build-arg SKIP_FRONTEND_BUILD=""; docker-compose -f compose-private.yml up` command and test your changes against , frontend, built statically (unlike frontend on port 9000, which runs dynamically). That is how Remark42 authors will test your changes once you submit them. +::: #### Static build -Remark42 frontend can be built statically, and that's how the production version works: frontend is built and then resulting files embedded into the backend, which serves them as-is. Node is not running when a user starts remark42, only the backend written in Go programming language, which also serves pre-built frontend HTML and JS and CSS files. +Remark42 frontend can be built statically, and that's how the production version works: frontend is built and then resulting files embedded into the backend, which serves them as-is. Node is not running when a user starts Remark42, only the backend written in Go programming language, which also serves pre-built frontend HTML and JS and CSS files. -Run `npm run build` inside `./frontend`, and result files will be saved in `./frontend/public`. +Run `pnpm build` inside `./frontend`, and result files will be saved in `./frontend/apps/remark42/public`. ### Code Style - The project uses TypeScript to analyze code statically -- The project uses `eslint` and `stylelint` to check the frontend code. You can manually run via `npm run lint` -- Git Hooks (via husky) installed automatically on `npm install`. They check and try to fix code style if possible, otherwise commit will be rejected -- If you want IDE integration, you need `eslint` and `stylelint` plugin to be installed +- The project uses Eslint and Stylelint to check the frontend code. You can manually run via `pnpm lint` +- Git Hooks (via husky) installed automatically on `pnpm i`. They check and try to fix code style if possible, otherwise commit will be rejected +- If you want IDE integration, you need Eslint and Stylelint plugins to be installed. Also, you have configure Eslint for work in subdirectory. For example you have to add configuration for VSCode like that `"eslint.workingDirectories": ["frontend/apps/remark42"]` ### CSS Styles - Now we are migrating to CSS Modules, which is a recommended way of stylization. A file with styles should be named like `component.module.css` - Old component styles use BEM notation (at least it should): `block__element_modifier`. Also, there are `mix` classes: `block_modifier` -- The new way to name CSS selectors is camel-case like `blockElemenModifier` and use `classnames` to combine it +- The new way to name CSS selectors is camel-case like `blockElemenModifier` and use `clsx` to combine it - Component base style resides in the component's root directory with a name of component converted to kebab-case. For example, `ListComments` style is located in `./app/components/list-comments/list-component.tsx` - Any other files should also be named in kebab-case. For example, `./app/utils/get-param.ts` @@ -88,15 +98,17 @@ Run `npm run build` inside `./frontend`, and result files will be saved in `./fr ### Testing -- Project uses `jest` as test harness +- Project uses [Jest](https://jestjs.io) as test framework +- [Testing Library](https://testing-library.com) is used as UI test utilities (there are still tests with Enzyme but we are in process of migration) - Jest checks files that match regex `\.(test|spec)\.ts(x?)$`, i.e., `comment.test.tsx`, `comment.spec.ts` - Tests are running on push attempt -- Example tests can be found in `./app/store/user/reducers.test.ts`, `./app/components/auth-panel/auth-panel.test.tsx` +- Example tests can be found in `./app/components/auth/auth.spec.ts`, `./app/store/user/reducers.test.ts` -### How to add a new locale +### Notes -Please see [this documentation](https://remark42.com/docs/contributing/translations/). +Frontend part being bundled on docker env gets placed on `/src/web` and is available via `http://{host}/web`. For example, `embed.mjs` entry point will be available at `http://{host}/web/embed.mjs` -### Notes +### Learn More -Frontend part being bundled on docker env gets placed on `/src/web` and is available via `http://{host}/web`. For example, `embed.js` entry point will be available at `http://{host}/web/embed.js` +- [How to Add a New Locale](https://remark42.com/docs/contributing/translations/) +- [Remark42 Instance Parameters](https://remark42.com/docs/configuration/parameters/)