Jelajahi Sumber

Centralize prettier configuration to root level (#30501)

* Merge all .prettierignore files into top-level config

* Merge all .prettierrc files into top-level config

* Replace service-specific glob patterns in package.json format scripts with `prettier .`

* Add template files with Jinja2, Go template, envsubst, and Handlebars syntax to .prettierignore

* Ignore GitHub templates

* Ignore PUG templates to format them separately with `format:pug`

* Encourage double quotes for YAML, YML files

* Move prettier for PUG source format script to the root

* Move prettier for styles source format script to the root

* Remove prettier for jenkins files from web

* Remove prettier source format script from all services

* Make .prettierrc more readable

* Update format scripts by file type

* Organise `.prettierignore`

* Add `--cache` flag to prettier scripts for faster runs

* Format all files with prettier

* Format all or format services

* Remove `format`/`format:fix` scripts from services since now it runs from root `package.json`

* Avoid conlficts with yamllint configuration

* Remove `--cache` flag from prettier scripts

* Update all service Makefiles to use root-level prettier configuration

* Update all Jenkinsfile to use root-level prettier configuration

* Ignore auto-generated files by build_scripts

* Update package-lock.json

* Update root Makefile format targets

* Update SP Jenkinsfile format target

* Update E2E Makefile format script

* Udpate `format_js` to work in both local and CI env

* Add docker-mailtrap to .prettierignore

docker-mailtrap is a third-party git-ignored directory used for testing

* Added Docker env detection to prevent nested Docker spawning

* Ignore handlebars templates

* Add cryptographic files and test output to `.prettierignore`

* Add terraform modules to `.gitignore`

* Remove prettier-plugin-groovy

* Use npx directly instead of Docker for local formatting for faster formatting

* Auto-generate Makefiles

* Revert "Remove prettier-plugin-groovy"

This reverts commit 194a33589a2e1e4d2225d10c67e9f025e4222025.

* Mount monorepo root in RUN_LINT_FORMAT for prettier config access

* Prettier ignores all `node_modules` by default regardless of location

* Show only changed files in format output

* Ignore LICENSE files

* Enable prettier on rendered build_scripts outputs

* Ignoring all the template folders by prettier

* Remove the public/minjs entry since it does not exist

* Remove all non-existent paths

* Sync `.prettierignore` with ignored files by `.gitignore` and `.dockerignore` files

* Revert "Auto-generate Makefiles"

This reverts commit c0233e490de1bc95fe437219d65e0b66e0331ec9.

* Revert "Use npx directly instead of Docker for local formatting for faster formatting"

This reverts commit 1d2b2cf1a6c6974c76885852a90dd55e84167e41.

* Ignore dashboard JSON files

* Ignore files generated by bin/update_build_scripts

* Remove unsupported file types from `.prettierignore`

* Ignore test fixture generated files

* Ignore README file types by prettier

* Ignore generate snapshots by prettier

* Allow to format generated bin/update_build_scripts by prettier

* Ensure build script outputs prettier-compatible tsconfig.json

* Fix build script output to match prettier formatting
- Fix Jinja2 whitespace in docker-compose templates
- Change YAML quotes from single to double

* Don't read cryptographic files by prettier

* Ignore google verification files by prettier

* Revert npx prettier formatting

* Ignore domain verification files

* Show only changed files in format output

* Make `.github` prettier

* Allow all files to be formatted in jobs by prettier

* Allow server-ce/server-pro files to be formatted by prettier

* Ignore more folders in clsi, filestory, git-bridge by prettier

* Update build script with `RUN_LINTING_CI_MONOREPO`

* Ignore docker-mailtrap and downloads in server-ce by prettier

* Restore prettier configs and prettierignore for V1 since it has its own prettier (an older version)

* Source format

GitOrigin-RevId: 637adc3cc422d1f20c86d6ebc8ec514d60758287
Rebeka Dekany 6 bulan lalu
induk
melakukan
a648015db8
100 mengubah file dengan 549 tambahan dan 671 penghapusan
  1. 11 8
      .github/ISSUE_TEMPLATE/bug_report.md
  2. 2 2
      .github/PULL_REQUEST_TEMPLATE.md
  3. 5 10
      CONTRIBUTING.md
  4. 0 1
      README.md
  5. 7 6
      develop/docker-compose.yml
  6. 21 21
      docker-compose.debug.yml
  7. 148 150
      docker-compose.yml
  8. 1 3
      libraries/access-token-encryptor/package.json
  9. 1 5
      libraries/access-token-encryptor/tsconfig.json
  10. 1 3
      libraries/eslint-plugin/tsconfig.json
  11. 1 3
      libraries/fetch-utils/package.json
  12. 1 5
      libraries/fetch-utils/tsconfig.json
  13. 2 3
      libraries/logger/CHANGELOG.md
  14. 1 3
      libraries/logger/package.json
  15. 1 5
      libraries/logger/tsconfig.json
  16. 2 2
      libraries/metrics/CHANGELOG.md
  17. 1 3
      libraries/metrics/package.json
  18. 1 5
      libraries/metrics/tsconfig.json
  19. 1 3
      libraries/mongo-utils/package.json
  20. 1 5
      libraries/mongo-utils/tsconfig.json
  21. 67 53
      libraries/o-error/README.md
  22. 1 3
      libraries/o-error/package.json
  23. 1 5
      libraries/o-error/tsconfig.json
  24. 0 1
      libraries/object-persistor/.prettierignore
  25. 3 3
      libraries/object-persistor/README.md
  26. 1 3
      libraries/object-persistor/package.json
  27. 1 5
      libraries/object-persistor/tsconfig.json
  28. 1 3
      libraries/overleaf-editor-core/package.json
  29. 1 5
      libraries/overleaf-editor-core/tsconfig.json
  30. 1 3
      libraries/promise-utils/package.json
  31. 1 5
      libraries/promise-utils/tsconfig.json
  32. 1 3
      libraries/ranges-tracker/package.json
  33. 1 5
      libraries/ranges-tracker/tsconfig.json
  34. 1 3
      libraries/redis-wrapper/package.json
  35. 1 5
      libraries/redis-wrapper/tsconfig.json
  36. 3 5
      libraries/settings/README.md
  37. 1 3
      libraries/settings/package.json
  38. 1 5
      libraries/settings/tsconfig.json
  39. 1 3
      libraries/stream-utils/package.json
  40. 1 5
      libraries/stream-utils/tsconfig.json
  41. 1 3
      libraries/validation-tools/package.json
  42. 1 5
      libraries/validation-tools/tsconfig.json
  43. 1 1
      package-lock.json
  44. 9 4
      package.json
  45. 22 23
      server-ce/cloudbuild.public.yaml
  46. 6 6
      server-ce/test/docker-compose.native.yml
  47. 16 16
      server-ce/test/docker-compose.yml
  48. 0 2
      server-ce/test/package.json
  49. 5 6
      services/chat/Makefile
  50. 2 4
      services/chat/README.md
  51. 56 56
      services/chat/chat.yaml
  52. 1 2
      services/chat/docker-compose.ci.yml
  53. 0 1
      services/chat/docker-compose.yml
  54. 0 2
      services/chat/package.json
  55. 5 6
      services/clsi/Makefile
  56. 0 2
      services/clsi/docker-compose.ci.yml
  57. 0 1
      services/clsi/docker-compose.yml
  58. 0 2
      services/clsi/package.json
  59. 1 1
      services/clsi/test/acceptance/fixtures/examples/draft_legacy/options.json
  60. 1 1
      services/clsi/test/acceptance/fixtures/examples/draft_mode/options.json
  61. 1 1
      services/clsi/test/acceptance/fixtures/examples/feynmp/options.json
  62. 1 1
      services/clsi/test/acceptance/fixtures/examples/fontawesome_xelatex/options.json
  63. 1 1
      services/clsi/test/acceptance/fixtures/examples/latex_compiler/options.json
  64. 1 1
      services/clsi/test/acceptance/fixtures/examples/lualatex_compiler/options.json
  65. 1 1
      services/clsi/test/acceptance/fixtures/examples/tikz_feynman/options.json
  66. 1 1
      services/clsi/test/acceptance/fixtures/examples/xelatex_compiler/options.json
  67. 5 6
      services/contacts/Makefile
  68. 2 4
      services/contacts/README.md
  69. 1 2
      services/contacts/docker-compose.ci.yml
  70. 0 1
      services/contacts/docker-compose.yml
  71. 0 2
      services/contacts/package.json
  72. 5 6
      services/docstore/Makefile
  73. 2 4
      services/docstore/README.md
  74. 2 2
      services/docstore/docker-compose.ci.yml
  75. 0 2
      services/docstore/package.json
  76. 5 6
      services/document-updater/Makefile
  77. 2 5
      services/document-updater/README.md
  78. 0 1
      services/document-updater/app/js/sharejs/README.md
  79. 0 4
      services/document-updater/app/js/sharejs/types/README.md
  80. 1 2
      services/document-updater/docker-compose.ci.yml
  81. 0 1
      services/document-updater/docker-compose.yml
  82. 0 2
      services/document-updater/package.json
  83. 0 1
      services/filestore/.prettierignore
  84. 5 6
      services/filestore/Makefile
  85. 10 12
      services/filestore/README.md
  86. 5 5
      services/filestore/docker-compose.ci.yml
  87. 4 3
      services/filestore/docker-compose.yml
  88. 0 2
      services/filestore/package.json
  89. 3 4
      services/git-bridge/README.md
  90. 28 28
      services/git-bridge/conf/example_config.json
  91. 5 6
      services/history-v1/Makefile
  92. 2 0
      services/history-v1/README.md
  93. 4 4
      services/history-v1/config/custom-environment-variables.json
  94. 4 4
      services/history-v1/config/development.json
  95. 4 4
      services/history-v1/config/test.json
  96. 6 5
      services/history-v1/docker-compose.ci.yml
  97. 4 3
      services/history-v1/docker-compose.yml
  98. 0 2
      services/history-v1/package.json
  99. 4 4
      services/history-v1/storage/scripts/global-blobs-db-cleanup/README.md
  100. 5 6
      services/notifications/Makefile

+ 11 - 8
.github/ISSUE_TEMPLATE/bug_report.md

@@ -4,7 +4,6 @@ about: Report a bug
 title: ''
 labels: type:bug
 assignees: ''
-
 ---
 
 <!--
@@ -18,11 +17,10 @@ Note: If you are using www.overleaf.com and have a problem,
 
 -->
 
-
-
 <!-- BUG REPORT TEMPLATE -->
 
 ## Steps to Reproduce
+
 <!-- Describe the steps leading up to when / where you found the bug. -->
 <!-- Screenshots may be helpful here. -->
 
@@ -31,23 +29,28 @@ Note: If you are using www.overleaf.com and have a problem,
 3.
 
 ## Expected Behaviour
+
 <!-- What should have happened when you completed the steps above? -->
 
 ## Observed Behaviour
+
 <!-- What actually happened when you completed the steps above? -->
 <!-- Screenshots may be helpful here. -->
 
 ## Context
+
 <!-- How has this issue affected you? What were you trying to accomplish? -->
 
 ## Technical Info
+
 <!-- Provide any technical details that may be applicable (or N/A if not applicable). -->
 
-* URL:
-* Browser Name and version:
-* Operating System and version (desktop or mobile):
-* Signed in as:
-* Project and/or file:
+- URL:
+- Browser Name and version:
+- Operating System and version (desktop or mobile):
+- Signed in as:
+- Project and/or file:
 
 ## Analysis
+
 <!--- Optionally, document investigation of / suggest a fix for the bug, e.g. 'comes from this line / commit' -->

+ 2 - 2
.github/PULL_REQUEST_TEMPLATE.md

@@ -1,10 +1,10 @@
 ## Description
-<!-- Goal of the pull request -->
 
+<!-- Goal of the pull request -->
 
 ## Related issues / Pull Requests
-<!-- Fixes #xyz, Contributes to #xyz, Related to #xyz-->
 
+<!-- Fixes #xyz, Contributes to #xyz, Related to #xyz-->
 
 ## Contributor Agreement
 

+ 5 - 10
CONTRIBUTING.md

@@ -1,11 +1,9 @@
-Contributing to Overleaf
-==========================
+# Contributing to Overleaf
 
 Thank you for reading this! If you'd like to report a bug or join in the development
 of Overleaf, then here are some notes on how to do that.
 
-Reporting bugs and opening issues
----------------------------------
+## Reporting bugs and opening issues
 
 If you'd like to report a bug or open an issue, please **[check if there is an existing issue](https://github.com/overleaf/overleaf/issues).**
 If there is then please add any more information that you have, or give it a 👍.
@@ -16,8 +14,7 @@ If you can include a screenshot for front end issues that is very helpful.
 
 **Note**: If you are using [www.overleaf.com](www.overleaf.com) and have a problem, or if you would like to request a new feature, please contact the Support team at support@overleaf.com. Raise an issue here only to report bugs in the Community Edition release of Overleaf.
 
-Pull Requests
--------------
+## Pull Requests
 
 See [our wiki](https://github.com/overleaf/overleaf/wiki)
 for how to manage the Overleaf development environment and for our developer guidelines.
@@ -28,13 +25,11 @@ to get your changes merged into Overleaf.
 
 If you're looking for something to work on, have a look at the [open issues](https://github.com/overleaf/overleaf/issues).
 
-Security
---------
+## Security
 
 Please see [our security policy](https://github.com/overleaf/overleaf/security/policy) if you would like to report a potential security vulnerability.
 
-Contributor License Agreement
------------------------------
+## Contributor License Agreement
 
 Before we can accept any contributions of code, we need you to agree to our
 [Contributor License Agreement](https://docs.google.com/forms/d/e/1FAIpQLSef79XH3mb7yIiMzZw-yALEegS-wyFetvjTiNBfZvf_IHD2KA/viewform?usp=sf_link).

+ 0 - 1
README.md

@@ -65,7 +65,6 @@ in which to run the Overleaf services. Baseimage uses the `runit` service
 manager to manage services, and we add our init-scripts from the `server-ce/runit`
 folder.
 
-
 ## Contributing
 
 Please see the [CONTRIBUTING](CONTRIBUTING.md) file for information on contributing to the development of Overleaf.

+ 7 - 6
develop/docker-compose.yml

@@ -63,8 +63,8 @@ services:
       dockerfile: services/filestore/Dockerfile
     env_file:
       - dev.env
-#    environment:
-#      - ENABLE_CONVERSIONS=true
+    #    environment:
+    #      - ENABLE_CONVERSIONS=true
     volumes:
       - filestore-public-files:/overleaf/services/filestore/public_files
       - filestore-template-files:/overleaf/services/filestore/template_files
@@ -75,7 +75,7 @@ services:
       context: ..
       dockerfile: services/history-v1/Dockerfile
     env_file:
-        - dev.env
+      - dev.env
     environment:
       OVERLEAF_EDITOR_ANALYTICS_BUCKET: "/buckets/analytics"
       OVERLEAF_EDITOR_BLOBS_BUCKET: "/buckets/blobs"
@@ -84,7 +84,7 @@ services:
       OVERLEAF_EDITOR_ZIPS_BUCKET: "/buckets/zips"
       PERSISTOR_BACKEND: fs
     volumes:
-        - history-v1-buckets:/buckets
+      - history-v1-buckets:/buckets
 
   mongo:
     image: mongo:6.0
@@ -114,7 +114,7 @@ services:
       context: ..
       dockerfile: services/project-history/Dockerfile
     env_file:
-        - dev.env
+      - dev.env
 
   real-time:
     build:
@@ -166,7 +166,8 @@ services:
       context: ..
       dockerfile: services/web/Dockerfile
       target: webpack
-    command: ["npx", "webpack", "serve", "--config", "webpack.config.dev-env.js"]
+    command:
+      ["npx", "webpack", "serve", "--config", "webpack.config.dev-env.js"]
     ports:
       - "127.0.0.1:80:3808"
     volumes:

+ 21 - 21
docker-compose.debug.yml

@@ -1,23 +1,23 @@
-version: '2.2'
+version: "2.2"
 services:
-    sharelatex:
-        ports:
-            - 30000:30000
-            - 30150:30150
-            - 30120:30120
-            - 30050:30050
-            - 30420:30420
-            - 30030:30030
-            - 30160:30160
-            - 30360:30360
-            - 30130:30130
-            - 30100:30100
-            - 30540:30540
-            - 30640:30640
-            - 40000:40000
+  sharelatex:
+    ports:
+      - 30000:30000
+      - 30150:30150
+      - 30120:30120
+      - 30050:30050
+      - 30420:30420
+      - 30030:30030
+      - 30160:30160
+      - 30360:30360
+      - 30130:30130
+      - 30100:30100
+      - 30540:30540
+      - 30640:30640
+      - 40000:40000
 
-            # Server Pro
-            - 30070:30070
-            - 30400:30400
-        environment:
-            DEBUG_NODE: 'true'
+      # Server Pro
+      - 30070:30070
+      - 30400:30400
+    environment:
+      DEBUG_NODE: "true"

+ 148 - 150
docker-compose.yml

@@ -1,151 +1,149 @@
 services:
-    sharelatex:
-        restart: always
-        # Server Pro users:
-        # image: quay.io/sharelatex/sharelatex-pro
-        image: sharelatex/sharelatex
-        container_name: sharelatex
-        depends_on:
-            mongo:
-                condition: service_healthy
-            redis:
-                condition: service_started
-        ports:
-            - 80:80
-        stop_grace_period: 60s
-        volumes:
-            - ~/sharelatex_data:/var/lib/overleaf
-            ########################################################################
-            ####  Server Pro: Uncomment the following line to mount the docker  ####
-            ####             socket, required for Sibling Containers to work    ####
-            ########################################################################
-            # - /var/run/docker.sock:/var/run/docker.sock
-        environment:
-
-            OVERLEAF_APP_NAME: Overleaf Community Edition
-
-            OVERLEAF_MONGO_URL: mongodb://mongo/sharelatex
-
-            # Same property, unfortunately with different names in
-            # different locations
-            OVERLEAF_REDIS_HOST: redis
-            REDIS_HOST: redis
-
-            ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
-
-            # Enables Thumbnail generation using ImageMagick
-            ENABLE_CONVERSIONS: 'true'
-
-            # Disables email confirmation requirement
-            EMAIL_CONFIRMATION_DISABLED: 'true'
-
-            ## Set for SSL via nginx-proxy
-            #VIRTUAL_HOST: 103.112.212.22
-
-            # OVERLEAF_SITE_URL: http://overleaf.example.com
-            # OVERLEAF_NAV_TITLE: Overleaf Community Edition
-            # OVERLEAF_HEADER_IMAGE_URL: http://example.com/mylogo.png
-            # OVERLEAF_ADMIN_EMAIL: support@it.com
-
-            # OVERLEAF_LEFT_FOOTER: '[{"text": "Another page I want to link to can be found <a href=\"here\">here</a>"} ]'
-            # OVERLEAF_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'
-
-            # OVERLEAF_EMAIL_FROM_ADDRESS: "hello@example.com"
-
-            # OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID:
-            # OVERLEAF_EMAIL_AWS_SES_SECRET_KEY:
-
-            # OVERLEAF_EMAIL_SMTP_HOST: smtp.example.com
-            # OVERLEAF_EMAIL_SMTP_PORT: 587
-            # OVERLEAF_EMAIL_SMTP_SECURE: false
-            # OVERLEAF_EMAIL_SMTP_USER:
-            # OVERLEAF_EMAIL_SMTP_PASS:
-            # OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
-            # OVERLEAF_EMAIL_SMTP_IGNORE_TLS: false
-            # OVERLEAF_EMAIL_SMTP_NAME: '127.0.0.1'
-            # OVERLEAF_EMAIL_SMTP_LOGGER: true
-            # OVERLEAF_CUSTOM_EMAIL_FOOTER: "This system is run by department x"
-
-            # ENABLE_CRON_RESOURCE_DELETION: true
-
-            ################
-            ## Server Pro ##
-            ################
-
-            ## The Community Edition is intended for use in environments where all users are trusted and is not appropriate for
-            ## scenarios where isolation of users is required. Sandboxed Compiles are not available in the Community Edition,
-            ## so the following environment variables must be commented out to avoid compile issues.
-            ##
-            ## Sandboxed Compiles: https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/server-pro-only-configuration/sandboxed-compiles
-            SANDBOXED_COMPILES: 'true'
-            ### Bind-mount source for /var/lib/overleaf/data/compiles inside the container.
-            SANDBOXED_COMPILES_HOST_DIR_COMPILES: '/home/user/sharelatex_data/data/compiles'
-            ### Bind-mount source for /var/lib/overleaf/data/output inside the container.
-            SANDBOXED_COMPILES_HOST_DIR_OUTPUT: '/home/user/sharelatex_data/data/output'
-            ### Backwards compatibility (before Server Pro 5.5)
-            DOCKER_RUNNER: 'true'
-            SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
-
-            ## Works with test LDAP server shown at bottom of docker compose
-            # OVERLEAF_LDAP_URL: 'ldap://ldap:389'
-            # OVERLEAF_LDAP_SEARCH_BASE: 'ou=people,dc=planetexpress,dc=com'
-            # OVERLEAF_LDAP_SEARCH_FILTER: '(uid={{username}})'
-            # OVERLEAF_LDAP_BIND_DN: 'cn=admin,dc=planetexpress,dc=com'
-            # OVERLEAF_LDAP_BIND_CREDENTIALS: 'GoodNewsEveryone'
-            # OVERLEAF_LDAP_EMAIL_ATT: 'mail'
-            # OVERLEAF_LDAP_NAME_ATT: 'cn'
-            # OVERLEAF_LDAP_LAST_NAME_ATT: 'sn'
-            # OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN: 'true'
-
-            # OVERLEAF_TEMPLATES_USER_ID: "578773160210479700917ee5"
-            # OVERLEAF_NEW_PROJECT_TEMPLATE_LINKS: '[ {"name":"All Templates","url":"/templates/all"}]'
-
-
-            # OVERLEAF_PROXY_LEARN: "true"
-
-    mongo:
-        restart: always
-        image: mongo:6.0
-        container_name: mongo
-        command: '--replSet overleaf'
-        volumes:
-            - ~/mongo_data:/data/db
-            - ./bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
-        environment:
-          MONGO_INITDB_DATABASE: sharelatex
-        extra_hosts:
-          # Required when using the automatic database setup for initializing the replica set.
-          # This override is not needed when running the setup after starting up mongo.
-          - mongo:127.0.0.1
-        healthcheck:
-            test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
-            interval: 10s
-            timeout: 10s
-            retries: 5
-
-    redis:
-        restart: always
-        image: redis:6.2
-        container_name: redis
-        volumes:
-            - ~/redis_data:/data
-
-    # ldap:
-    #    restart: always
-    #    image: rroemhild/test-openldap
-    #    container_name: ldap
-
-    # See https://github.com/jwilder/nginx-proxy for documentation on how to configure the nginx-proxy container,
-    # and https://github.com/overleaf/overleaf/wiki/HTTPS-reverse-proxy-using-Nginx for an example of some recommended
-    # settings. We recommend using a properly managed nginx instance outside of the Overleaf Server Pro setup,
-    # but the example here can be used if you'd prefer to run everything with docker-compose
-
-    # nginx-proxy:
-    #     image: jwilder/nginx-proxy
-    #     container_name: nginx-proxy
-    #     ports:
-    #       - "80:80"
-    #       - "443:443"
-    #     volumes:
-    #       - /var/run/docker.sock:/tmp/docker.sock:ro
-    #       - /home/overleaf/tmp:/etc/nginx/certs
+  sharelatex:
+    restart: always
+    # Server Pro users:
+    # image: quay.io/sharelatex/sharelatex-pro
+    image: sharelatex/sharelatex
+    container_name: sharelatex
+    depends_on:
+      mongo:
+        condition: service_healthy
+      redis:
+        condition: service_started
+    ports:
+      - 80:80
+    stop_grace_period: 60s
+    volumes:
+      - ~/sharelatex_data:/var/lib/overleaf
+      ########################################################################
+      ####  Server Pro: Uncomment the following line to mount the docker  ####
+      ####             socket, required for Sibling Containers to work    ####
+      ########################################################################
+      # - /var/run/docker.sock:/var/run/docker.sock
+    environment:
+      OVERLEAF_APP_NAME: Overleaf Community Edition
+
+      OVERLEAF_MONGO_URL: mongodb://mongo/sharelatex
+
+      # Same property, unfortunately with different names in
+      # different locations
+      OVERLEAF_REDIS_HOST: redis
+      REDIS_HOST: redis
+
+      ENABLED_LINKED_FILE_TYPES: "project_file,project_output_file"
+
+      # Enables Thumbnail generation using ImageMagick
+      ENABLE_CONVERSIONS: "true"
+
+      # Disables email confirmation requirement
+      EMAIL_CONFIRMATION_DISABLED: "true"
+
+      ## Set for SSL via nginx-proxy
+      #VIRTUAL_HOST: 103.112.212.22
+
+      # OVERLEAF_SITE_URL: http://overleaf.example.com
+      # OVERLEAF_NAV_TITLE: Overleaf Community Edition
+      # OVERLEAF_HEADER_IMAGE_URL: http://example.com/mylogo.png
+      # OVERLEAF_ADMIN_EMAIL: support@it.com
+
+      # OVERLEAF_LEFT_FOOTER: '[{"text": "Another page I want to link to can be found <a href=\"here\">here</a>"} ]'
+      # OVERLEAF_RIGHT_FOOTER: '[{"text": "Hello I am on the Right"} ]'
+
+      # OVERLEAF_EMAIL_FROM_ADDRESS: "hello@example.com"
+
+      # OVERLEAF_EMAIL_AWS_SES_ACCESS_KEY_ID:
+      # OVERLEAF_EMAIL_AWS_SES_SECRET_KEY:
+
+      # OVERLEAF_EMAIL_SMTP_HOST: smtp.example.com
+      # OVERLEAF_EMAIL_SMTP_PORT: 587
+      # OVERLEAF_EMAIL_SMTP_SECURE: false
+      # OVERLEAF_EMAIL_SMTP_USER:
+      # OVERLEAF_EMAIL_SMTP_PASS:
+      # OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH: true
+      # OVERLEAF_EMAIL_SMTP_IGNORE_TLS: false
+      # OVERLEAF_EMAIL_SMTP_NAME: '127.0.0.1'
+      # OVERLEAF_EMAIL_SMTP_LOGGER: true
+      # OVERLEAF_CUSTOM_EMAIL_FOOTER: "This system is run by department x"
+
+      # ENABLE_CRON_RESOURCE_DELETION: true
+
+      ################
+      ## Server Pro ##
+      ################
+
+      ## The Community Edition is intended for use in environments where all users are trusted and is not appropriate for
+      ## scenarios where isolation of users is required. Sandboxed Compiles are not available in the Community Edition,
+      ## so the following environment variables must be commented out to avoid compile issues.
+      ##
+      ## Sandboxed Compiles: https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/server-pro-only-configuration/sandboxed-compiles
+      SANDBOXED_COMPILES: "true"
+      ### Bind-mount source for /var/lib/overleaf/data/compiles inside the container.
+      SANDBOXED_COMPILES_HOST_DIR_COMPILES: "/home/user/sharelatex_data/data/compiles"
+      ### Bind-mount source for /var/lib/overleaf/data/output inside the container.
+      SANDBOXED_COMPILES_HOST_DIR_OUTPUT: "/home/user/sharelatex_data/data/output"
+      ### Backwards compatibility (before Server Pro 5.5)
+      DOCKER_RUNNER: "true"
+      SANDBOXED_COMPILES_SIBLING_CONTAINERS: "true"
+
+      ## Works with test LDAP server shown at bottom of docker compose
+      # OVERLEAF_LDAP_URL: 'ldap://ldap:389'
+      # OVERLEAF_LDAP_SEARCH_BASE: 'ou=people,dc=planetexpress,dc=com'
+      # OVERLEAF_LDAP_SEARCH_FILTER: '(uid={{username}})'
+      # OVERLEAF_LDAP_BIND_DN: 'cn=admin,dc=planetexpress,dc=com'
+      # OVERLEAF_LDAP_BIND_CREDENTIALS: 'GoodNewsEveryone'
+      # OVERLEAF_LDAP_EMAIL_ATT: 'mail'
+      # OVERLEAF_LDAP_NAME_ATT: 'cn'
+      # OVERLEAF_LDAP_LAST_NAME_ATT: 'sn'
+      # OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN: 'true'
+
+      # OVERLEAF_TEMPLATES_USER_ID: "578773160210479700917ee5"
+      # OVERLEAF_NEW_PROJECT_TEMPLATE_LINKS: '[ {"name":"All Templates","url":"/templates/all"}]'
+
+      # OVERLEAF_PROXY_LEARN: "true"
+
+  mongo:
+    restart: always
+    image: mongo:6.0
+    container_name: mongo
+    command: "--replSet overleaf"
+    volumes:
+      - ~/mongo_data:/data/db
+      - ./bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+    environment:
+      MONGO_INITDB_DATABASE: sharelatex
+    extra_hosts:
+      # Required when using the automatic database setup for initializing the replica set.
+      # This override is not needed when running the setup after starting up mongo.
+      - mongo:127.0.0.1
+    healthcheck:
+      test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
+      interval: 10s
+      timeout: 10s
+      retries: 5
+
+  redis:
+    restart: always
+    image: redis:6.2
+    container_name: redis
+    volumes:
+      - ~/redis_data:/data
+
+  # ldap:
+  #    restart: always
+  #    image: rroemhild/test-openldap
+  #    container_name: ldap
+
+  # See https://github.com/jwilder/nginx-proxy for documentation on how to configure the nginx-proxy container,
+  # and https://github.com/overleaf/overleaf/wiki/HTTPS-reverse-proxy-using-Nginx for an example of some recommended
+  # settings. We recommend using a properly managed nginx instance outside of the Overleaf Server Pro setup,
+  # but the example here can be used if you'd prefer to run everything with docker-compose
+
+  # nginx-proxy:
+  #     image: jwilder/nginx-proxy
+  #     container_name: nginx-proxy
+  #     ports:
+  #       - "80:80"
+  #       - "443:443"
+  #     volumes:
+  #       - /var/run/docker.sock:/tmp/docker.sock:ro
+  #       - /home/overleaf/tmp:/etc/nginx/certs

+ 1 - 3
libraries/access-token-encryptor/package.json

@@ -4,11 +4,9 @@
   "description": "",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/access-token-encryptor/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/eslint-plugin/tsconfig.json

@@ -1,6 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-  ]
+  "include": ["**/*.js"]
 }

+ 1 - 3
libraries/fetch-utils/package.json

@@ -4,11 +4,9 @@
   "description": "utilities for node-fetch",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/fetch-utils/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 2 - 3
libraries/logger/CHANGELOG.md

@@ -1,10 +1,9 @@
 ## v3.1.1
 
-* Handle malformed requests in the req serializer
+- Handle malformed requests in the req serializer
 
 ## v3.0.0
 
-* Improve logging in Google Cloud Platform. Set environment variable `GCP_LOGGING=true` to enable.
+- Improve logging in Google Cloud Platform. Set environment variable `GCP_LOGGING=true` to enable.
 
 This version of the metrics module only works with versions of the `@overleaf/metrics` module greater than v4.0.0
-

+ 1 - 3
libraries/logger/package.json

@@ -10,9 +10,7 @@
   "license": "AGPL-3.0-only",
   "version": "3.1.1",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
     "test:ci": "npm run test:unit",

+ 1 - 5
libraries/logger/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 2 - 2
libraries/metrics/CHANGELOG.md

@@ -1,9 +1,9 @@
 ## v4.1.0
 
-* Allows skipping the `sampleRate` argument.
+- Allows skipping the `sampleRate` argument.
 
 ## v4.0.0
 
-* Send unmodified request and response to logger.
+- Send unmodified request and response to logger.
 
 This version of the metrics module only works with versions of the `@overleaf/logger` module greater than v3.0.0

+ 1 - 3
libraries/metrics/package.json

@@ -35,9 +35,7 @@
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "test:acceptance": "mocha --recursive --exit --grep=$MOCHA_GREP test/acceptance",
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:ci": "npm run test:unit",
     "types:check": "tsc --noEmit"
   },

+ 1 - 5
libraries/metrics/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/mongo-utils/package.json

@@ -4,12 +4,10 @@
   "description": "utilities to help working with mongo",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "types:check": "tsc --noEmit"
   },

+ 1 - 5
libraries/mongo-utils/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 67 - 53
libraries/o-error/README.md

@@ -16,23 +16,23 @@ Light-weight helpers for handling JavaScript Errors in node.js and the browser.
 <!-- toc -->
 
 - [Long Stack Traces with `OError.tag`](#long-stack-traces-with-oerrortag)
-  * [The Problem](#the-problem)
-  * [The Solution](#the-solution)
-  * [Adding More Info](#adding-more-info)
-  * [`async`/`await`](#asyncawait)
-  * [Better Async Stack Traces in Node 12+](#better-async-stack-traces-in-node-12)
-  * [Caveat: Shared Error Instances](#caveat-shared-error-instances)
+  - [The Problem](#the-problem)
+  - [The Solution](#the-solution)
+  - [Adding More Info](#adding-more-info)
+  - [`async`/`await`](#asyncawait)
+  - [Better Async Stack Traces in Node 12+](#better-async-stack-traces-in-node-12)
+  - [Caveat: Shared Error Instances](#caveat-shared-error-instances)
 - [Create Custom Error Classes](#create-custom-error-classes)
-  * [Attaching Extra Info](#attaching-extra-info)
-  * [Wrapping an Internal Error](#wrapping-an-internal-error)
+  - [Attaching Extra Info](#attaching-extra-info)
+  - [Wrapping an Internal Error](#wrapping-an-internal-error)
 - [OError API Reference](#oerror-api-reference)
-  * [new OError(message, [info], [cause])](#new-oerrormessage-info-cause)
-  * [oError.withInfo(info) ⇒ this](#oerrorwithinfoinfo--this)
-  * [oError.withCause(cause) ⇒ this](#oerrorwithcausecause--this)
-  * [OError.maxTags : Number](#oerrormaxtags--number)
-  * [OError.tag(error, [message], [info]) ⇒ Error](#oerrortagerror-message-info--error)
-  * [OError.getFullInfo(error) ⇒ Object](#oerrorgetfullinfoerror--object)
-  * [OError.getFullStack(error) ⇒ string](#oerrorgetfullstackerror--string)
+  - [new OError(message, [info], [cause])](#new-oerrormessage-info-cause)
+  - [oError.withInfo(info) ⇒ this](#oerrorwithinfoinfo--this)
+  - [oError.withCause(cause) ⇒ this](#oerrorwithcausecause--this)
+  - [OError.maxTags : Number](#oerrormaxtags--number)
+  - [OError.tag(error, [message], [info]) ⇒ Error](#oerrortagerror-message-info--error)
+  - [OError.getFullInfo(error) ⇒ Object](#oerrorgetfullinfoerror--object)
+  - [OError.getFullStack(error) ⇒ string](#oerrorgetfullstackerror--string)
 - [References](#references)
 
 <!-- tocstop -->
@@ -345,52 +345,56 @@ caused by:
 ## OError API Reference
 
 <a name="OError"></a>
-* [OError](#OError)
-    * [new OError(message, [info], [cause])](#new_OError_new)
-    * _instance_
-        * [.withInfo(info)](#OError+withInfo) ⇒ <code>this</code>
-        * [.withCause(cause)](#OError+withCause) ⇒ <code>this</code>
-    * _static_
-        * [.maxTags](#OError.maxTags) : <code>Number</code>
-        * [.tag(error, [message], [info])](#OError.tag) ⇒ <code>Error</code>
-        * [.getFullInfo(error)](#OError.getFullInfo) ⇒ <code>Object</code>
-        * [.getFullStack(error)](#OError.getFullStack) ⇒ <code>string</code>
+
+- [OError](#OError)
+  - [new OError(message, [info], [cause])](#new_OError_new)
+  - _instance_
+    - [.withInfo(info)](#OError+withInfo) ⇒ <code>this</code>
+    - [.withCause(cause)](#OError+withCause) ⇒ <code>this</code>
+  - _static_
+    - [.maxTags](#OError.maxTags) : <code>Number</code>
+    - [.tag(error, [message], [info])](#OError.tag) ⇒ <code>Error</code>
+    - [.getFullInfo(error)](#OError.getFullInfo) ⇒ <code>Object</code>
+    - [.getFullStack(error)](#OError.getFullStack) ⇒ <code>string</code>
 
 <a name="new_OError_new"></a>
 
 ### new OError(message, [info], [cause])
 
-| Param | Type | Description |
-| --- | --- | --- |
-| message | <code>string</code> | as for built-in Error |
-| [info] | <code>Object</code> | extra data to attach to the error |
-| [cause] | <code>Error</code> | the internal error that caused this error |
+| Param   | Type                | Description                               |
+| ------- | ------------------- | ----------------------------------------- |
+| message | <code>string</code> | as for built-in Error                     |
+| [info]  | <code>Object</code> | extra data to attach to the error         |
+| [cause] | <code>Error</code>  | the internal error that caused this error |
 
 <a name="OError+withInfo"></a>
 
 ### oError.withInfo(info) ⇒ <code>this</code>
+
 Set the extra info object for this error.
 
-**Kind**: instance method of [<code>OError</code>](#OError)  
+**Kind**: instance method of [<code>OError</code>](#OError)
 
-| Param | Type | Description |
-| --- | --- | --- |
-| info | <code>Object</code> | extra data to attach to the error |
+| Param | Type                | Description                       |
+| ----- | ------------------- | --------------------------------- |
+| info  | <code>Object</code> | extra data to attach to the error |
 
 <a name="OError+withCause"></a>
 
 ### oError.withCause(cause) ⇒ <code>this</code>
+
 Wrap the given error, which caused this error.
 
-**Kind**: instance method of [<code>OError</code>](#OError)  
+**Kind**: instance method of [<code>OError</code>](#OError)
 
-| Param | Type | Description |
-| --- | --- | --- |
+| Param | Type               | Description                               |
+| ----- | ------------------ | ----------------------------------------- |
 | cause | <code>Error</code> | the internal error that caused this error |
 
 <a name="OError.maxTags"></a>
 
 ### OError.maxTags : <code>Number</code>
+
 Maximum number of tags to apply to any one error instance. This is to avoid
 a resource leak in the (hopefully unlikely) case that a singleton error
 instance is returned to many callbacks. If tags have been dropped, the full
@@ -402,19 +406,21 @@ Defaults to 100. Must be at least 1.
 <a name="OError.tag"></a>
 
 ### OError.tag(error, [message], [info]) ⇒ <code>Error</code>
+
 Tag debugging information onto any error (whether an OError or not) and
 return it.
 
 **Kind**: static method of [<code>OError</code>](#OError)  
-**Returns**: <code>Error</code> - the modified `error` argument  
+**Returns**: <code>Error</code> - the modified `error` argument
+
+| Param     | Type                | Description                         |
+| --------- | ------------------- | ----------------------------------- |
+| error     | <code>Error</code>  | the error to tag                    |
+| [message] | <code>string</code> | message with which to tag `error`   |
+| [info]    | <code>Object</code> | extra data with wich to tag `error` |
 
-| Param | Type | Description |
-| --- | --- | --- |
-| error | <code>Error</code> | the error to tag |
-| [message] | <code>string</code> | message with which to tag `error` |
-| [info] | <code>Object</code> | extra data with wich to tag `error` |
+**Example** _(An error in a callback)_
 
-**Example** *(An error in a callback)*  
 ```js
 function findUser(name, callback) {
   fs.readFile('/etc/passwd', (err, data) => {
@@ -423,13 +429,17 @@ function findUser(name, callback) {
   })
 }
 ```
-**Example** *(A possible error in a callback)*  
+
+**Example** _(A possible error in a callback)_
+
 ```js
 function cleanup(callback) {
-  fs.unlink('/tmp/scratch', (err) => callback(err && OError.tag(err)))
+  fs.unlink('/tmp/scratch', err => callback(err && OError.tag(err)))
 }
 ```
-**Example** *(An error with async/await)*  
+
+**Example** _(An error with async/await)_
+
 ```js
 async function cleanup() {
   try {
@@ -439,30 +449,34 @@ async function cleanup() {
   }
 }
 ```
+
 <a name="OError.getFullInfo"></a>
 
 ### OError.getFullInfo(error) ⇒ <code>Object</code>
+
 The merged info from any `tag`s and causes on the given error.
 
 If an info property is repeated, the last one wins.
 
-**Kind**: static method of [<code>OError</code>](#OError)  
+**Kind**: static method of [<code>OError</code>](#OError)
 
-| Param | Type | Description |
-| --- | --- | --- |
+| Param | Type                                                              | Description                               |
+| ----- | ----------------------------------------------------------------- | ----------------------------------------- |
 | error | <code>Error</code> \| <code>null</code> \| <code>undefined</code> | any error (may or may not be an `OError`) |
 
 <a name="OError.getFullStack"></a>
 
 ### OError.getFullStack(error) ⇒ <code>string</code>
+
 Return the `stack` property from `error`, including the `stack`s for any
 tagged errors added with `OError.tag` and for any `cause`s.
 
-**Kind**: static method of [<code>OError</code>](#OError)  
+**Kind**: static method of [<code>OError</code>](#OError)
 
-| Param | Type | Description |
-| --- | --- | --- |
+| Param | Type                                                              | Description                               |
+| ----- | ----------------------------------------------------------------- | ----------------------------------------- |
 | error | <code>Error</code> \| <code>null</code> \| <code>undefined</code> | any error (may or may not be an `OError`) |
+
 <!-- END API REFERENCE -->
 
 ## References

+ 1 - 3
libraries/o-error/package.json

@@ -20,9 +20,7 @@
     "build": "npm run --silent test",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/o-error/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 0 - 1
libraries/object-persistor/.prettierignore

@@ -1 +0,0 @@
-node_modules

+ 3 - 3
libraries/object-persistor/README.md

@@ -46,9 +46,9 @@ Uploads a stream to the backend.
 - `key`: The key for the uploaded object
 - `readStream`: The data stream to upload
 - `opts` (optional):
-    - `sourceMd5`: The md5 hash of the source data, if known. The uploaded data will be compared against this and the operation will fail if it does not match. If omitted, the md5 is calculated as the data is uploaded instead, and verified against the backend. This is not supported in `S3Persistor` as it performs [its own integrity protections](https://aws.amazon.com/blogs/aws/introducing-default-data-integrity-protections-for-new-objects-in-amazon-s3/). Setting `sourceMd5` with `S3Persistor` will result in an error being thrown.
-    - `contentType`: The content type to write in the object metadata
-    - `contentEncoding`: The content encoding to write in the object metadata
+  - `sourceMd5`: The md5 hash of the source data, if known. The uploaded data will be compared against this and the operation will fail if it does not match. If omitted, the md5 is calculated as the data is uploaded instead, and verified against the backend. This is not supported in `S3Persistor` as it performs [its own integrity protections](https://aws.amazon.com/blogs/aws/introducing-default-data-integrity-protections-for-new-objects-in-amazon-s3/). Setting `sourceMd5` with `S3Persistor` will result in an error being thrown.
+  - `contentType`: The content type to write in the object metadata
+  - `contentEncoding`: The content encoding to write in the object metadata
 
 ##### Notes
 

+ 1 - 3
libraries/object-persistor/package.json

@@ -4,12 +4,10 @@
   "description": "Module for storing objects in multiple backends, with fallback on 404 to assist migration between them",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "types:check": "tsc --noEmit"
   },

+ 1 - 5
libraries/object-persistor/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/overleaf-editor-core/package.json

@@ -4,9 +4,7 @@
   "description": "Library shared between the editor server and clients.",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
     "test:ci": "npm run test:unit",

+ 1 - 5
libraries/overleaf-editor-core/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/promise-utils/package.json

@@ -4,12 +4,10 @@
   "description": "utilities to help working with promises",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "types:check": "tsc --noEmit"
   },

+ 1 - 5
libraries/promise-utils/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/ranges-tracker/package.json

@@ -11,9 +11,7 @@
   "scripts": {
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/ranges-tracker/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/redis-wrapper/package.json

@@ -15,9 +15,7 @@
   "scripts": {
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/redis-wrapper/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 3 - 5
libraries/settings/README.md

@@ -1,16 +1,14 @@
-@overleaf/settings
-===================
+# @overleaf/settings
 
 A small module to allow global config settings to be set for all services
 within the Overleaf architecture.
 
-Settings file location
-----------------------
+## Settings file location
 
 You can specify a custom location for the settings file by setting the
 `OVERLEAF_CONFIG` environment variable. E.g.
 
-	$ export OVERLEAF_CONFIG=/home/james/config/settings.development.js
+    $ export OVERLEAF_CONFIG=/home/james/config/settings.development.js
 
 Otherwise, the settings will be loaded from `config/settings.NODE_ENV.js`,
 where `NODE_ENV` is another environment variable, or defaults to `development`.

+ 1 - 3
libraries/settings/package.json

@@ -7,9 +7,7 @@
   "scripts": {
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:ci": "npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "types:check": "tsc --noEmit"

+ 1 - 5
libraries/settings/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/stream-utils/package.json

@@ -4,12 +4,10 @@
   "description": "stream handling utilities",
   "main": "index.js",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "test:unit": "mocha --exit test/**/*.{js,cjs}",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
     "test:ci": "npm run test:unit",
     "types:check": "tsc --noEmit"
   },

+ 1 - 5
libraries/stream-utils/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 3
libraries/validation-tools/package.json

@@ -10,9 +10,7 @@
   "license": "AGPL-3.0-only",
   "version": "1.0.0",
   "scripts": {
-    "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
-    "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+    "test": "npm run lint && npm run types:check && npm run test:unit",
     "lint": "eslint --ext .cjs,.js,.jsx,.mjs,.ts --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix --ext .cjs,.js,.jsx,.mjs,.ts .",
     "test:ci": "npm run test:unit",

+ 1 - 5
libraries/validation-tools/tsconfig.json

@@ -1,8 +1,4 @@
 {
   "extends": "../../tsconfig.backend.json",
-  "include": [
-    "**/*.js",
-    "**/*.cjs",
-    "**/*.ts"
-  ]
+  "include": ["**/*.js", "**/*.cjs", "**/*.ts"]
 }

+ 1 - 1
package-lock.json

@@ -40,6 +40,7 @@
         "patch-package": "^8.0.0"
       },
       "devDependencies": {
+        "@prettier/plugin-pug": "^3.4.0",
         "@types/chai": "^4.3.0",
         "@types/chai-as-promised": "^7.1.8",
         "@types/mocha": "^10.0.6",
@@ -58397,7 +58398,6 @@
         "@pollyjs/adapter-node-http": "^6.0.6",
         "@pollyjs/core": "^6.0.6",
         "@pollyjs/persister-fs": "^6.0.6",
-        "@prettier/plugin-pug": "^3.4.0",
         "@replit/codemirror-emacs": "overleaf/codemirror-emacs#4394c03858f27053f8768258e9493866e06e938e",
         "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#371ce3b56f453a392eb0d3b85ab019c185c68e1f",
         "@replit/codemirror-vim": "overleaf/codemirror-vim#1bef138382d948018f3f9b8a4d7a70ab61774e4b",

+ 9 - 4
package.json

@@ -5,6 +5,7 @@
     "patch-package": "^8.0.0"
   },
   "devDependencies": {
+    "@prettier/plugin-pug": "^3.4.0",
     "@types/chai": "^4.3.0",
     "@types/chai-as-promised": "^7.1.8",
     "@types/mocha": "^10.0.6",
@@ -41,10 +42,14 @@
     }
   },
   "scripts": {
-    "format": "prettier --list-different $PWD/'**/*.js'",
-    "format:fix": "prettier --write $PWD/'**/*.js'",
-    "format:jenkins": "prettier --list-different $PWD/'**/Jenkinsfile'",
-    "format:jenkins:fix": "prettier --write $PWD/'**/Jenkinsfile'",
+    "format": "prettier --list-different",
+    "format:fix": "prettier --write --list-different",
+    "format:styles": "prettier --list-different '**/*.{css,scss}'",
+    "format:styles:fix": "prettier --write --list-different '**/*.{css,scss}'",
+    "format:pug": "prettier --list-different '**/*.pug'",
+    "format:pug:fix": "prettier --write --list-different '**/*.pug'",
+    "format:jenkins": "prettier --list-different '**/Jenkinsfile'",
+    "format:jenkins:fix": "prettier --write --list-different '**/Jenkinsfile'",
     "lint": "eslint --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix .",
     "postinstall": "patch-package"

+ 22 - 23
server-ce/cloudbuild.public.yaml

@@ -1,11 +1,10 @@
 ---
-
 steps:
   - id: build_base
     name: us-east1-docker.pkg.dev/overleaf-ops/ol-docker/cloud-builder
     dir: server-ce
     args:
-      - 'build-base'
+      - "build-base"
   - id: tag_main_latest_base
     name: gcr.io/cloud-builders/docker
     script: |
@@ -26,7 +25,7 @@ steps:
       exit 0
     automapSubstitutions: true
     waitFor:
-      - '-'
+      - "-"
   - id: build_community
     name: us-east1-docker.pkg.dev/overleaf-ops/ol-docker/cloud-builder
     dir: server-ce
@@ -51,27 +50,27 @@ timeout: 3600s
 options:
   machineType: E2_HIGHCPU_32
   env:
-    - 'BRANCH_NAME=${BRANCH_NAME}'
+    - "BRANCH_NAME=${BRANCH_NAME}"
     # docker build
-    - 'OVERLEAF_BASE_BRANCH=${_IMAGE_BASE_BRANCH}'
-    - 'OVERLEAF_BASE_LATEST=${_IMAGE_BASE_LATEST}'
-    - 'OVERLEAF_BASE_TAG=${_IMAGE_BASE}'
-    - 'OVERLEAF_BRANCH=${_IMAGE_TAG_BRANCH}'
-    - 'OVERLEAF_LATEST=${_IMAGE_TAG_LATEST}'
-    - 'OVERLEAF_TAG=${_IMAGE_TAG}'
+    - "OVERLEAF_BASE_BRANCH=${_IMAGE_BASE_BRANCH}"
+    - "OVERLEAF_BASE_LATEST=${_IMAGE_BASE_LATEST}"
+    - "OVERLEAF_BASE_TAG=${_IMAGE_BASE}"
+    - "OVERLEAF_BRANCH=${_IMAGE_TAG_BRANCH}"
+    - "OVERLEAF_LATEST=${_IMAGE_TAG_LATEST}"
+    - "OVERLEAF_TAG=${_IMAGE_TAG}"
 images:
-  - '${_IMAGE_BASE}'
-  - '${_IMAGE_BASE_BRANCH}'
-  - '${_IMAGE_TAG}'
-  - '${_IMAGE_TAG_BRANCH}'
+  - "${_IMAGE_BASE}"
+  - "${_IMAGE_BASE_BRANCH}"
+  - "${_IMAGE_TAG}"
+  - "${_IMAGE_TAG_BRANCH}"
 substitutions:
-  _IMAGE_BASE: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:${BRANCH_NAME}-${SHORT_SHA}_${BUILD_ID}'
-  _IMAGE_BASE_BRANCH: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:${BRANCH_NAME}'
-  _IMAGE_BASE_LATEST: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:latest'
-  _IMAGE_TAG_BRANCH: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:${BRANCH_NAME}'
-  _IMAGE_TAG_LATEST: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:latest'
-  _IMAGE_TAG: 'us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:${BRANCH_NAME}-${SHORT_SHA}_${BUILD_ID}'
+  _IMAGE_BASE: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:${BRANCH_NAME}-${SHORT_SHA}_${BUILD_ID}"
+  _IMAGE_BASE_BRANCH: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:${BRANCH_NAME}"
+  _IMAGE_BASE_LATEST: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf-base:latest"
+  _IMAGE_TAG_BRANCH: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:${BRANCH_NAME}"
+  _IMAGE_TAG_LATEST: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:latest"
+  _IMAGE_TAG: "us-east1-docker.pkg.dev/overleaf-ops/ol-docker/overleaf:${BRANCH_NAME}-${SHORT_SHA}_${BUILD_ID}"
 tags:
-  - 'overleaf-public'
-  - '${BRANCH_NAME}'
-  - '${SHORT_SHA}'
+  - "overleaf-public"
+  - "${BRANCH_NAME}"
+  - "${SHORT_SHA}"

+ 6 - 6
server-ce/test/docker-compose.native.yml

@@ -1,24 +1,24 @@
-version: '2.2'
+version: "2.2"
 services:
   sharelatex:
     ports:
       - "127.0.0.1:80:80"
     environment:
-      OVERLEAF_SITE_URL: 'http://localhost'
+      OVERLEAF_SITE_URL: "http://localhost"
 
   host-admin:
     ports:
       - "127.0.0.1:8081:80"
     environment:
-      NATIVE_CYPRESS: 'true'
-      ACCESS_CONTROL_ALLOW_ORIGIN: 'http://localhost'
+      NATIVE_CYPRESS: "true"
+      ACCESS_CONTROL_ALLOW_ORIGIN: "http://localhost"
 
   saml:
     ports:
       - 127.0.0.1:8082:80
     environment:
-      SAML_BASE_URL_PATH: 'http://localhost:8082/simplesaml/'
-      SAML_TEST_SP_LOCATION: 'http://localhost/saml/callback'
+      SAML_BASE_URL_PATH: "http://localhost:8082/simplesaml/"
+      SAML_TEST_SP_LOCATION: "http://localhost/saml/callback"
 
   mailtrap:
     ports:

+ 16 - 16
server-ce/test/docker-compose.yml

@@ -10,18 +10,18 @@ services:
       mailtrap:
         condition: service_started
     environment:
-      OVERLEAF_SITE_URL: 'http://sharelatex'
+      OVERLEAF_SITE_URL: "http://sharelatex"
       OVERLEAF_APP_NAME: E2E test
       OVERLEAF_MONGO_URL: mongodb://mongo/sharelatex?directConnection=true
       OVERLEAF_REDIS_HOST: redis
       REDIS_HOST: redis
-      OVERLEAF_EMAIL_FROM_ADDRESS: 'welcome@example.com'
-      OVERLEAF_EMAIL_SMTP_HOST: 'mailtrap'
-      OVERLEAF_EMAIL_SMTP_PORT: '25'
-      OVERLEAF_EMAIL_SMTP_IGNORE_TLS: 'true'
-      ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
-      ENABLE_CONVERSIONS: 'true'
-      EMAIL_CONFIRMATION_DISABLED: 'true'
+      OVERLEAF_EMAIL_FROM_ADDRESS: "welcome@example.com"
+      OVERLEAF_EMAIL_SMTP_HOST: "mailtrap"
+      OVERLEAF_EMAIL_SMTP_PORT: "25"
+      OVERLEAF_EMAIL_SMTP_IGNORE_TLS: "true"
+      ENABLED_LINKED_FILE_TYPES: "project_file,project_output_file"
+      ENABLE_CONVERSIONS: "true"
+      EMAIL_CONFIRMATION_DISABLED: "true"
     healthcheck:
       test: curl --fail http://localhost:3000/status
       interval: 3s
@@ -31,11 +31,11 @@ services:
   mailtrap:
     image: mailtrap
     environment:
-      MAILTRAP_PASSWORD: 'password-for-mailtrap'
+      MAILTRAP_PASSWORD: "password-for-mailtrap"
 
   mongo:
     image: mongo:8.0.11
-    command: '--replSet overleaf'
+    command: "--replSet overleaf"
     volumes:
       - ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
       - ../bin/shared/mongodb-docker-entrypoint-wait.sh:/mongodb-docker-entrypoint-wait.sh
@@ -129,9 +129,9 @@ services:
     restart: always
     image: us-east1-docker.pkg.dev/overleaf-ops/ol-docker/saml-test
     environment:
-      SAML_TEST_SP_ENTITY_ID: 'sharelatex-test-saml'
-      SAML_BASE_URL_PATH: 'http://saml/simplesaml/'
-      SAML_TEST_SP_LOCATION: 'http://sharelatex/saml/callback'
+      SAML_TEST_SP_ENTITY_ID: "sharelatex-test-saml"
+      SAML_BASE_URL_PATH: "http://saml/simplesaml/"
+      SAML_TEST_SP_LOCATION: "http://sharelatex/saml/callback"
 
   ldap:
     restart: always
@@ -140,6 +140,6 @@ services:
     # REF: https://github.com/moby/moby/issues/8231#issuecomment-63877553
     # REF: https://github.com/moby/moby/issues/8231#issuecomment-63871343
     command:
-      - 'bash'
-      - '-c'
-      - 'ulimit -n 1024 && exec bash /run.sh'
+      - "bash"
+      - "-c"
+      - "ulimit -n 1024 && exec bash /run.sh"

+ 0 - 2
server-ce/test/package.json

@@ -6,8 +6,6 @@
   "scripts": {
     "cypress:open": "cypress open --e2e --browser chrome",
     "cypress:run": "cypress run --e2e --browser chrome",
-    "format": "prettier --list-different $PWD/'**/*.{js,mjs,ts,tsx}'",
-    "format:fix": "prettier --write $PWD/'**/*.{js,mjs,ts,tsx}'",
     "lint": "eslint --max-warnings 0 --format unix --ext .js,.jsx,.mjs,.ts,.tsx .",
     "lint:fix": "eslint --fix --ext .js,.jsx,.mjs,.ts,.tsx ."
   },

+ 5 - 6
services/chat/Makefile

@@ -52,11 +52,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/chat/reports:/overleaf/services/chat/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/chat/reports:/overleaf/services/chat/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -77,13 +76,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/chat
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/chat
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/chat
 
 lint:
 	$(RUN_LINTING) lint

+ 2 - 4
services/chat/README.md

@@ -1,10 +1,8 @@
-overleaf/chat
-===============
+# overleaf/chat
 
 The backend API that powers the chat service in Overleaf
 
-License
--------
+## License
 
 The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
 

+ 56 - 56
services/chat/chat.yaml

@@ -3,12 +3,12 @@ x-stoplight:
   id: okoe8mh50pjec
 info:
   title: chat
-  version: '1.0'
+  version: "1.0"
 servers:
-  - url: 'http://chat:3010'
+  - url: "http://chat:3010"
 x-exegesis-controller: messagesController
 paths:
-  '/project/{projectId}/messages':
+  "/project/{projectId}/messages":
     parameters:
       - schema:
           type: string
@@ -19,14 +19,14 @@ paths:
       summary: Get Global messages
       tags: []
       responses:
-        '201':
+        "201":
           description: OK
           content:
             application/json:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/Message'
+                  $ref: "#/components/schemas/Message"
       operationId: getGlobalMessages
       description: Get global messages for the project with Project ID provided
       parameters:
@@ -42,21 +42,21 @@ paths:
       summary: Send Global message
       operationId: sendGlobalMessage
       responses:
-        '201':
+        "201":
           description: OK
       requestBody:
         content:
           application/json:
             schema:
-              $ref: '#/components/schemas/Message'
+              $ref: "#/components/schemas/Message"
             examples:
               example-1:
                 value:
                   user_id: string
                   content: string
-        description: 'UserID and Content of the message to be posted. '
+        description: "UserID and Content of the message to be posted. "
       description: Send global message  for the project with Project ID provided
-  '/project/{projectId}/messages/{messageId}':
+  "/project/{projectId}/messages/{messageId}":
     parameters:
       - schema:
           type: string
@@ -72,13 +72,13 @@ paths:
       summary: Get single global message
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/Message'
-        '404':
+                $ref: "#/components/schemas/Message"
+        "404":
           description: Message not found
       operationId: getGlobalMessage
       description: Get a single global message by message ID for the project with Project ID provided
@@ -86,10 +86,10 @@ paths:
       summary: Delete global message
       operationId: deleteGlobalMessage
       responses:
-        '204':
+        "204":
           description: No Content
-      description: 'Delete global message'
-  '/project/{projectId}/thread/{threadId}/messages':
+      description: "Delete global message"
+  "/project/{projectId}/thread/{threadId}/messages":
     parameters:
       - schema:
           type: string
@@ -105,19 +105,19 @@ paths:
       summary: Send message
       operationId: sendMessage
       responses:
-        '201':
+        "201":
           description: Created
       description: Add a message to the thread with thread ID provided from the Project with Project ID provided.
       requestBody:
         content:
           application/json:
             schema:
-              $ref: '#/components/schemas/Message'
+              $ref: "#/components/schemas/Message"
         description: |-
           JSON object with :
           - user_id: Id of the user
           - content: Content of the message
-  '/project/{projectId}/threads':
+  "/project/{projectId}/threads":
     parameters:
       - schema:
           type: string
@@ -128,20 +128,20 @@ paths:
       summary: Get Threads
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/Thread'
+                  $ref: "#/components/schemas/Thread"
               examples: {}
-        '404':
+        "404":
           description: Not Found
       operationId: getThreads
       description: Get the list of threads for the project with Project ID provided
-  '/project/{projectId}/thread/{threadId}/messages/{messageId}/edit':
+  "/project/{projectId}/thread/{threadId}/messages/{messageId}/edit":
     parameters:
       - schema:
           type: string
@@ -162,9 +162,9 @@ paths:
       summary: Edit message
       operationId: editMessage
       responses:
-        '204':
+        "204":
           description: No Content
-        '404':
+        "404":
           description: Not Found
       requestBody:
         content:
@@ -186,7 +186,7 @@ paths:
           - user_id: Id of the user (optional)
       description: |
         Update message with Message ID provided from the Thread ID and Project ID provided
-  '/project/{projectId}/messages/{messageId}/edit':
+  "/project/{projectId}/messages/{messageId}/edit":
     parameters:
       - schema:
           type: string
@@ -202,9 +202,9 @@ paths:
       summary: Edit global message
       operationId: editGlobalMessage
       responses:
-        '204':
+        "204":
           description: No Content
-        '404':
+        "404":
           description: Not Found
       requestBody:
         content:
@@ -226,7 +226,7 @@ paths:
           - user_id: Id of the user (optional)
       description: |
         Update global message with Message ID provided from the Project ID provided
-  '/project/{projectId}/thread/{threadId}/messages/{messageId}':
+  "/project/{projectId}/thread/{threadId}/messages/{messageId}":
     parameters:
       - schema:
           type: string
@@ -247,13 +247,13 @@ paths:
       summary: Get thread message
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/Message'
-        '404':
+                $ref: "#/components/schemas/Message"
+        "404":
           description: Message not found
       operationId: getThreadMessage
       description: Get a specific message by message ID from the thread with Thread ID and Project ID provided
@@ -261,10 +261,10 @@ paths:
       summary: Delete message
       operationId: deleteMessage
       responses:
-        '204':
+        "204":
           description: No Content
-      description: 'Delete message with Message ID provided, from the Thread with ThreadID and ProjectID provided'
-  '/project/{projectId}/thread/{threadId}/user/{userId}/messages/{messageId}':
+      description: "Delete message with Message ID provided, from the Thread with ThreadID and ProjectID provided"
+  "/project/{projectId}/thread/{threadId}/user/{userId}/messages/{messageId}":
     parameters:
       - schema:
           type: string
@@ -290,9 +290,9 @@ paths:
       summary: Delete message written by a given user
       operationId: deleteUserMessage
       responses:
-        '204':
+        "204":
           description: No Content
-  '/project/{projectId}/thread/{threadId}/resolve':
+  "/project/{projectId}/thread/{threadId}/resolve":
     parameters:
       - schema:
           type: string
@@ -308,7 +308,7 @@ paths:
       summary: Resolve Thread
       operationId: resolveThread
       responses:
-        '204':
+        "204":
           description: No Content
       requestBody:
         content:
@@ -324,7 +324,7 @@ paths:
           JSON object with :
           - user_id: Id of the user.
       description: Mark Thread with ThreadID and ProjectID provided owned by the user with UserID provided as resolved.
-  '/project/{projectId}/thread/{threadId}/reopen':
+  "/project/{projectId}/thread/{threadId}/reopen":
     parameters:
       - schema:
           type: string
@@ -340,12 +340,12 @@ paths:
       summary: Reopen Thread
       operationId: reopenThread
       responses:
-        '204':
+        "204":
           description: No Content
       description: |-
         Reopen Thread with ThreadID and ProjectID provided.
         i.e unmark it as resolved.
-  '/project/{projectId}/thread/{threadId}':
+  "/project/{projectId}/thread/{threadId}":
     parameters:
       - schema:
           type: string
@@ -361,13 +361,13 @@ paths:
       summary: Get Thread
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/Thread'
-        '404':
+                $ref: "#/components/schemas/Thread"
+        "404":
           description: Thread not found
       operationId: getThread
       description: Get a thread with ThreadID and ProjectID provided
@@ -375,10 +375,10 @@ paths:
       summary: Delete thread
       operationId: deleteThread
       responses:
-        '204':
+        "204":
           description: No Content
       description: Delete thread with ThreadID and ProjectID provided
-  '/project/{projectId}/resolved-thread-ids':
+  "/project/{projectId}/resolved-thread-ids":
     parameters:
       - schema:
           type: string
@@ -389,9 +389,9 @@ paths:
       summary: Get resolved thread ids
       operationId: getResolvedThreadIds
       responses:
-        '200':
+        "200":
           description: Resolved thread ids
-  '/project/{projectId}':
+  "/project/{projectId}":
     parameters:
       - schema:
           type: string
@@ -402,15 +402,15 @@ paths:
       summary: Destroy project
       operationId: destroyProject
       responses:
-        '204':
+        "204":
           description: No Content
-      description: 'Delete all threads from Project with Project ID provided, and all messages in those threads.'
+      description: "Delete all threads from Project with Project ID provided, and all messages in those threads."
   /status:
     get:
       summary: Check status
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
@@ -423,7 +423,7 @@ paths:
       summary: Check status
       tags: []
       responses:
-        '200':
+        "200":
           description: OK
           content:
             application/json:
@@ -432,7 +432,7 @@ paths:
                 description: chat is alive
       operationId: getStatus
       description: Check that the Chat service is alive
-  '/project/{projectId}/duplicate-comment-threads':
+  "/project/{projectId}/duplicate-comment-threads":
     parameters:
       - schema:
           type: string
@@ -453,7 +453,7 @@ paths:
                   items:
                     type: string
       responses:
-        '200':
+        "200":
           content:
             application/json:
               schema:
@@ -463,7 +463,7 @@ paths:
                     type: object
                 description: Mapping of old thread ids to their duplicated thread ids
       description: Duplicate a list of comment threads
-  '/project/{projectId}/generate-thread-data':
+  "/project/{projectId}/generate-thread-data":
     parameters:
       - schema:
           type: string
@@ -484,7 +484,7 @@ paths:
                   items:
                     type: string
       responses:
-        '200':
+        "200":
           content:
             application/json:
               schema:
@@ -514,4 +514,4 @@ components:
         id: 0ppt3jw4h5bua
       type: array
       items:
-        $ref: '#/components/schemas/Message'
+        $ref: "#/components/schemas/Message"

+ 1 - 2
services/chat/docker-compose.ci.yml

@@ -20,7 +20,6 @@ services:
       mongo:
         condition: service_started
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -41,7 +40,6 @@ services:
     entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=60 --
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -49,6 +47,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   mongo:
     image: mongo:8.0.11
     command: --replSet overleaf --notablescan

+ 0 - 1
services/chat/docker-compose.yml

@@ -62,4 +62,3 @@ services:
       # replica set. This override is not needed when running the setup after
       # starting up mongo.
       - mongo:127.0.0.1
-

+ 0 - 2
services/chat/package.json

@@ -12,8 +12,6 @@
     "test:acceptance:_run": "mocha --recursive --timeout 15000 --exit $@ test/acceptance/js",
     "test:unit:_run": "mocha --recursive --exit $@ test/unit/js",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "lint:fix": "eslint --fix .",
     "types:check": "tsc --noEmit"
   },

+ 5 - 6
services/clsi/Makefile

@@ -52,11 +52,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/clsi/reports:/overleaf/services/clsi/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/clsi/reports:/overleaf/services/clsi/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -77,13 +76,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/clsi
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/clsi
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/clsi
 
 lint:
 	$(RUN_LINTING) lint

+ 0 - 2
services/clsi/docker-compose.ci.yml

@@ -16,7 +16,6 @@ services:
       NODE_OPTIONS: "--unhandled-rejections=strict"
       VITEST_NO_CACHE: true
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -43,7 +42,6 @@ services:
       - /var/run/docker.sock:/var/run/docker.sock
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER

+ 0 - 1
services/clsi/docker-compose.yml

@@ -51,4 +51,3 @@ services:
       SANDBOXED_COMPILES_HOST_DIR_COMPILES: $PWD/compiles
       SANDBOXED_COMPILES_HOST_DIR_OUTPUT: $PWD/output
     command: npm run --silent test:acceptance
-

+ 0 - 2
services/clsi/package.json

@@ -12,8 +12,6 @@
     "test:unit": "npm run test:unit:_run",
     "nodemon": "node --watch app.js",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "lint:fix": "eslint --fix .",
     "types:check": "tsc --noEmit"
   },

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/draft_legacy/options.json

@@ -1,3 +1,3 @@
 {
   "draft": true
-}
+}

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/draft_mode/options.json

@@ -1,3 +1,3 @@
 {
   "draft": true
-}
+}

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/feynmp/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "latex"
+  "compiler": "latex"
 }

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/fontawesome_xelatex/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "xelatex"
+  "compiler": "xelatex"
 }

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/latex_compiler/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "latex"
+  "compiler": "latex"
 }

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/lualatex_compiler/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "lualatex"
+  "compiler": "lualatex"
 }

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/tikz_feynman/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "lualatex"
+  "compiler": "lualatex"
 }

+ 1 - 1
services/clsi/test/acceptance/fixtures/examples/xelatex_compiler/options.json

@@ -1,3 +1,3 @@
 {
-	"compiler": "xelatex"
+  "compiler": "xelatex"
 }

+ 5 - 6
services/contacts/Makefile

@@ -52,11 +52,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/contacts/reports:/overleaf/services/contacts/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/contacts/reports:/overleaf/services/contacts/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -77,13 +76,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/contacts
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/contacts
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/contacts
 
 lint:
 	$(RUN_LINTING) lint

+ 2 - 4
services/contacts/README.md

@@ -1,10 +1,8 @@
-overleaf/contacts
-===================
+# overleaf/contacts
 
 An API for tracking contacts of a user
 
-License
--------
+## License
 
 The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
 

+ 1 - 2
services/contacts/docker-compose.ci.yml

@@ -20,7 +20,6 @@ services:
       mongo:
         condition: service_started
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -41,7 +40,6 @@ services:
     entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=60 --
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -49,6 +47,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   mongo:
     image: mongo:8.0.11
     command: --replSet overleaf --notablescan

+ 0 - 1
services/contacts/docker-compose.yml

@@ -62,4 +62,3 @@ services:
       # replica set. This override is not needed when running the setup after
       # starting up mongo.
       - mongo:127.0.0.1
-

+ 0 - 2
services/contacts/package.json

@@ -12,8 +12,6 @@
     "test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
     "nodemon": "node --watch app.js",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "lint:fix": "eslint --fix .",
     "types:check": "tsc --noEmit"
   },

+ 5 - 6
services/docstore/Makefile

@@ -54,11 +54,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/docstore/reports:/overleaf/services/docstore/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/docstore/reports:/overleaf/services/docstore/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -79,13 +78,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/docstore
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/docstore
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/docstore
 
 lint:
 	$(RUN_LINTING) lint

+ 2 - 4
services/docstore/README.md

@@ -1,10 +1,8 @@
-overleaf/docstore
-===================
+# overleaf/docstore
 
 A CRUD API for storing and updating text documents in projects
 
-License
--------
+## License
 
 The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
 

+ 2 - 2
services/docstore/docker-compose.ci.yml

@@ -22,7 +22,6 @@ services:
       mongo:
         condition: service_started
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -48,7 +47,6 @@ services:
     entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=60 --
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -56,6 +54,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   mongo:
     image: mongo:8.0.11
     command: --replSet overleaf --notablescan
@@ -70,6 +69,7 @@ services:
       # replica set. This override is not needed when running the setup after
       # starting up mongo.
       - mongo:127.0.0.1
+
   gcs:
     image: fsouza/fake-gcs-server:1.52.3
     command: ["--port=9090", "--scheme=http", "--external-url=http://gcs:9090"]

+ 0 - 2
services/docstore/package.json

@@ -12,8 +12,6 @@
     "test:unit": "npm run test:unit:_run",
     "nodemon": "node --watch app.js",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "lint:fix": "eslint --fix .",
     "types:check": "tsc --noEmit"
   },

+ 5 - 6
services/document-updater/Makefile

@@ -55,11 +55,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/document-updater/reports:/overleaf/services/document-updater/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/document-updater/reports:/overleaf/services/document-updater/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -80,13 +79,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/document-updater
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/document-updater
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/document-updater
 
 lint:
 	$(RUN_LINTING) lint

+ 2 - 5
services/document-updater/README.md

@@ -1,12 +1,9 @@
-overleaf/document-updater
-===========================
+# overleaf/document-updater
 
 An API for applying incoming updates to documents in real-time.
 
-License
--------
+## License
 
 The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
 
 Copyright (c) Overleaf, 2014-2019.
-

+ 0 - 1
services/document-updater/app/js/sharejs/README.md

@@ -3,4 +3,3 @@ This folder contains a modified version of the ShareJS source code, forked from
 The original CoffeeScript code has been decaffeinated to JavaScript, and further modified. Some folders have been removed. See https://github.com/josephg/ShareJS/blob/v0.5.0/src/types/README.md for the original README.
 
 The original code, and the current modified code in this directory, are published under the MIT license.
-

+ 0 - 4
services/document-updater/app/js/sharejs/types/README.md

@@ -3,7 +3,6 @@ This directory contains all the operational transform code. Each file defines a
 Most of the types in here are for testing or demonstration. The only types which are sent to the webclient
 are `text` and `json`.
 
-
 # An OT type
 
 All OT types have the following fields:
@@ -18,7 +17,6 @@ Given op1, op2, `apply(s, op2, transform(op1, op2, 'left')) == apply(s, op1, tra
 
 Transform and apply must never modify their arguments.
 
-
 Optional properties:
 
 `tp2`: _(bool)_ True if the transform function supports TP2. This allows p2p architectures to work.
@@ -29,14 +27,12 @@ Optional properties:
 `normalize(op) -> op`: Fix up an op to make it valid. Eg, remove skips of size zero.
 `api`: _(object)_ Set of helper methods which will be mixed in to the client document object for manipulating documents. See below.
 
-
 # Examples
 
 `count` and `simple` are two trivial OT type definitions if you want to take a look. JSON defines
 the ot-for-JSON type (see the wiki for documentation) and all the text types define different text
 implementations. (I still have no idea which one I like the most, and they're fun to write!)
 
-
 # API
 
 Types can also define API functions. These methods are mixed into the client's Doc object when a document is created.

+ 1 - 2
services/document-updater/docker-compose.ci.yml

@@ -27,7 +27,6 @@ services:
       redis_test:
         condition: service_healthy
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -55,7 +54,6 @@ services:
     entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=60 --
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -63,6 +61,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   redis_test:
     image: redis:7.4.3
     healthcheck:

+ 0 - 1
services/document-updater/docker-compose.yml

@@ -83,4 +83,3 @@ services:
       # replica set. This override is not needed when running the setup after
       # starting up mongo.
       - mongo:127.0.0.1
-

+ 0 - 2
services/document-updater/package.json

@@ -12,8 +12,6 @@
     "nodemon": "node --watch app.js",
     "benchmark:apply": "node benchmarks/apply",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "lint:fix": "eslint --fix .",
     "types:check": "tsc --noEmit"
   },

+ 0 - 1
services/filestore/.prettierignore

@@ -1 +0,0 @@
-node_modules

+ 5 - 6
services/filestore/Makefile

@@ -52,11 +52,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/filestore/reports:/overleaf/services/filestore/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/filestore/reports:/overleaf/services/filestore/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -77,13 +76,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/filestore
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/filestore
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/filestore
 
 lint:
 	$(RUN_LINTING) lint

+ 10 - 12
services/filestore/README.md

@@ -1,21 +1,19 @@
-overleaf/filestore
-====================
+# overleaf/filestore
 
 An API for CRUD operations on binary files stored in S3
 
 filestore acts as a proxy between the CLSIs and (currently) Amazon S3 storage, presenting a RESTful HTTP interface to the CLSIs on port 3009 by default. Urls are mapped to node functions in https://github.com/overleaf/filestore/blob/master/app.coffee . URLs are of the form:
 
-* `/project/:project_id/file/:file_id`
-* `/template/:template_id/v/:version/:format`
-* `/project/:project_id/public/:public_file_id`
-* `/project/:project_id/size`
-* `/bucket/:bucket/key/*`
-* `/shutdown`
-* `/status` - returns HTTP 200 `filestore is up` or HTTP 503 when shutting down
-* `/health_check`
+- `/project/:project_id/file/:file_id`
+- `/template/:template_id/v/:version/:format`
+- `/project/:project_id/public/:public_file_id`
+- `/project/:project_id/size`
+- `/bucket/:bucket/key/*`
+- `/shutdown`
+- `/status` - returns HTTP 200 `filestore is up` or HTTP 503 when shutting down
+- `/health_check`
 
-License
--------
+## License
 
 The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
 

+ 5 - 5
services/filestore/docker-compose.ci.yml

@@ -20,7 +20,6 @@ services:
       NODE_OPTIONS: "--unhandled-rejections=strict"
       VITEST_NO_CACHE: true
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -29,7 +28,7 @@ services:
       MONGO_HOST: mongo
       POSTGRES_HOST: postgres
       AWS_S3_ENDPOINT: https://minio:9000
-      AWS_S3_PATH_STYLE: 'true'
+      AWS_S3_PATH_STYLE: "true"
       DELETE_OBJECTS_MD5_FALLBACK: true
       AWS_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
       AWS_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
@@ -64,7 +63,6 @@ services:
     user: node
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -72,6 +70,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   certs:
     build:
       dockerfile_inline: |
@@ -83,7 +82,7 @@ services:
     working_dir: /certs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         if [ ! -f private.key ] || [ ! -f public.crt ]; then
           /certgen -host minio
@@ -115,7 +114,7 @@ services:
       - minio-certs:/root/.mc/certs/CAs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         sleep 1
         mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
@@ -218,6 +217,7 @@ services:
         mc admin policy create s3 overleaf-filestore policy-filestore.json
         mc admin policy attach s3 overleaf-filestore \
           --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
+
   gcs:
     image: fsouza/fake-gcs-server:1.52.3
     command: ["--port=9090", "--scheme=http", "--external-url=http://gcs:9090"]

+ 4 - 3
services/filestore/docker-compose.yml

@@ -41,7 +41,7 @@ services:
       MONGO_CONNECTION_STRING: mongodb://mongo/test-overleaf
       POSTGRES_HOST: postgres
       AWS_S3_ENDPOINT: https://minio:9000
-      AWS_S3_PATH_STYLE: 'true'
+      AWS_S3_PATH_STYLE: "true"
       DELETE_OBJECTS_MD5_FALLBACK: true
       AWS_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
       AWS_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
@@ -85,7 +85,7 @@ services:
     working_dir: /certs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         if [ ! -f private.key ] || [ ! -f public.crt ]; then
           /certgen -host minio
@@ -117,7 +117,7 @@ services:
       - minio-certs:/root/.mc/certs/CAs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         sleep 1
         mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
@@ -220,6 +220,7 @@ services:
         mc admin policy create s3 overleaf-filestore policy-filestore.json
         mc admin policy attach s3 overleaf-filestore \
           --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
+
   gcs:
     image: fsouza/fake-gcs-server:1.52.3
     command: ["--port=9090", "--scheme=http", "--external-url=http://gcs:9090"]

+ 0 - 2
services/filestore/package.json

@@ -12,8 +12,6 @@
     "start": "node app.js",
     "nodemon": "node --watch app.js",
     "lint": "eslint --max-warnings 0 --format unix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "test:acceptance:_run": "mocha --recursive --timeout 15000 --exit $@ test/acceptance/js",
     "test:unit:_run": "vitest --config ./vitest.config.unit.cjs",
     "lint:fix": "eslint --fix .",

+ 3 - 4
services/git-bridge/README.md

@@ -3,7 +3,7 @@
 ## Docker
 
 The `Dockerfile` contains all the requirements for building and running the
- writelatex-git-bridge.
+writelatex-git-bridge.
 
 ```bash
 # build the image
@@ -17,8 +17,8 @@ docker run -v `pwd`/conf/local.json:/conf/runtime.json writelatex-git-bridge
 
 ### Required packages
 
-  * `maven` (for building, running tests and packaging)
-  * `jdk-8` (for compiling and running)
+- `maven` (for building, running tests and packaging)
+- `jdk-8` (for compiling and running)
 
 ### Commands
 
@@ -114,7 +114,6 @@ The configuration file is in `.json` format.
 
 You have to restart the server for configuration changes to take effect.
 
-
 ## Creating OAuth app
 
 In dev-env, run the following command in mongo to create the oauth application

+ 28 - 28
services/git-bridge/conf/example_config.json

@@ -1,30 +1,30 @@
 {
-    "port": 8080,
-    "bindIp": "127.0.0.1",
-    "idleTimeout": 30000,
-    "rootGitDirectory": "/tmp/wlgb",
-    "allowedCorsOrigins": "https://localhost",
-    "apiBaseUrl": "https://localhost/api/v0",
-    "postbackBaseUrl": "https://localhost",
-    "serviceName": "Overleaf",
-    "oauth2Server": "https://localhost",
-    "repoStore": {
-        "maxFileNum": 2000,
-        "maxFileSize": 52428800
-    },
-    "swapStore": {
-        "type": "s3",
-        "awsAccessKey": "asdf",
-        "awsSecret": "asdf",
-        "s3BucketName": "com.overleaf.testbucket",
-        "awsRegion": "us-east-1"
-    },
-    "swapJob": {
-        "minProjects": 50,
-        "lowGiB": 128,
-        "highGiB": 256,
-        "intervalMillis": 3600000,
-        "compressionMethod": "gzip"
-    },
-    "sqliteHeapLimitBytes": 512000000
+  "port": 8080,
+  "bindIp": "127.0.0.1",
+  "idleTimeout": 30000,
+  "rootGitDirectory": "/tmp/wlgb",
+  "allowedCorsOrigins": "https://localhost",
+  "apiBaseUrl": "https://localhost/api/v0",
+  "postbackBaseUrl": "https://localhost",
+  "serviceName": "Overleaf",
+  "oauth2Server": "https://localhost",
+  "repoStore": {
+    "maxFileNum": 2000,
+    "maxFileSize": 52428800
+  },
+  "swapStore": {
+    "type": "s3",
+    "awsAccessKey": "asdf",
+    "awsSecret": "asdf",
+    "s3BucketName": "com.overleaf.testbucket",
+    "awsRegion": "us-east-1"
+  },
+  "swapJob": {
+    "minProjects": 50,
+    "lowGiB": 128,
+    "highGiB": 256,
+    "intervalMillis": 3600000,
+    "compressionMethod": "gzip"
+  },
+  "sqliteHeapLimitBytes": 512000000
 }

+ 5 - 6
services/history-v1/Makefile

@@ -57,11 +57,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/history-v1/reports:/overleaf/services/history-v1/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/history-v1/reports:/overleaf/services/history-v1/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -82,13 +81,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/history-v1
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/history-v1
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/history-v1
 
 lint:
 	$(RUN_LINTING) lint

+ 2 - 0
services/history-v1/README.md

@@ -3,11 +3,13 @@
 The history service uses knex to manage PostgreSQL migrations.
 
 To create a new migrations, run:
+
 ```
 npx knex migrate:make migration_name
 ```
 
 To apply migrations, run:
+
 ```
 npx knex migrate:latest
 ```

+ 4 - 4
services/history-v1/config/custom-environment-variables.json

@@ -59,10 +59,10 @@
     "zipTimeoutMs": "ZIP_STORE_ZIP_TIMEOUT_MS"
   },
   "backupStore": {
-    "chunksBucket":"BACKUP_OVERLEAF_EDITOR_CHUNKS_BUCKET",
-    "deksBucket":"BACKUP_OVERLEAF_EDITOR_DEKS_BUCKET",
-    "globalBlobsBucket":"BACKUP_OVERLEAF_EDITOR_GLOBAL_BLOBS_BUCKET",
-    "projectBlobsBucket":"BACKUP_OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET"
+    "chunksBucket": "BACKUP_OVERLEAF_EDITOR_CHUNKS_BUCKET",
+    "deksBucket": "BACKUP_OVERLEAF_EDITOR_DEKS_BUCKET",
+    "globalBlobsBucket": "BACKUP_OVERLEAF_EDITOR_GLOBAL_BLOBS_BUCKET",
+    "projectBlobsBucket": "BACKUP_OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET"
   },
   "healthCheckBlobs": "HEALTH_CHECK_BLOBS",
   "healthCheckProjects": "HEALTH_CHECK_PROJECTS",

+ 4 - 4
services/history-v1/config/development.json

@@ -24,10 +24,10 @@
     "bucket": "overleaf-development-zips"
   },
   "backupStore": {
-    "chunksBucket":"overleaf-development-history-chunks",
-    "deksBucket":"overleaf-development-history-deks",
-    "globalBlobsBucket":"overleaf-development-history-global-blobs",
-    "projectBlobsBucket":"overleaf-development-history-project-blobs"
+    "chunksBucket": "overleaf-development-history-chunks",
+    "deksBucket": "overleaf-development-history-deks",
+    "globalBlobsBucket": "overleaf-development-history-global-blobs",
+    "projectBlobsBucket": "overleaf-development-history-project-blobs"
   },
   "backupPersistor": {
     "keyEncryptionKeys": "[{\"key\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"salt\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]",

+ 4 - 4
services/history-v1/config/test.json

@@ -22,10 +22,10 @@
     "bucket": "overleaf-test-zips"
   },
   "backupStore": {
-    "chunksBucket":"overleaf-test-history-chunks",
-    "deksBucket":"overleaf-test-history-deks",
-    "globalBlobsBucket":"overleaf-test-history-global-blobs",
-    "projectBlobsBucket":"overleaf-test-history-project-blobs"
+    "chunksBucket": "overleaf-test-history-chunks",
+    "deksBucket": "overleaf-test-history-deks",
+    "globalBlobsBucket": "overleaf-test-history-global-blobs",
+    "projectBlobsBucket": "overleaf-test-history-project-blobs"
   },
   "backupPersistor": {
     "keyEncryptionKeys": "[{\"key\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"salt\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]",

+ 6 - 5
services/history-v1/docker-compose.ci.yml

@@ -30,7 +30,6 @@ services:
       redis_test:
         condition: service_healthy
 
-
   test_acceptance:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -44,7 +43,7 @@ services:
       MONGO_HOST: mongo
       POSTGRES_HOST: postgres
       AWS_S3_ENDPOINT: https://minio:9000
-      AWS_S3_PATH_STYLE: 'true'
+      AWS_S3_PATH_STYLE: "true"
       DELETE_OBJECTS_MD5_FALLBACK: true
       AWS_ACCESS_KEY_ID: OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
       AWS_SECRET_ACCESS_KEY: OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
@@ -79,7 +78,6 @@ services:
     entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=60 --
     command: npm run test:acceptance
 
-
   tar:
     build: .
     image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
@@ -87,6 +85,7 @@ services:
       - ./:/tmp/build/
     command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
     user: root
+
   redis_test:
     image: redis:7.4.3
     healthcheck:
@@ -108,6 +107,7 @@ services:
       # replica set. This override is not needed when running the setup after
       # starting up mongo.
       - mongo:127.0.0.1
+
   postgres:
     image: postgres:10
     environment:
@@ -132,7 +132,7 @@ services:
     working_dir: /certs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         if [ ! -f private.key ] || [ ! -f public.crt ]; then
           /certgen -host minio
@@ -164,7 +164,7 @@ services:
       - minio-certs:/root/.mc/certs/CAs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         sleep 1
         mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
@@ -267,6 +267,7 @@ services:
         mc admin policy create s3 overleaf-history policy-history.json
         mc admin policy attach s3 overleaf-history \
           --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
+
   gcs:
     image: fsouza/fake-gcs-server:1.52.3
     command: ["--port=9090", "--scheme=http", "--external-url=http://gcs:9090"]

+ 4 - 3
services/history-v1/docker-compose.yml

@@ -60,7 +60,7 @@ services:
       MONGO_CONNECTION_STRING: mongodb://mongo/test-overleaf
       POSTGRES_HOST: postgres
       AWS_S3_ENDPOINT: https://minio:9000
-      AWS_S3_PATH_STYLE: 'true'
+      AWS_S3_PATH_STYLE: "true"
       DELETE_OBJECTS_MD5_FALLBACK: true
       AWS_ACCESS_KEY_ID: OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
       AWS_SECRET_ACCESS_KEY: OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
@@ -138,7 +138,7 @@ services:
     working_dir: /certs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         if [ ! -f private.key ] || [ ! -f public.crt ]; then
           /certgen -host minio
@@ -170,7 +170,7 @@ services:
       - minio-certs:/root/.mc/certs/CAs
     entrypoint: sh
     command:
-      - '-cex'
+      - "-cex"
       - |
         sleep 1
         mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
@@ -273,6 +273,7 @@ services:
         mc admin policy create s3 overleaf-history policy-history.json
         mc admin policy attach s3 overleaf-history \
           --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
+
   gcs:
     image: fsouza/fake-gcs-server:1.52.3
     command: ["--port=9090", "--scheme=http", "--external-url=http://gcs:9090"]

+ 0 - 2
services/history-v1/package.json

@@ -64,8 +64,6 @@
     "start": "node app.js",
     "lint": "eslint --max-warnings 0 --format unix .",
     "lint:fix": "eslint --fix .",
-    "format": "prettier --list-different $PWD/'**/{*.*js,*.ts}'",
-    "format:fix": "prettier --write $PWD/'**/{*.*js,*.ts}'",
     "test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
     "test:acceptance": "npm run test:acceptance:_run -- --grep=$MOCHA_GREP",
     "test:unit:_run": "mocha --recursive --exit $@ test/unit/js",

+ 4 - 4
services/history-v1/storage/scripts/global-blobs-db-cleanup/README.md

@@ -1,9 +1,9 @@
 Scripts in this directory were used when we cleaned up the global blobs table,
 ensuring that it only contained global blobs. The scripts are meant to be run in this order:
 
-* `01-create-blob-hashes-table.sql`
-* `02-set-global-flag.sql`
-* `03-create-global-blobs-table.sql`
-* `04-swap-global-blob-tables.sql`
+- `01-create-blob-hashes-table.sql`
+- `02-set-global-flag.sql`
+- `03-create-global-blobs-table.sql`
+- `04-swap-global-blob-tables.sql`
 
 The `rollback.sql` can be run to reverse the effect of `03-swap-global-blob-tables.sql`.

+ 5 - 6
services/notifications/Makefile

@@ -53,11 +53,10 @@ clean:
 # Run the linting commands in the scope of the monorepo.
 # Eslint and prettier (plus some configs) are on the root.
 RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:24.13.0 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
 
 RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/notifications/reports:/overleaf/services/notifications/reports $(IMAGE_CI) npm run --silent
-
-# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:24.13.0 npm run --silent
+RUN_LINTING_CI_MONOREPO = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/notifications/reports:/overleaf/services/notifications/reports -w /overleaf $(IMAGE_CI) npm run --silent
 
 SHELLCHECK_OPTS = \
 	--shell=bash \
@@ -78,13 +77,13 @@ shellcheck_fix:
 	done
 
 format:
-	$(RUN_LINTING) format
+	$(RUN_LINTING_MONOREPO) format -- services/notifications
 
 format_ci:
-	$(RUN_LINTING_CI) format
+	$(RUN_LINTING_CI_MONOREPO) format -- services/notifications
 
 format_fix:
-	$(RUN_LINTING) format:fix
+	$(RUN_LINTING_MONOREPO) format:fix -- services/notifications
 
 lint:
 	$(RUN_LINTING) lint

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini