Ver Fonte

Merge pull request #7417 from weseek/support/use-turborepo

support: Migrate to Turborepo
Yuki Takei há 3 anos atrás
pai
commit
0fbfb5e33c
100 ficheiros alterados com 601 adições e 236 exclusões
  1. 4 5
      .devcontainer/Dockerfile
  2. 1 1
      .devcontainer/devcontainer.json
  3. 5 5
      .devcontainer/docker-compose.yml
  4. 16 14
      .github/workflows/ci-app-prod.yml
  5. 88 38
      .github/workflows/ci-app.yml
  6. 104 40
      .github/workflows/ci-slackbot-proxy.yml
  7. 4 4
      .github/workflows/release-slackbot-proxy.yml
  8. 3 3
      .github/workflows/release.yml
  9. 89 58
      .github/workflows/reusable-app-prod.yml
  10. 17 7
      .github/workflows/reusable-app-reg-suit.yml
  11. 4 1
      .gitignore
  12. 8 0
      .swcrc
  13. 12 12
      .vscode/launch.json
  14. 0 0
      apps/app/.env.development
  15. 0 0
      apps/app/.env.production
  16. 0 2
      apps/app/.eslintignore
  17. 0 0
      apps/app/.eslintrc.js
  18. 18 0
      apps/app/.gitignore
  19. 0 0
      apps/app/.prettierignore
  20. 1 1
      apps/app/.stylelintrc.json
  21. 0 0
      apps/app/bin/cdn/cdn-resources-downloader.ts
  22. 0 0
      apps/app/bin/download-cdn-resources.ts
  23. 0 0
      apps/app/bin/github-actions/update-readme.sh
  24. 0 0
      apps/app/config/cdn.js
  25. 0 0
      apps/app/config/ci/.env.local.for-auto-install
  26. 0 0
      apps/app/config/ci/.env.local.for-auto-install-with-allowing-guest
  27. 0 0
      apps/app/config/ci/.env.local.for-ci
  28. 0 0
      apps/app/config/logger/config.dev.js
  29. 0 0
      apps/app/config/logger/config.prod.js
  30. 0 0
      apps/app/config/migrate-mongo-config.js
  31. 29 0
      apps/app/config/next-i18next.config.js
  32. 0 0
      apps/app/config/swagger-definition.js
  33. 0 0
      apps/app/cypress.config.ts
  34. 144 0
      apps/app/docker/Dockerfile
  35. 2 0
      apps/app/docker/Dockerfile.dockerignore
  36. 1 1
      apps/app/docker/README.md
  37. 0 0
      apps/app/docker/codebuild/.terraform.lock.hcl
  38. 1 1
      apps/app/docker/codebuild/buildspec.yml
  39. 1 1
      apps/app/docker/codebuild/codebuild.tf
  40. 0 0
      apps/app/docker/codebuild/main.tf
  41. 0 0
      apps/app/docker/codebuild/oidc.tf
  42. 0 0
      apps/app/docker/codebuild/secretsmanager.tf
  43. 0 0
      apps/app/docker/docker-entrypoint.sh
  44. 15 12
      apps/app/jest.config.js
  45. 0 0
      apps/app/next-env.d.ts
  46. 19 10
      apps/app/next.config.js
  47. 15 20
      apps/app/package.json
  48. 0 0
      apps/app/public/favicon.ico
  49. 0 0
      apps/app/public/images/customize-settings/default-dark.svg
  50. 0 0
      apps/app/public/images/customize-settings/default-light.svg
  51. 0 0
      apps/app/public/images/customize-settings/dock-dark.svg
  52. 0 0
      apps/app/public/images/customize-settings/dock-light.svg
  53. 0 0
      apps/app/public/images/customize-settings/drawer-dark.svg
  54. 0 0
      apps/app/public/images/customize-settings/drawer-light.svg
  55. 0 0
      apps/app/public/images/customize-settings/fluid-dark.svg
  56. 0 0
      apps/app/public/images/customize-settings/fluid-light.svg
  57. 0 0
      apps/app/public/images/file-not-found.png
  58. 0 0
      apps/app/public/images/icons/editor/bold.svg
  59. 0 0
      apps/app/public/images/icons/editor/check.svg
  60. 0 0
      apps/app/public/images/icons/editor/code.svg
  61. 0 0
      apps/app/public/images/icons/editor/header.svg
  62. 0 0
      apps/app/public/images/icons/editor/italic.svg
  63. 0 0
      apps/app/public/images/icons/editor/link.svg
  64. 0 0
      apps/app/public/images/icons/editor/list-ol.svg
  65. 0 0
      apps/app/public/images/icons/editor/list-ul.svg
  66. 0 0
      apps/app/public/images/icons/editor/picture.svg
  67. 0 0
      apps/app/public/images/icons/editor/quote.svg
  68. 0 0
      apps/app/public/images/icons/editor/strikethrough.svg
  69. 0 0
      apps/app/public/images/icons/editor/table.svg
  70. 0 0
      apps/app/public/images/icons/emacs.png
  71. 0 0
      apps/app/public/images/icons/favicon/android-icon-144x144.png
  72. 0 0
      apps/app/public/images/icons/favicon/android-icon-192x192.png
  73. 0 0
      apps/app/public/images/icons/favicon/android-icon-36x36.png
  74. 0 0
      apps/app/public/images/icons/favicon/android-icon-48x48.png
  75. 0 0
      apps/app/public/images/icons/favicon/android-icon-72x72.png
  76. 0 0
      apps/app/public/images/icons/favicon/android-icon-96x96.png
  77. 0 0
      apps/app/public/images/icons/favicon/apple-icon-114x114.png
  78. 0 0
      apps/app/public/images/icons/favicon/apple-icon-120x120.png
  79. 0 0
      apps/app/public/images/icons/favicon/apple-icon-144x144.png
  80. 0 0
      apps/app/public/images/icons/favicon/apple-icon-152x152.png
  81. 0 0
      apps/app/public/images/icons/favicon/apple-icon-180x180.png
  82. 0 0
      apps/app/public/images/icons/favicon/apple-icon-57x57.png
  83. 0 0
      apps/app/public/images/icons/favicon/apple-icon-60x60.png
  84. 0 0
      apps/app/public/images/icons/favicon/apple-icon-72x72.png
  85. 0 0
      apps/app/public/images/icons/favicon/apple-icon-76x76.png
  86. 0 0
      apps/app/public/images/icons/favicon/apple-icon-precomposed.png
  87. 0 0
      apps/app/public/images/icons/favicon/apple-icon.png
  88. 0 0
      apps/app/public/images/icons/favicon/browserconfig.xml
  89. 0 0
      apps/app/public/images/icons/favicon/favicon-16x16.png
  90. 0 0
      apps/app/public/images/icons/favicon/favicon-32x32.png
  91. 0 0
      apps/app/public/images/icons/favicon/favicon-96x96.png
  92. 0 0
      apps/app/public/images/icons/favicon/manifest.json
  93. 0 0
      apps/app/public/images/icons/favicon/ms-icon-144x144.png
  94. 0 0
      apps/app/public/images/icons/favicon/ms-icon-150x150.png
  95. 0 0
      apps/app/public/images/icons/favicon/ms-icon-310x310.png
  96. 0 0
      apps/app/public/images/icons/favicon/ms-icon-70x70.png
  97. 0 0
      apps/app/public/images/icons/fx.svg
  98. 0 0
      apps/app/public/images/icons/slack/mark-color.svg
  99. 0 0
      apps/app/public/images/icons/slack/mark-monochrome_black.svg
  100. 0 0
      apps/app/public/images/icons/slack/mark-monochrome_white.svg

+ 4 - 5
.devcontainer/Dockerfile

@@ -3,7 +3,7 @@
 # Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
 #-------------------------------------------------------------------------------------------------------------
 
-FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-16
+FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-18
 
 # The node image includes a non-root user with sudo access. Use the
 # "remoteUser" property in devcontainer.json to use it. On Linux, update
@@ -14,9 +14,9 @@ ARG USER_UID=1000
 ARG USER_GID=$USER_UID
 
 RUN mkdir -p /workspace/growi/node_modules
-RUN mkdir -p /workspace/growi/packages/app/node_modules
-RUN mkdir -p /workspace/growi/packages/slackbot-proxy/node_modules
-RUN mkdir -p /workspace/growi/packages/app/.next
+RUN mkdir -p /workspace/growi/apps/app/node_modules
+RUN mkdir -p /workspace/growi/apps/slackbot-proxy/node_modules
+RUN mkdir -p /workspace/growi/apps/app/.next
 
 # [Optional] Update UID/GID if needed
 RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \
@@ -42,7 +42,6 @@ RUN apt-get update \
       google-chrome-stable \
       # for Cypress
       libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb fonts-noto-cjk \
-
    # Clean up
    && apt-get autoremove -y \
    && apt-get clean -y \

+ 1 - 1
.devcontainer/devcontainer.json

@@ -35,7 +35,7 @@
   // "shutdownAction": "none",
 
   // Use 'postCreateCommand' to run commands after the container is created.
-  // "postCreateCommand": "yarn install",
+  "postCreateCommand": "yarn global add turbo && yarn install",
 
   // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
   "remoteUser": "node"

+ 5 - 5
.devcontainer/docker-compose.yml

@@ -20,9 +20,9 @@ services:
     volumes:
       - ..:/workspace/growi:delegated
       - node_modules:/workspace/growi/node_modules
-      - node_modules_app:/workspace/growi/packages/app/node_modules
-      - node_modules_slackbot-proxy:/workspace/growi/packages/slackbot-proxy/node_modules
-      - buildcache_app:/workspace/growi/packages/app/.next
+      - node_modules_app:/workspace/growi/apps/app/node_modules
+      - node_modules_slackbot-proxy:/workspace/growi/apps/slackbot-proxy/node_modules
+      - buildcache_app:/workspace/growi/apps/app/.next
       - ../../growi-docker-compose:/workspace/growi-docker-compose:delegated
 
     tty: true
@@ -49,7 +49,7 @@ services:
       context: ../../growi-docker-compose/elasticsearch
       dockerfile: ./Dockerfile
       args:
-        - version=7.16.1
+        - version=7.17.9
     restart: unless-stopped
     ports:
       - 9200:9200
@@ -67,7 +67,7 @@ services:
 
   #need to adjust kibana version based on elasticsearch version (use same version as elasticsearch version)
   kibana:
-    image: docker.elastic.co/kibana/kibana:7.16.1
+    image: docker.elastic.co/kibana/kibana:7.17.9
     restart: unless-stopped
     environment:
       ELASTICSEARCH_HOSTS: 'http://elasticsearch:9200'

+ 16 - 14
.github/workflows/ci-app-prod.yml

@@ -9,9 +9,10 @@ on:
       - .github/workflows/reusable-app-prod.yml
       - .github/workflows/reusable-app-reg-suit.yml
       - tsconfig.base.json
+      - turbo.json
       - yarn.lock
-      - packages/app/**
-      - '!packages/app/docker/**'
+      - apps/app/**
+      - '!apps/app/docker/**'
       - packages/codemirror-textlint/**
       - packages/core/**
       - packages/preset-themes/**
@@ -29,8 +30,9 @@ on:
       - .github/workflows/reusable-app-reg-suit.yml
       - tsconfig.base.json
       - yarn.lock
-      - packages/app/**
-      - '!packages/app/docker/**'
+      - turbo.json
+      - apps/app/**
+      - '!apps/app/docker/**'
       - packages/codemirror-textlint/**
       - packages/core/**
       - packages/preset-themes/**
@@ -51,19 +53,19 @@ concurrency:
 
 jobs:
 
-  test-prod-node14:
-    uses: weseek/growi/.github/workflows/reusable-app-prod.yml@master
+  test-prod-node16:
+    uses: weseek/growi/.github/workflows/reusable-app-prod.yml@support/use-turborepo
     with:
-      node-version: 14.x
+      node-version: 16.x
       skip-cypress: true
     secrets:
       SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
 
 
-  test-prod-node16:
-    uses: weseek/growi/.github/workflows/reusable-app-prod.yml@master
+  test-prod-node18:
+    uses: weseek/growi/.github/workflows/reusable-app-prod.yml@support/use-turborepo
     with:
-      node-version: 16.x
+      node-version: 18.x
       skip-cypress: ${{ contains( github.event.pull_request.labels.*.name, 'dependencies' ) }}
       cypress-report-artifact-name: Cypress report
       cypress-config-video: ${{ inputs.cypress-config-video || false }}
@@ -71,15 +73,15 @@ jobs:
       SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
 
 
-  run-reg-suit-node16:
-    needs: [test-prod-node16]
+  run-reg-suit-node18:
+    needs: [test-prod-node18]
 
-    uses: weseek/growi/.github/workflows/reusable-app-reg-suit.yml@master
+    uses: weseek/growi/.github/workflows/reusable-app-reg-suit.yml@support/use-turborepo
 
     if: always()
 
     with:
-      node-version: 16.x
+      node-version: 18.x
       skip-reg-suit: ${{ contains( github.event.pull_request.labels.*.name, 'dependencies' ) }}
       cypress-report-artifact-name: Cypress report
     secrets:

+ 88 - 38
.github/workflows/ci-app.yml

@@ -9,13 +9,15 @@ on:
       - .github/workflows/ci-app.yml
       - .eslint*
       - tsconfig.base.json
+      - turbo.json
       - yarn.lock
-      - packages/app/**
-      - '!packages/app/docker/**'
+      - apps/app/**
+      - '!apps/app/docker/**'
       - packages/codemirror-textlint/**
       - packages/core/**
-      - packages/preset-themes/**
+      - packages/hackmd/**
       - packages/presentation/**
+      - packages/preset-themes/**
       - packages/remark-*/**
       - packages/slack/**
       - packages/ui/**
@@ -31,7 +33,7 @@ jobs:
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     steps:
       - uses: actions/checkout@v3
@@ -43,29 +45,33 @@ jobs:
           cache-dependency-path: '**/yarn.lock'
 
       - name: Cache/Restore node_modules
-        id: cache-dependencies
         uses: actions/cache@v3
         with:
           path: |
             **/node_modules
-          key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+          key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/app/package.json') }}
           restore-keys: |
             node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
             node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-      - name: lerna bootstrap
-        run: |
-          npx lerna bootstrap -- --frozen-lockfile
+      - name: Restore dist
+        uses: actions/cache/restore@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+          key: dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+          restore-keys: |
+            dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-      - name: lerna run lint for dependent packages
-        run: |
-          yarn lerna run lint --scope @growi/codemirror-textlint --scope @growi/core --scope @growi/hackmd --scope @growi/preset-themes --scope @growi/remark-* --scope @growi/slack --scope @growi/ui
-      - name: build dependent packages
+      - name: Install dependencies
         run: |
-          yarn lerna run build --scope @growi/preset-themes
-      - name: lerna run lint for app
+          yarn global add turbo
+          yarn --frozen-lockfile
+
+      - name: Lint
         run: |
-          yarn lerna run lint --scope @growi/app
+          turbo run lint --filter=!@growi/slackbot-proxy
 
       - name: Slack Notification
         uses: weseek/ghaction-slack-notification@master
@@ -77,12 +83,21 @@ jobs:
           isCompactMode: true
           url: ${{ secrets.SLACK_WEBHOOK_URL }}
 
+      - name: Cache dist
+        uses: actions/cache/save@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+          key: dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+
+
   test:
     runs-on: ubuntu-latest
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     services:
       mongodb:
@@ -105,23 +120,29 @@ jobs:
         with:
           path: |
             **/node_modules
-          key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+          key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/app/package.json') }}
           restore-keys: |
             node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
             node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-      - name: lerna bootstrap
-        run: |
-          npx lerna bootstrap -- --frozen-lockfile
+      - name: Restore dist
+        uses: actions/cache/restore@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+          key: dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+          restore-keys: |
+            dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-      - name: lerna run test for plugins
+      - name: Install dependencies
         run: |
-          yarn lerna run test --scope @growi/remark-*
+          yarn global add turbo
+          yarn --frozen-lockfile
 
-      - name: Test app
-        working-directory: ./packages/app
+      - name: Test
         run: |
-          yarn test:ci --selectProjects unit server ; yarn test:ci --selectProjects server-v5
+          turbo run test --filter=!@growi/slackbot-proxy
         env:
           MONGO_URI: mongodb://localhost:${{ job.services.mongodb.ports['27017'] }}/growi_test
 
@@ -130,7 +151,7 @@ jobs:
         with:
           name: Coverage Report
           path: |
-            packages/app/coverage
+            apps/app/coverage
             packages/remark-growi-directive/coverage
 
       - name: Slack Notification
@@ -143,12 +164,21 @@ jobs:
           isCompactMode: true
           url: ${{ secrets.SLACK_WEBHOOK_URL }}
 
+      - name: Cache dist
+        uses: actions/cache/save@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+          key: dist-app-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+
+
   launch-dev:
     runs-on: ubuntu-latest
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     services:
       mongodb:
@@ -165,27 +195,38 @@ jobs:
           cache: 'yarn'
           cache-dependency-path: '**/yarn.lock'
 
-      - name: Cache/Restore node_modules and next cache files
+      - name: Cache/Restore node_modules
         id: cache-dependencies
         uses: actions/cache@v3
         with:
           path: |
             **/node_modules
-            ${{ github.workspace }}/packages/app/.next/cache
-          key: dev-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+          key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/app/package.json') }}
           restore-keys: |
-            dev-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
-            dev-${{ runner.OS }}-node${{ matrix.node-version }}-
+            node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
+            node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-      - name: lerna bootstrap
+      - name: Restore dist
+        uses: actions/cache/restore@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+            ${{ github.workspace }}/apps/app/.next
+          key: dist-app-dev-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+          restore-keys: |
+            dist-app-dev-${{ runner.OS }}-node${{ matrix.node-version }}-
+
+      - name: Install dependencies
         run: |
-          npx lerna bootstrap -- --frozen-lockfile
+          yarn global add turbo
+          yarn --frozen-lockfile
 
-      - name: yarn dev:ci
-        working-directory: ./packages/app
+      - name: turbo run dev:ci
+        working-directory: ./apps/app
         run: |
           cp config/ci/.env.local.for-ci .env.development.local
-          yarn dev:ci
+          turbo run dev:ci
         env:
           MONGO_URI: mongodb://localhost:${{ job.services.mongodb.ports['27017'] }}/growi_dev
 
@@ -198,3 +239,12 @@ jobs:
           channel: '#ci'
           isCompactMode: true
           url: ${{ secrets.SLACK_WEBHOOK_URL }}
+
+      - name: Cache dist
+        uses: actions/cache/save@v3
+        with:
+          path: |
+            **/.turbo
+            **/dist
+            ${{ github.workspace }}/apps/app/.next
+          key: dist-app-dev-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}

+ 104 - 40
.github/workflows/ci-slackbot-proxy.yml

@@ -10,9 +10,10 @@ on:
       - .github/workflows/ci-slackbot-proxy.yml
       - .eslint*
       - tsconfig.base.json
+      - turbo.json
       - yarn.lock
-      - packages/slackbot-proxy/**
-      - '!packages/slackbot-proxy/docker/**'
+      - apps/slackbot-proxy/**
+      - '!apps/slackbot-proxy/docker/**'
       - packages/slack/**
 
 concurrency:
@@ -22,12 +23,12 @@ concurrency:
 
 jobs:
 
-  test:
+  lint:
     runs-on: ubuntu-latest
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     steps:
     - uses: actions/checkout@v3
@@ -39,25 +40,33 @@ jobs:
         cache-dependency-path: '**/yarn.lock'
 
     - name: Cache/Restore node_modules
-      id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-        key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}
+        key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/slackbot-proxy/package.json') }}
         restore-keys: |
+          node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
           node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-    - name: lerna bootstrap
-      run: |
-        npx lerna bootstrap -- --frozen-lockfile
+    - name: Restore dist
+      uses: actions/cache/restore@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+        restore-keys: |
+          dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-    - name: yarn lint
+    - name: Install dependencies
       run: |
-        yarn lerna run lint --scope @growi/slack --scope @growi/slackbot-proxy
-    - name: yarn test
+        yarn global add turbo
+        yarn --frozen-lockfile
+
+    - name: Lint
       run: |
-        yarn lerna run test --scope @growi/slack --scope @growi/slackbot-proxy
+        turbo run lint --filter=@growi/slackbot-proxy
 
     - name: Slack Notification
       uses: weseek/ghaction-slack-notification@master
@@ -69,13 +78,21 @@ jobs:
         isCompactMode: true
         url: ${{ secrets.SLACK_WEBHOOK_URL }}
 
+    - name: Cache dist
+      uses: actions/cache/save@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+
 
   launch-dev:
     runs-on: ubuntu-latest
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     services:
       mysql:
@@ -97,24 +114,35 @@ jobs:
         cache-dependency-path: '**/yarn.lock'
 
     - name: Cache/Restore node_modules
-      id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-        key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}
+        key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('apps/slackbot-proxy/package.json') }}
         restore-keys: |
+          node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
           node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
 
-    - name: lerna bootstrap
+    - name: Restore dist
+      uses: actions/cache/restore@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+        restore-keys: |
+          dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-
+
+    - name: Install dependencies
       run: |
-        npx lerna bootstrap -- --frozen-lockfile
+        yarn global add turbo
+        yarn --frozen-lockfile
 
     - name: yarn dev:ci
-      working-directory: ./packages/slackbot-proxy
+      working-directory: ./apps/slackbot-proxy
       run: |
         cp config/ci/.env.local.for-ci .env.development.local
-        yarn dev:ci
+        turbo run dev:ci
       env:
         SERVER_URI: http://localhost:8080
         TYPEORM_CONNECTION: mysql
@@ -134,13 +162,21 @@ jobs:
         isCompactMode: true
         url: ${{ secrets.SLACK_WEBHOOK_URL }}
 
+    - name: Cache dist
+      uses: actions/cache/save@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-ci-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+
 
   launch-prod:
     runs-on: ubuntu-latest
 
     strategy:
       matrix:
-        node-version: [16.x]
+        node-version: [18.x]
 
     services:
       mysql:
@@ -161,31 +197,51 @@ jobs:
         cache: 'yarn'
         cache-dependency-path: '**/yarn.lock'
 
-    - name: Remove unnecessary packages
-      working-directory: ./packages
+    - name: Install turbo
       run: |
-        ls | egrep -v '^(slack|slackbot-proxy)$' | xargs rm -r
-    - name: lerna bootstrap
-      run: |
-        npx lerna bootstrap
-    - name: Print dependencies
+        yarn global add turbo
+
+    - name: Prune repositories
       run: |
-        echo -n "node " && node -v
-        echo -n "npm " && npm -v
-        yarn list --depth=0
-    - name: lerna run build
+        turbo prune --scope=@growi/slackbot-proxy
+        rm -rf apps packages
+        mv out/* .
+
+    - name: Cache/Restore node_modules
+      id: cache-dependencies
+      uses: actions/cache@v3
+      with:
+        path: |
+          **/node_modules
+        key: node_modules-slackbot-prxy-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
+        restore-keys: |
+          node_modules-slackbot-proxy-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
+
+    - name: Install dependencies
       run: |
-        yarn lerna run build
-    - name: lerna bootstrap --production
+        yarn --frozen-lockfile
+
+    - name: Restore dist
+      uses: actions/cache/restore@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-prod-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+        restore-keys: |
+          dist-slackbot-proxy-prod-${{ runner.OS }}-node${{ matrix.node-version }}-
+
+    - name: Build
+      working-directory: ./apps/slackbot-proxy
       run: |
-        npx lerna bootstrap -- --production
-    - name: Print dependencies
+        turbo run build
+
+    - name: Install dependencies for production
       run: |
-        echo -n "node " && node -v
-        echo -n "npm " && npm -v
-        yarn list --production --depth=0
+        yarn --production
+
     - name: yarn start:prod:ci
-      working-directory: ./packages/slackbot-proxy
+      working-directory: ./apps/slackbot-proxy
       run: |
         cp config/ci/.env.local.for-ci .env.production.local
         yarn start:prod:ci
@@ -207,3 +263,11 @@ jobs:
         channel: '#ci'
         isCompactMode: true
         url: ${{ secrets.SLACK_WEBHOOK_URL }}
+
+    - name: Cache dist
+      uses: actions/cache/save@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+        key: dist-slackbot-proxy-prod-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}

+ 4 - 4
.github/workflows/release-slackbot-proxy.yml

@@ -20,7 +20,7 @@ jobs:
       uses: myrotvorets/info-from-package-json-action@1.2.0
       id: package-json
       with:
-        workingDir: packages/slackbot-proxy
+        workingDir: apps/slackbot-proxy
 
     - name: Docker meta
       id: meta
@@ -61,7 +61,7 @@ jobs:
       uses: docker/build-push-action@v4
       with:
         context: .
-        file: ./packages/slackbot-proxy/docker/Dockerfile
+        file: ./apps/slackbot-proxy/docker/Dockerfile
         platforms: linux/amd64
         push: true
         builder: ${{ steps.buildx.outputs.name }}
@@ -87,7 +87,7 @@ jobs:
         username: wsmoogle
         password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
         repository: weseek/growi-slackbot-proxy
-        readme-filepath: ./packages/slackbot-proxy/docker/README.md
+        readme-filepath: ./apps/slackbot-proxy/docker/README.md
 
 
   create-pr-for-next-rc:
@@ -118,7 +118,7 @@ jobs:
       uses: myrotvorets/info-from-package-json-action@1.2.0
       id: package-json
       with:
-        workingDir: packages/slackbot-proxy
+        workingDir: apps/slackbot-proxy
 
     - name: Commit
       uses: github-actions-x/commit@v2.9

+ 3 - 3
.github/workflows/release.yml

@@ -35,7 +35,7 @@ jobs:
     - name: Bump versions
       run: |
         yarn bump-versions:patch
-        sh ./packages/app/bin/github-actions/update-readme.sh
+        sh ./apps/app/bin/github-actions/update-readme.sh
 
     - name: Retrieve information from package.json
       uses: myrotvorets/info-from-package-json-action@1.2.0
@@ -48,7 +48,7 @@ jobs:
         release-notes: ${{ github.event.pull_request.body }}
 
     - name: Update README.md for docker image
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         sh ./bin/github-actions/update-readme.sh
       env:
@@ -213,7 +213,7 @@ jobs:
         username: wsmoogle
         password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
         repository: weseek/growi
-        readme-filepath: ./packages/app/docker/README.md
+        readme-filepath: ./apps/app/docker/README.md
 
     - name: Slack Notification
       uses: weseek/ghaction-release-slack-notification@master

+ 89 - 58
.github/workflows/reusable-app-prod.yml

@@ -34,29 +34,45 @@ jobs:
         cache: 'yarn'
         cache-dependency-path: '**/yarn.lock'
 
+    - name: Install turbo
+      run: |
+        yarn global add turbo
+
+    - name: Prune repositories
+      run: |
+        turbo prune --scope=@growi/app
+        rm -rf apps packages
+        mv out/* .
+
     - name: Cache/Restore node_modules
       id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-        key: node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+        key: node_modules-app-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
         restore-keys: |
-          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}-
-          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-
+          node_modules-app-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
 
-    - name: lerna bootstrap
+    - name: Install dependencies
       run: |
-        npx lerna bootstrap -- --frozen-lockfile
+        yarn --frozen-lockfile
 
-    - name: Remove unnecessary packages
-      run: |
-        rm -rf packages/slackbot-proxy
-        rm -f "node_modules/@growi/slackbot-proxy"
+    - name: Restore dist
+      uses: actions/cache/restore@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+          ${{ github.workspace }}/apps/app/.next
+        key: dist-app-prod-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
+        restore-keys: |
+          dist-app-prod-${{ runner.OS }}-node${{ matrix.node-version }}-
 
     - name: Build
+      working-directory: ./apps/app
       run: |
-        yarn lerna run build
+        turbo run build
       env:
         ANALYZE_BUNDLE_SIZE: 1
 
@@ -65,14 +81,16 @@ jobs:
       run: |
         tar -zcf production.tar.gz \
           package.json \
-          packages/app/.next \
-          packages/app/config \
-          packages/app/public \
-          packages/app/resource \
-          packages/app/tmp \
-          packages/app/.env.production* \
-          packages/*/package.json \
-          packages/*/dist
+          apps/app/.next \
+          apps/app/config \
+          apps/app/dist \
+          apps/app/public \
+          apps/app/resource \
+          apps/app/tmp \
+          apps/app/.env.production* \
+          apps/app/package.json \
+          packages/*/dist \
+          packages/*/package.json
         echo "file=production.tar.gz" >> $GITHUB_OUTPUT
 
     - name: Upload production files as artifact
@@ -86,8 +104,8 @@ jobs:
       with:
         name: Bundle Analyzing Report
         path: |
-          packages/app/.next/analyze/client.html
-          packages/app/.next/analyze/server.html
+          apps/app/.next/analyze/client.html
+          apps/app/.next/analyze/server.html
 
     - name: Slack Notification
       uses: weseek/ghaction-slack-notification@master
@@ -99,6 +117,14 @@ jobs:
         isCompactMode: true
         url: ${{ secrets.SLACK_WEBHOOK_URL }}
 
+    - name: Cache dist
+      uses: actions/cache/save@v3
+      with:
+        path: |
+          **/.turbo
+          **/dist
+          ${{ github.workspace }}/apps/app/.next
+        key: dist-app-prod-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('node_modules/.cache/turbo/*-meta.json') }}
 
 
   launch-prod:
@@ -126,34 +152,29 @@ jobs:
         cache: 'yarn'
         cache-dependency-path: '**/yarn.lock'
 
-    - name: Get Date
-      id: get-date
+    - name: Install turbo
+      run: |
+        yarn global add turbo
+
+    - name: Prune repositories
       run: |
-        echo "dateYmdHM=$(/bin/date -u "+%Y%m%d%H%M")" >> $GITHUB_OUTPUT
-        echo "dateYm=$(/bin/date -u "+%Y%m")" >> $GITHUB_OUTPUT
+        turbo prune --scope=@growi/app
+        rm -rf apps packages
+        mv out/* .
 
-    - name: Cache/Restore node_modules (not reused)
+    - name: Cache/Restore node_modules
       id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-        key: node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ steps.get-date.outputs.dateYmdHM }}
+        key: node_modules-app-launch-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
         restore-keys: |
-          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
-          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
-          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-
-          node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ steps.get-date.outputs.dateYm }}
-          node_modules-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
-
-    - name: Remove unnecessary packages
-      run: |
-        rm -rf packages/slackbot-proxy
-        rm -f "node_modules/@growi/slackbot-proxy"
+          node_modules-app-launch-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
 
-    - name: lerna bootstrap --production
+    - name: Install dependencies
       run: |
-        npx lerna bootstrap -- --production
+        yarn --production
 
     - name: Download production files artifact
       uses: actions/download-artifact@v3
@@ -165,7 +186,7 @@ jobs:
         tar -xf ${{ needs.build-prod.outputs.PROD_FILES }}
 
     - name: yarn server:ci
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         cp config/ci/.env.local.for-ci .env.production.local
         yarn server:ci
@@ -222,24 +243,34 @@ jobs:
         cache: 'yarn'
         cache-dependency-path: '**/yarn.lock'
 
-    - name: Cache/Restore dependencies
+    - name: Install turbo
+      run: |
+        yarn global add turbo
+
+    - name: Prune repositories
+      run: |
+        turbo prune --scope=@growi/app
+        rm -rf apps packages
+        mv out/* .
+
+    - name: Cache/Restore node_modules
+      id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-          ~/.cache/Cypress
-        key: deps-for-cypress-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+        key: node_modules-app-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
         restore-keys: |
-          deps-for-cypress-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}-
-          deps-for-cypress-${{ runner.OS }}-node${{ inputs.node-version }}
+          node_modules-app-build-prod-${{ runner.OS }}-node${{ inputs.node-version }}-
 
-    - name: lerna bootstrap
-      run: |
-        npx lerna bootstrap -- --production
-
-    - name: lerna add packages needed for CI
-      run: |
-        npx lerna add yargs
+    - name: Cache/Restore Cypress files
+      uses: actions/cache@v3
+      with:
+        path: |
+          ~/.cache/Cypress
+        key: deps-for-cypress-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
+        restore-keys: |
+          deps-for-cypress-${{ runner.OS }}-node${{ inputs.node-version }}-
 
     - name: Download production files artifact
       uses: actions/download-artifact@v3
@@ -253,23 +284,23 @@ jobs:
     - name: Determine spec expression
       id: determine-spec-exp
       run: |
-        SPEC=`node bin/github-actions/generate-cypress-spec-arg.js --prefix="test/cypress/integration/" --suffix="-*/**" "${{ matrix.spec-group }}"`
+        SPEC=`node bin/github-actions/generate-cypress-spec-arg.mjs --prefix="test/cypress/integration/" --suffix="-*/**" "${{ matrix.spec-group }}"`
         echo "value=$SPEC" >> $GITHUB_OUTPUT
 
     - name: Copy dotenv file for ci
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         cat config/ci/.env.local.for-ci >> .env.production.local
 
     - name: Copy dotenv file for automatic installation
       if: ${{ matrix.spec-group != '10' }}
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         cat config/ci/.env.local.for-auto-install >> .env.production.local
 
     - name: Copy dotenv file for automatic installation with allowing guest mode
       if: ${{ matrix.spec-group == '21' }}
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         cat config/ci/.env.local.for-auto-install-with-allowing-guest >> .env.production.local
 
@@ -277,7 +308,7 @@ jobs:
       uses: cypress-io/github-action@v3
       with:
         browser: chrome
-        working-directory: ./packages/app
+        working-directory: ./apps/app
         spec: '${{ steps.determine-spec-exp.outputs.value }}'
         start: yarn server
         wait-on: 'http://localhost:3000'
@@ -292,8 +323,8 @@ jobs:
       with:
         name: ${{ inputs.cypress-report-artifact-name }}
         path: |
-          packages/app/test/cypress/screenshots
-          packages/app/test/cypress/videos
+          apps/app/test/cypress/screenshots
+          apps/app/test/cypress/videos
 
     - name: Slack Notification
       uses: weseek/ghaction-slack-notification@master

+ 17 - 7
.github/workflows/reusable-app-reg-suit.yml

@@ -60,28 +60,38 @@ jobs:
         cache: 'yarn'
         cache-dependency-path: '**/yarn.lock'
 
+    - name: Install turbo
+      run: |
+        yarn global add turbo
+
+    - name: Prune repositories
+      run: |
+        turbo prune --scope=@growi/app
+        rm -rf apps packages
+        mv out/* .
+
     - name: Cache/Restore node_modules
+      id: cache-dependencies
       uses: actions/cache@v3
       with:
         path: |
           **/node_modules
-        key: node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('packages/app/package.json') }}
+        key: node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-${{ hashFiles('**/yarn.lock') }}
         restore-keys: |
-          node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }}-
-          node_modules-${{ runner.OS }}-node${{ matrix.node-version }}-
+          node_modules-${{ runner.OS }}-node${{ inputs.node-version }}-
 
-    - name: lerna bootstrap
+    - name: Install dependencies
       run: |
-        npx lerna bootstrap -- --frozen-lockfile
+        yarn --frozen-lockfile
 
     - name: Download screenshots taken by cypress
       uses: actions/download-artifact@v3
       with:
         name: ${{ inputs.cypress-report-artifact-name }}
-        path: packages/app/test/cypress
+        path: apps/app/test/cypress
 
     - name: Run reg-suit
-      working-directory: ./packages/app
+      working-directory: ./apps/app
       run: |
         yarn reg:run
 

+ 4 - 1
.gitignore

@@ -31,10 +31,13 @@ yarn-error.log*
 
 # Terraform
 **/.terraform/*
-# *.tfstate
 *.tfstate.*
 
 # IDE, dev #
 .idea
 *.orig
 *.code-workspace
+
+# turborepo
+.turbo
+out

+ 8 - 0
.swcrc

@@ -0,0 +1,8 @@
+{
+  "jsc": {
+    "parser": {
+      "syntax": "typescript",
+      "tsx": true
+    }
+  }
+}

+ 12 - 12
.vscode/launch.json

@@ -6,9 +6,9 @@
         "request": "attach",
         "name": "Debug: Attach Debugger to Server",
         "port": 9229,
-        "cwd": "${workspaceFolder}/packages/app",
+        "cwd": "${workspaceFolder}/apps/app",
         "sourceMapPathOverrides": {
-          "webpack://@growi/app/*": "${workspaceFolder}/packages/app/*"
+          "webpack://@growi/app/*": "${workspaceFolder}/apps/app/*"
         }
       },
       {
@@ -20,9 +20,9 @@
         ],
         "console": "integratedTerminal",
         "cwd": "${fileDirname}",
-        "runtimeExecutable": "yarn",
+        "runtimeExecutable": "node",
         "runtimeArgs": [
-          "ts-node",
+          "-r", "@swc-node/register",
           "${file}"
         ]
       },
@@ -30,7 +30,7 @@
         "type": "pwa-node",
         "request": "launch",
         "name": "Debug: Server",
-        "cwd": "${workspaceFolder}/packages/app",
+        "cwd": "${workspaceFolder}/apps/app",
         "runtimeExecutable": "yarn",
         "runtimeArgs": [
           "dev"
@@ -42,7 +42,7 @@
         "console": "integratedTerminal",
         "internalConsoleOptions": "neverOpen",
         "sourceMapPathOverrides": {
-          "webpack://@growi/app/*": "${workspaceFolder}/packages/app/*"
+          "webpack://@growi/app/*": "${workspaceFolder}/apps/app/*"
         }
       },
       {
@@ -51,9 +51,9 @@
         "name": "Debug: Chrome",
         "sourceMaps": true,
         "sourceMapPathOverrides": {
-          "webpack://_N_E/*": "${workspaceFolder}/packages/app/*"
+          "webpack://_N_E/*": "${workspaceFolder}/apps/app/*"
         },
-        "webRoot": "${workspaceFolder}/packages/app/public",
+        "webRoot": "${workspaceFolder}/apps/app/public",
         "url": "http://localhost:3000"
       },
       {
@@ -61,12 +61,12 @@
         "request": "launch",
         "name": "Debug: Firefox",
         "reAttach": true,
-        "webRoot": "${workspaceFolder}/packages/app/public",
+        "webRoot": "${workspaceFolder}/apps/app/public",
         "url": "http://localhost:3000",
         "pathMappings": [
           {
             "url": "webpack://_n_e/src",
-            "path": "${workspaceFolder}/packages/app/src"
+            "path": "${workspaceFolder}/apps/app/src"
           },
           {
             "url": "webpack://_n_e/core",
@@ -78,7 +78,7 @@
           },
           {
             "url": "webpack://_n_e/slack",
-            "path": "${workspaceFolder}/packages/app/slack"
+            "path": "${workspaceFolder}/apps/app/slack"
           },
           {
             "url": "webpack://_n_e/ui",
@@ -86,7 +86,7 @@
           },
           {
             "url": "http://localhost:3000",
-            "path": "${workspaceFolder}/packages/app/public"
+            "path": "${workspaceFolder}/apps/app/public"
           }
         ]
       }

+ 0 - 0
packages/app/.env.development → apps/app/.env.development


+ 0 - 0
packages/app/.env.production → apps/app/.env.production


+ 0 - 2
packages/app/.eslintignore → apps/app/.eslintignore

@@ -2,10 +2,8 @@
 /dist/**
 /transpiled/**
 /public/**
-/config/next-i18next.config.js
 /src/client/legacy/thirdparty-js/**
 /src/client/util/reveal/plugins/markdown.js
 /src/linter-checker/**
-/src/utils/next.config.utils.js
 /tmp/**
 /next-env.d.ts

+ 0 - 0
packages/app/.eslintrc.js → apps/app/.eslintrc.js


+ 18 - 0
apps/app/.gitignore

@@ -0,0 +1,18 @@
+# next.js
+/.next/
+/out/
+
+# test
+test/cypress/screenshots
+test/cypress/videos
+.reg
+
+# dist
+/build/
+/dist/
+/transpiled/
+/public/static/js
+/public/static/styles
+/public/uploads
+/src/styles/prebuilt
+/tmp/

+ 0 - 0
packages/app/.prettierignore → apps/app/.prettierignore


+ 1 - 1
packages/app/.stylelintrc.json → apps/app/.stylelintrc.json

@@ -4,7 +4,7 @@
   ],
   "customSyntax": "postcss-scss",
   "ignoreFiles": [
-    "src/styles/_override-bootstrap-variables.scss",
+    "src/styles/prebuilt/*.css",
     "src/linter-checker/test.scss"
   ],
   "rules": {

+ 0 - 0
packages/app/bin/cdn/cdn-resources-downloader.ts → apps/app/bin/cdn/cdn-resources-downloader.ts


+ 0 - 0
packages/app/bin/download-cdn-resources.ts → apps/app/bin/download-cdn-resources.ts


+ 0 - 0
packages/app/bin/github-actions/update-readme.sh → apps/app/bin/github-actions/update-readme.sh


+ 0 - 0
packages/app/config/cdn.js → apps/app/config/cdn.js


+ 0 - 0
packages/app/config/ci/.env.local.for-auto-install → apps/app/config/ci/.env.local.for-auto-install


+ 0 - 0
packages/app/config/ci/.env.local.for-auto-install-with-allowing-guest → apps/app/config/ci/.env.local.for-auto-install-with-allowing-guest


+ 0 - 0
packages/app/config/ci/.env.local.for-ci → apps/app/config/ci/.env.local.for-ci


+ 0 - 0
packages/app/config/logger/config.dev.js → apps/app/config/logger/config.dev.js


+ 0 - 0
packages/app/config/logger/config.prod.js → apps/app/config/logger/config.prod.js


+ 0 - 0
packages/app/config/migrate-mongo-config.js → apps/app/config/migrate-mongo-config.js


+ 29 - 0
apps/app/config/next-i18next.config.js

@@ -0,0 +1,29 @@
+const path = require('path');
+
+const { isServer, AllLang, Lang } = require('@growi/core');
+const I18nextChainedBackend = require('i18next-chained-backend').default;
+const I18NextHttpBackend = require('i18next-http-backend');
+const I18NextLocalStorageBackend = require('i18next-localstorage-backend').default;
+
+const isDev = process.env.NODE_ENV === 'development';
+
+module.exports = {
+  defaultLang: Lang.en_US,
+  i18n: {
+    defaultLocale: Lang.en_US,
+    locales: AllLang,
+  },
+  defaultNS: 'translation',
+  localePath: path.resolve('./public/static/locales'),
+  serializeConfig: false,
+  use: isServer() ? [] : [I18nextChainedBackend],
+  backend: {
+    backends: isServer() ? [] : [I18NextLocalStorageBackend, I18NextHttpBackend],
+    backendOptions: [
+      // options for i18next-localstorage-backend
+      { expirationTime: isDev ? 0 : 24 * 60 * 60 * 1000 }, // 1 day in production
+      // options for i18next-http-backend
+      { loadPath: '/static/locales/{{lng}}/{{ns}}.json' },
+    ],
+  },
+};

+ 0 - 0
packages/app/config/swagger-definition.js → apps/app/config/swagger-definition.js


+ 0 - 0
packages/app/cypress.config.ts → apps/app/cypress.config.ts


+ 144 - 0
apps/app/docker/Dockerfile

@@ -0,0 +1,144 @@
+# syntax = docker/dockerfile:1.4
+
+
+##
+## base
+##
+FROM node:18-slim AS base
+
+ENV optDir /opt
+
+WORKDIR ${optDir}
+
+RUN yarn global add turbo
+COPY . .
+RUN turbo prune --scope=@growi/app --docker
+
+
+##
+## deps-resolver
+##
+FROM node:18-slim AS deps-resolver
+
+ENV optDir /opt
+
+WORKDIR ${optDir}
+
+RUN set -eux; \
+	apt-get update; \
+	apt-get install -y python3 build-essential;
+
+# copy files
+COPY --from=base ${optDir}/out/json/ .
+COPY --from=base ${optDir}/out/yarn.lock ./yarn.lock
+
+# setup (with network-timeout = 1 hour)
+RUN yarn config set network-timeout 3600000
+RUN yarn --frozen-lockfile
+
+# make artifacts
+RUN tar -cf node_modules.tar \
+  node_modules \
+  apps/*/node_modules \
+  packages/*/node_modules
+
+
+
+##
+## deps-resolver-prod
+##
+FROM deps-resolver AS deps-resolver-prod
+
+RUN yarn --production
+# make artifacts
+RUN tar -cf node_modules.tar \
+  node_modules \
+  apps/*/node_modules \
+  packages/*/node_modules
+
+
+
+##
+## builder
+##
+FROM node:18-slim AS builder
+
+ENV optDir /opt
+
+WORKDIR ${optDir}
+
+RUN yarn global add turbo
+
+# copy files
+COPY --from=base ${optDir}/out/full/ .
+COPY --from=base ${optDir}/out/yarn.lock ./yarn.lock
+COPY ["tsconfig.base.json", "./"]
+
+# copy dependent packages
+COPY --from=deps-resolver \
+  ${optDir}/node_modules.tar ${optDir}/
+
+# extract node_modules.tar
+RUN tar -xf node_modules.tar
+RUN rm node_modules.tar
+
+# build
+RUN turbo run build
+
+# make artifacts
+RUN tar -cf packages.tar \
+  package.json \
+  apps/app/.next \
+  apps/app/config \
+  apps/app/public \
+  apps/app/resource \
+  apps/app/tmp \
+  apps/app/.env.production* \
+  apps/app/next.config.js \
+  **/package.json \
+  **/dist
+
+
+
+##
+## release
+##
+FROM node:18-slim
+LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
+
+ENV NODE_ENV production
+
+ENV optDir /opt
+ENV appDir ${optDir}/growi
+
+# Add gosu
+# see: https://github.com/tianon/gosu/blob/1.13/INSTALL.md
+RUN set -eux; \
+	apt-get update; \
+	apt-get install -y gosu; \
+	rm -rf /var/lib/apt/lists/*; \
+# verify that the binary works
+	gosu nobody true
+
+COPY --from=deps-resolver-prod --chown=node:node \
+  ${optDir}/node_modules.tar ${appDir}/
+COPY --from=builder --chown=node:node \
+  ${optDir}/packages.tar ${appDir}/
+
+# extract artifacts as 'node' user
+USER node
+WORKDIR ${appDir}
+RUN tar -xf node_modules.tar
+RUN tar -xf packages.tar
+RUN rm node_modules.tar packages.tar
+
+COPY --chown=node:node --chmod=700 apps/app/docker/docker-entrypoint.sh /
+
+USER root
+WORKDIR ${appDir}/apps/app
+
+VOLUME /data
+EXPOSE 3000
+
+ENTRYPOINT ["/docker-entrypoint.sh"]
+CMD ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"]

+ 2 - 0
packages/slackbot-proxy/docker/Dockerfile.dockerignore → apps/app/docker/Dockerfile.dockerignore

@@ -3,3 +3,5 @@
 **/coverage
 **/Dockerfile
 **/*.dockerignore
+**/.next
+**/.turbo

+ 1 - 1
packages/app/docker/README.md → apps/app/docker/README.md

@@ -10,7 +10,7 @@ GROWI Official docker image
 Supported tags and respective Dockerfile links
 ------------------------------------------------
 
-* [`6.0.15`, `6.0`, `6`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v6.0.15/packages/app/docker/Dockerfile)
+* [`6.0.15`, `6.0`, `6`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v6.0.15/apps/app/docker/Dockerfile)
 * [`5.1.7`, `5.1`, `5`](https://github.com/weseek/growi/blob/v5.1.7/packages/app/docker/Dockerfile)
 * [`5.1.7-nocdn`, `5.1-nocdn`, `5-nocdn`](https://github.com/weseek/growi/blob/v5.1.7/packages/app/docker/Dockerfile)
 * [`4.5.23`, `4.5`, `4`, `latest` (Dockerfile)](https://github.com/weseek/growi/blob/v4.5.23/packages/app/docker/Dockerfile)

+ 0 - 0
packages/app/docker/codebuild/.terraform.lock.hcl → apps/app/docker/codebuild/.terraform.lock.hcl


+ 1 - 1
packages/app/docker/codebuild/buildspec.yml → apps/app/docker/codebuild/buildspec.yml

@@ -18,7 +18,7 @@ phases:
       - echo ${DOCKER_REGISTRY_ON_GITHUB_PAT} | docker login ghcr.io --username wsmoogle --password-stdin
   build:
     commands:
-      - docker build -t ${IMAGE_TAG} -f ./packages/app/docker/Dockerfile .
+      - docker build -t ${IMAGE_TAG} -f ./apps/app/docker/Dockerfile .
       - docker tag ${IMAGE_TAG} ${IMAGE_TAG_GHCR}
 
   post_build:

+ 1 - 1
packages/app/docker/codebuild/codebuild.tf → apps/app/docker/codebuild/codebuild.tf

@@ -11,7 +11,7 @@ module "codebuild" {
   source_version      = "refs/heads/master"
   git_clone_depth     = 1
 
-  buildspec           = "packages/app/docker/codebuild/buildspec.yml"
+  buildspec           = "apps/app/docker/codebuild/buildspec.yml"
 
   # https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-available.html
   build_image         = "aws/codebuild/amazonlinux2-x86_64-standard:3.0"

+ 0 - 0
packages/app/docker/codebuild/main.tf → apps/app/docker/codebuild/main.tf


+ 0 - 0
packages/app/docker/codebuild/oidc.tf → apps/app/docker/codebuild/oidc.tf


+ 0 - 0
packages/app/docker/codebuild/secretsmanager.tf → apps/app/docker/codebuild/secretsmanager.tf


+ 0 - 0
packages/app/docker/docker-entrypoint.sh → apps/app/docker/docker-entrypoint.sh


+ 15 - 12
packages/app/jest.config.js → apps/app/jest.config.js

@@ -1,30 +1,29 @@
 // For a detailed explanation regarding each configuration property, visit:
 // https://jestjs.io/docs/en/configuration.html
-// https://kulshekhar.github.io/ts-jest/user/config/
 
 const MODULE_NAME_MAPPING = {
   '^\\^/(.+)$': '<rootDir>/$1',
   '^~/(.+)$': '<rootDir>/src/$1',
-  '^@growi/([^/]+)$': '<rootDir>/../$1/src',
-  '^@growi/([^/]+)/(.+)$': '<rootDir>/../$1/src/$2',
+  '^@growi/codemirror-textlint$': '<rootDir>/../../packages/codemirror-textlint/src',
+  '^@growi/remark-drawio$': '<rootDir>/../../packages/remark-drawio/src',
+  '^@growi/remark-growi-directive$': '<rootDir>/../../packages/remark-growi-directive/src',
 };
 
 module.exports = {
   // Indicates whether each individual test should be reported during the run
   verbose: true,
 
-  preset: 'ts-jest/presets/js-with-ts',
+  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
 
   projects: [
     {
       displayName: 'unit',
 
-      preset: 'ts-jest/presets/js-with-ts',
-
-      // transform ESM to CJS
-      transformIgnorePatterns: [
-        '/node_modules/(?!remark-gfm)/',
-      ],
+      transform: {
+        '^.+\\.(t|j)sx?$': '@swc/jest',
+      },
+      // transform ESM to CJS (includes all packages in node_modules)
+      transformIgnorePatterns: [],
 
       rootDir: '.',
       roots: ['<rootDir>'],
@@ -40,7 +39,9 @@ module.exports = {
     {
       displayName: 'server',
 
-      preset: 'ts-jest/presets/js-with-ts',
+      transform: {
+        '^.+\\.(t|j)sx?$': '@swc-node/jest',
+      },
 
       rootDir: '.',
       roots: ['<rootDir>'],
@@ -59,7 +60,9 @@ module.exports = {
     {
       displayName: 'server-v5',
 
-      preset: 'ts-jest/presets/js-with-ts',
+      transform: {
+        '^.+\\.(t|j)sx?$': '@swc-node/jest',
+      },
 
       rootDir: '.',
       roots: ['<rootDir>'],

+ 0 - 0
packages/app/next-env.d.ts → apps/app/next-env.d.ts


+ 19 - 10
packages/app/next.config.js → apps/app/next.config.js

@@ -5,23 +5,16 @@
  * See: https://github.com/vercel/next.js/discussions/35969#discussioncomment-2522954
  */
 
+const path = require('path');
+
 const { withSuperjson } = require('next-superjson');
 const { PHASE_PRODUCTION_BUILD, PHASE_PRODUCTION_SERVER } = require('next/constants');
 
 
 const getTranspilePackages = () => {
-  const eazyLogger = require('eazy-logger');
-  const { listScopedPackages, listPrefixedPackages } = require('./src/utils/next.config.utils');
-
-  // setup logger
-  const logger = eazyLogger.Logger({
-    prefix: '[{green:next.config.js}] ',
-    useLevelPrefixes: false,
-  });
+  const { listPrefixedPackages } = require('./src/utils/next.config.utils');
 
-  // define transpiled packages for '@growi/*'
   const packages = [
-    ...listScopedPackages(['@growi'], { ignorePackageNames: ['@growi/app'] }),
     // listing ESM packages until experimental.esmExternals works correctly to avoid ERR_REQUIRE_ESM
     'react-markdown',
     'unified',
@@ -29,6 +22,7 @@ const getTranspilePackages = () => {
     'character-entities-html4',
     'comma-separated-tokens',
     'decode-named-character-reference',
+    'escape-string-regexp',
     'hastscript',
     'html-void-elements',
     'is-absolute-url',
@@ -49,6 +43,11 @@ const getTranspilePackages = () => {
     ...listPrefixedPackages(['remark-', 'rehype-', 'hast-', 'mdast-', 'micromark-', 'unist-']),
   ];
 
+  // const eazyLogger = require('eazy-logger');
+  // const logger = eazyLogger.Logger({
+  //   prefix: '[{green:next.config.js}] ',
+  //   useLevelPrefixes: false,
+  // });
   // logger.info('{bold:Listing scoped packages for transpiling:}');
   // logger.unprefixed('info', `{grey:${JSON.stringify(packages, null, 2)}}`);
 
@@ -92,6 +91,16 @@ module.exports = async(phase, { defaultConfig }) => {
       config.externals.push('dtrace-provider');
       config.externals.push('mongoose');
 
+      // extract sourcemap
+      if (options.dev) {
+        config.module.rules.push({
+          test: /.(c|m)?js$/,
+          exclude: [/node_modules/, path.resolve(__dirname)],
+          enforce: 'pre',
+          use: ['source-map-loader'],
+        });
+      }
+
       // setup i18next-hmr
       if (!options.isServer && options.dev) {
         const { I18NextHMRPlugin } = require('i18next-hmr/plugin');

+ 15 - 20
packages/app/package.json → apps/app/package.json

@@ -7,48 +7,43 @@
     "build": "run-p build:*",
     "start": "yarn next start",
     "build:client": "yarn next build",
-    "prebuild:client": "tsc -p tsconfig.build.next.config.json",
     "build:server": "yarn cross-env NODE_ENV=production tsc -p tsconfig.build.server.json && tsc-alias -p tsconfig.build.server-tsc-alias.json",
-    "postbuild:server": "npx -y shx echo \"Listing files under transpiled\" && npx -y shx ls transpiled && npx -y shx mv transpiled/src dist && npx -y shx cp -r transpiled/config/* config && npx -y shx rm -rf transpiled",
+    "postbuild:server": "npx -y shx echo \"Listing files under transpiled\" && npx -y shx ls transpiled && npx -y shx rm -rf dist && npx -y shx mv transpiled/src dist && npx -y shx rm -rf transpiled",
     "clean": "npx -y shx rm -rf dist transpiled",
-    "prebuild": "yarn cross-env NODE_ENV=production run-p clean resources:*",
     "server": "yarn cross-env NODE_ENV=production node -r dotenv-flow/config dist/server/app.js",
     "server:ci": "yarn server --ci",
     "preserver": "yarn cross-env NODE_ENV=production yarn migrate",
+    "styles-prebuilt": "vite build -c vite.styles-prebuilt.config.ts",
     "migrate": "node -r dotenv-flow/config node_modules/.bin/migrate-mongo up -f config/migrate-mongo-config.js",
     "//// for development": "",
-    "dev": "yarn cross-env NODE_ENV=development ts-node-dev -r tsconfig-paths/register -r dotenv-flow/config --inspect --transpile-only src/server/app.ts",
-    "predev": "yarn cross-env NODE_ENV=development run-p resources:* dev:migrate:up",
+    "dev": "yarn cross-env NODE_ENV=development yarn ts-node-dev --inspect --transpile-only src/server/app.ts",
+    "dev:styles-prebuilt": "yarn styles-prebuilt --mode dev",
     "dev:analyze": "yarn cross-env ANALYZE=true yarn dev",
     "dev:migrate-mongo": "yarn cross-env NODE_ENV=development yarn ts-node node_modules/.bin/migrate-mongo",
-    "dev:migrate": "yarn dev:migrate:up",
+    "dev:migrate": "yarn dev:migrate:status > tmp/cache/migration-status.out && yarn dev:migrate:up",
     "dev:migrate:create": "yarn dev:migrate-mongo create -f config/migrate-mongo-config.js",
     "dev:migrate:status": "yarn dev:migrate-mongo status -f config/migrate-mongo-config.js",
     "dev:migrate:up": "yarn dev:migrate-mongo up -f config/migrate-mongo-config.js",
     "dev:migrate:down": "yarn dev:migrate-mongo down -f config/migrate-mongo-config.js",
     "cy:run": "cypress run --browser chrome",
     "//// for CI": "",
-    "dev:ci": "yarn dev --ci",
-    "predev:ci": "run-p resources:*",
+    "dev:ci": "yarn cross-env NODE_ENV=development yarn ts-node src/server/app.ts --ci",
     "lint:typecheck": "npx -y tsc",
-    "lint:eslint": "eslint --quiet \"**/*.{js,jsx,ts,tsx}\"",
+    "lint:eslint": "yarn eslint --quiet \"**/*.{js,jsx,ts,tsx}\"",
     "lint:styles": "stylelint src/**/*.scss",
     "lint:swagger2openapi": "node node_modules/.bin/oas-validate tmp/swagger.json",
     "lint": "run-p lint:*",
-    "test": "cross-env NODE_ENV=test jest --passWithNoTests -- ",
-    "test:ci": "cross-env NODE_ENV=test jest",
-    "// prelint:eslint": "yarn resources:plugin",
     "prelint:swagger2openapi": "yarn openapi:v3",
+    "test": "cross-env NODE_ENV=test NODE_OPTIONS=\"--max-old-space-size=4096\" jest --logHeapUsage",
+    "jest:run": "cross-env NODE_ENV=test jest --passWithNoTests -- ",
     "reg:run": "reg-suit run",
     "//// misc": "",
     "console": "yarn cross-env NODE_ENV=development yarn ts-node --experimental-repl-await src/server/console.js",
     "swagger-jsdoc": "swagger-jsdoc -o tmp/swagger.json -d config/swagger-definition.js",
     "openapi:v3": "yarn cross-env API_VERSION=3 yarn swagger-jsdoc -- \"src/server/routes/apiv3/**/*.js\" \"src/server/models/**/*.js\"",
     "openapi:v1": "yarn cross-env API_VERSION=1 yarn swagger-jsdoc -- \"src/server/*/*.js\" \"src/server/models/**/*.js\"",
-    "resources:hackmd": "yarn lerna run build --scope=@growi/hackmd",
-    "resources:preset-themes": "yarn lerna run dev:nowatch --scope=@growi/preset-themes",
-    "// resources:dl-resources": "yarn ts-node bin/download-cdn-resources.ts",
-    "ts-node": "node -r ts-node/register -r tsconfig-paths/register -r dotenv-flow/config"
+    "ts-node": "node -r ts-node/register -r tsconfig-paths/register -r dotenv-flow/config",
+    "ts-node-dev": "ts-node-dev -r tsconfig-paths/register -r dotenv-flow/config"
   },
   "// comments for dependencies": {
     "escape-string-regexp": "5.0.0 or above exports only ESM",
@@ -86,7 +81,7 @@
     "axios-retry": "^3.2.4",
     "body-parser": "^1.18.2",
     "browser-bunyan": "^1.8.0",
-    "bson-objectid": "^2.0.3",
+    "bson-objectid": "^2.0.4",
     "bunyan": "^1.8.15",
     "check-node-version": "^4.1.0",
     "compression": "^1.7.4",
@@ -103,7 +98,7 @@
     "diff_match_patch": "^0.1.1",
     "ejs": "^3.1.8",
     "esa-node": "^0.2.2",
-    "escape-string-regexp": "=4.0.0",
+    "escape-string-regexp": "^4.0.0",
     "eslint-plugin-regex": "^1.8.0",
     "expose-gc": "^1.0.0",
     "express": "^4.16.1",
@@ -142,7 +137,7 @@
     "nocache": "^3.0.1",
     "nodemailer": "^6.6.2",
     "nodemailer-ses-transport": "~1.5.0",
-    "openid-client": "^5.1.2",
+    "openid-client": "^5.4.0",
     "p-retry": "^4.0.0",
     "passport": "^0.6.0",
     "passport-github": "^1.1.0",
@@ -247,8 +242,8 @@
     "simple-load-script": "^1.0.2",
     "simplebar-react": "^2.3.6",
     "socket.io-client": "^4.2.0",
+    "source-map-loader": "^4.0.1",
     "swagger2openapi": "^5.3.1",
-    "ts-node-dev": "^2.0.0",
     "tsc-alias": "^1.2.9"
   }
 }

+ 0 - 0
packages/app/public/favicon.ico → apps/app/public/favicon.ico


+ 0 - 0
packages/app/public/images/customize-settings/default-dark.svg → apps/app/public/images/customize-settings/default-dark.svg


+ 0 - 0
packages/app/public/images/customize-settings/default-light.svg → apps/app/public/images/customize-settings/default-light.svg


+ 0 - 0
packages/app/public/images/customize-settings/dock-dark.svg → apps/app/public/images/customize-settings/dock-dark.svg


+ 0 - 0
packages/app/public/images/customize-settings/dock-light.svg → apps/app/public/images/customize-settings/dock-light.svg


+ 0 - 0
packages/app/public/images/customize-settings/drawer-dark.svg → apps/app/public/images/customize-settings/drawer-dark.svg


+ 0 - 0
packages/app/public/images/customize-settings/drawer-light.svg → apps/app/public/images/customize-settings/drawer-light.svg


+ 0 - 0
packages/app/public/images/customize-settings/fluid-dark.svg → apps/app/public/images/customize-settings/fluid-dark.svg


+ 0 - 0
packages/app/public/images/customize-settings/fluid-light.svg → apps/app/public/images/customize-settings/fluid-light.svg


+ 0 - 0
packages/app/public/images/file-not-found.png → apps/app/public/images/file-not-found.png


+ 0 - 0
packages/app/public/images/icons/editor/bold.svg → apps/app/public/images/icons/editor/bold.svg


+ 0 - 0
packages/app/public/images/icons/editor/check.svg → apps/app/public/images/icons/editor/check.svg


+ 0 - 0
packages/app/public/images/icons/editor/code.svg → apps/app/public/images/icons/editor/code.svg


+ 0 - 0
packages/app/public/images/icons/editor/header.svg → apps/app/public/images/icons/editor/header.svg


+ 0 - 0
packages/app/public/images/icons/editor/italic.svg → apps/app/public/images/icons/editor/italic.svg


+ 0 - 0
packages/app/public/images/icons/editor/link.svg → apps/app/public/images/icons/editor/link.svg


+ 0 - 0
packages/app/public/images/icons/editor/list-ol.svg → apps/app/public/images/icons/editor/list-ol.svg


+ 0 - 0
packages/app/public/images/icons/editor/list-ul.svg → apps/app/public/images/icons/editor/list-ul.svg


+ 0 - 0
packages/app/public/images/icons/editor/picture.svg → apps/app/public/images/icons/editor/picture.svg


+ 0 - 0
packages/app/public/images/icons/editor/quote.svg → apps/app/public/images/icons/editor/quote.svg


+ 0 - 0
packages/app/public/images/icons/editor/strikethrough.svg → apps/app/public/images/icons/editor/strikethrough.svg


+ 0 - 0
packages/app/public/images/icons/editor/table.svg → apps/app/public/images/icons/editor/table.svg


+ 0 - 0
packages/app/public/images/icons/emacs.png → apps/app/public/images/icons/emacs.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-144x144.png → apps/app/public/images/icons/favicon/android-icon-144x144.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-192x192.png → apps/app/public/images/icons/favicon/android-icon-192x192.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-36x36.png → apps/app/public/images/icons/favicon/android-icon-36x36.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-48x48.png → apps/app/public/images/icons/favicon/android-icon-48x48.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-72x72.png → apps/app/public/images/icons/favicon/android-icon-72x72.png


+ 0 - 0
packages/app/public/images/icons/favicon/android-icon-96x96.png → apps/app/public/images/icons/favicon/android-icon-96x96.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-114x114.png → apps/app/public/images/icons/favicon/apple-icon-114x114.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-120x120.png → apps/app/public/images/icons/favicon/apple-icon-120x120.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-144x144.png → apps/app/public/images/icons/favicon/apple-icon-144x144.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-152x152.png → apps/app/public/images/icons/favicon/apple-icon-152x152.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-180x180.png → apps/app/public/images/icons/favicon/apple-icon-180x180.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-57x57.png → apps/app/public/images/icons/favicon/apple-icon-57x57.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-60x60.png → apps/app/public/images/icons/favicon/apple-icon-60x60.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-72x72.png → apps/app/public/images/icons/favicon/apple-icon-72x72.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-76x76.png → apps/app/public/images/icons/favicon/apple-icon-76x76.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon-precomposed.png → apps/app/public/images/icons/favicon/apple-icon-precomposed.png


+ 0 - 0
packages/app/public/images/icons/favicon/apple-icon.png → apps/app/public/images/icons/favicon/apple-icon.png


+ 0 - 0
packages/app/public/images/icons/favicon/browserconfig.xml → apps/app/public/images/icons/favicon/browserconfig.xml


+ 0 - 0
packages/app/public/images/icons/favicon/favicon-16x16.png → apps/app/public/images/icons/favicon/favicon-16x16.png


+ 0 - 0
packages/app/public/images/icons/favicon/favicon-32x32.png → apps/app/public/images/icons/favicon/favicon-32x32.png


+ 0 - 0
packages/app/public/images/icons/favicon/favicon-96x96.png → apps/app/public/images/icons/favicon/favicon-96x96.png


+ 0 - 0
packages/app/public/images/icons/favicon/manifest.json → apps/app/public/images/icons/favicon/manifest.json


+ 0 - 0
packages/app/public/images/icons/favicon/ms-icon-144x144.png → apps/app/public/images/icons/favicon/ms-icon-144x144.png


+ 0 - 0
packages/app/public/images/icons/favicon/ms-icon-150x150.png → apps/app/public/images/icons/favicon/ms-icon-150x150.png


+ 0 - 0
packages/app/public/images/icons/favicon/ms-icon-310x310.png → apps/app/public/images/icons/favicon/ms-icon-310x310.png


+ 0 - 0
packages/app/public/images/icons/favicon/ms-icon-70x70.png → apps/app/public/images/icons/favicon/ms-icon-70x70.png


+ 0 - 0
packages/app/public/images/icons/fx.svg → apps/app/public/images/icons/fx.svg


+ 0 - 0
packages/app/public/images/icons/slack/mark-color.svg → apps/app/public/images/icons/slack/mark-color.svg


+ 0 - 0
packages/app/public/images/icons/slack/mark-monochrome_black.svg → apps/app/public/images/icons/slack/mark-monochrome_black.svg


+ 0 - 0
packages/app/public/images/icons/slack/mark-monochrome_white.svg → apps/app/public/images/icons/slack/mark-monochrome_white.svg


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff