diff --git a/.changeset/proud-dryers-jump.md b/.changeset/proud-dryers-jump.md new file mode 100644 index 0000000000000..178e98db12d42 --- /dev/null +++ b/.changeset/proud-dryers-jump.md @@ -0,0 +1,7 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/core-typings": minor +--- + +Fixes the time display in calendar event notifications by converting the UTC time to the local time. + diff --git a/.github/actions/build-docker/action.yml b/.github/actions/build-docker/action.yml index 60d197325bed8..911b0fef17b30 100644 --- a/.github/actions/build-docker/action.yml +++ b/.github/actions/build-docker/action.yml @@ -13,13 +13,13 @@ inputs: required: true description: 'Deno version' type: string - platform: + arch: required: false - description: 'Platform' - default: 'alpine' - build-containers: + description: 'Architecture' + default: 'amd64' + service: required: false - description: 'Containers to build along with Rocket.Chat' + description: 'Container to build' type: string turbo-cache: required: false @@ -49,61 +49,89 @@ runs: username: ${{ inputs.CR_USER }} password: ${{ inputs.CR_PAT }} - - name: Restore build + - name: Restore packages build + uses: actions/download-artifact@v4 + with: + name: packages-build + path: /tmp + + - name: Unpack packages build + shell: bash + run: | + tar -xzf /tmp/RocketChat-packages-build.tar.gz -C . + + - name: Restore meteor build + if: inputs.service == 'rocketchat' uses: actions/download-artifact@v4 with: name: build path: /tmp/build - - name: Unpack build + - name: Unpack meteor build + if: inputs.service == 'rocketchat' shell: bash run: | cd /tmp/build tar xzf Rocket.Chat.tar.gz rm Rocket.Chat.tar.gz - - uses: rharkor/caching-for-turbo@v1.5 - # if we are testing a PR from a fork, we already called the turbo cache at this point, so it should be false - if: inputs.turbo-cache == 'true' - - - name: Setup NodeJS - uses: ./.github/actions/setup-node - if: inputs.setup == 'true' + - name: Set up Docker + uses: docker/setup-docker-action@v4 with: - node-version: ${{ inputs.node-version }} - deno-version: ${{ inputs.deno-version }} - cache-modules: true - install: true - NPM_TOKEN: ${{ inputs.NPM_TOKEN }} + daemon-config: | + { + "debug": true, + "features": { + "containerd-snapshotter": true + } + } - - name: Restore turbo build - uses: actions/download-artifact@v4 + - uses: docker/setup-buildx-action@v3 with: - name: turbo-build - path: .turbo/cache - - - run: yarn build - if: inputs.setup == 'true' - shell: bash + buildkitd-flags: --oci-worker-gc --oci-worker-gc-keepstorage=4000 - name: Build Docker images shell: bash run: | - args=(rocketchat ${{ inputs.build-containers }}) - + set -o xtrace export DENO_VERSION="${{ inputs.deno-version }}" - docker compose -f docker-compose-ci.yml build "${args[@]}" + if [[ "${{ inputs.publish-image }}" == 'true' ]]; then + LOAD_OR_PUSH="--push" + else + LOAD_OR_PUSH="--load" + fi - - name: Publish Docker images to GitHub Container Registry - if: inputs.publish-image == 'true' && github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') - shell: bash - run: | - args=(rocketchat ${{ inputs.build-containers }}) + docker buildx bake \ + -f docker-compose-ci.yml \ + ${LOAD_OR_PUSH} \ + --allow=fs.read=/tmp/build \ + --set "*.labels.org.opencontainers.image.description=Build run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ + --set *.platform=linux/${{ inputs.arch }} \ + --set *.cache-from=type=gha \ + --set *.cache-to=type=gha,mode=max \ + --provenance=false \ + --sbom=false \ + --metadata-file "/tmp/meta.json" \ + "${{ inputs.service }}" + + echo "Contents of /tmp/meta.json:" + cat /tmp/meta.json - docker compose -f docker-compose-ci.yml push "${args[@]}" + mkdir -p /tmp/digests/${{ inputs.service }}/${{ inputs.arch }} + DIGEST=$(jq -r '.["${{ inputs.service }}"].["containerimage.digest"]' "/tmp/meta.json") + IMAGE_NO_TAG=$(jq -r '.["${{ inputs.service }}"].["image.name"] | if type=="array" then .[0] else . end' /tmp/meta.json | sed 's/:.*$//') + echo "${IMAGE_NO_TAG}@${DIGEST}" > "/tmp/digests/${{ inputs.service }}/${{ inputs.arch }}/digest.txt" + + - uses: actions/upload-artifact@v4 + if: inputs.publish-image == 'true' + with: + name: digests-${{ inputs.service }}-${{ inputs.arch }} + path: /tmp/digests + retention-days: 5 - name: Clean up temporary files + if: inputs.service == 'rocketchat' shell: bash run: | - sudo rm -rf /tmp/bundle + sudo rm -rf /tmp/build diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml index f0a61915616f1..ebca30f21c5a1 100644 --- a/.github/actions/meteor-build/action.yml +++ b/.github/actions/meteor-build/action.yml @@ -47,6 +47,7 @@ runs: - name: Cache vite uses: actions/cache@v3 + if: steps.cache-build.outputs.cache-hit != 'true' with: path: ./node_modules/.vite key: vite-local-cache-${{ runner.OS }}-${{ hashFiles('package.json') }} diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index fb5506cacdee9..657abc09cc11c 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -46,7 +46,7 @@ runs: apps/meteor/ee/server/services/node_modules packages/apps-engine/node_modules packages/apps-engine/.deno-cache - key: node-modules-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }} + key: node-modules-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('yarn.lock') }}-deno-v${{ inputs.deno-version }}-${{ hashFiles('packages/apps-engine/deno-runtime/deno.lock') }} # # Could use this command to list all paths to save: # find . -name 'node_modules' -prune | grep -v "/\.meteor/" | grep -v "/meteor/packages/" @@ -63,13 +63,14 @@ runs: with: deno-version: ${{ inputs.deno-version }} - - name: yarn login - shell: bash - if: inputs.NPM_TOKEN - run: | - echo "//registry.npmjs.org/:_authToken=${{ inputs.NPM_TOKEN }}" > ~/.npmrc + # - name: yarn login + # shell: bash + # if: inputs.NPM_TOKEN + # run: | + # echo "//registry.npmjs.org/:_authToken=${{ inputs.NPM_TOKEN }}" > ~/.npmrc - name: yarn install if: inputs.install shell: bash - run: YARN_ENABLE_HARDENED_MODE=${{ inputs.HARDENED_MODE }} yarn + # run: YARN_ENABLE_HARDENED_MODE=${{ inputs.HARDENED_MODE }} yarn + run: yarn diff --git a/.github/workflows/ci-test-e2e.yml b/.github/workflows/ci-test-e2e.yml index 839864ae1bdcd..fad4da85e2c3f 100644 --- a/.github/workflows/ci-test-e2e.yml +++ b/.github/workflows/ci-test-e2e.yml @@ -12,12 +12,6 @@ on: lowercase-repo: required: true type: string - rc-dockerfile: - required: true - type: string - rc-docker-tag: - required: true - type: string gh-docker-tag: required: true type: string @@ -76,9 +70,6 @@ env: jobs: test: runs-on: ubuntu-24.04 - env: - RC_DOCKERFILE: ${{ inputs.rc-dockerfile }}.${{ (matrix.mongodb-version == '8.2' && 'debian' && false) || 'alpine' }} - RC_DOCKER_TAG: ${{ inputs.rc-docker-tag }}.${{ (matrix.mongodb-version == '8.2' && 'debian' && false) || 'alpine' }} strategy: fail-fast: false @@ -86,7 +77,7 @@ jobs: mongodb-version: ${{ fromJSON(inputs.mongodb-version) }} shard: ${{ fromJSON(inputs.shard) }} - name: MongoDB ${{ matrix.mongodb-version }}${{ inputs.db-watcher-disabled == 'false' && ' [legacy watchers]' || '' }} (${{ matrix.shard }}/${{ inputs.total-shard }}) - ${{ (matrix.mongodb-version == '8.2' && 'Debian' && false) || 'Alpine (Official)' }} + name: MongoDB ${{ matrix.mongodb-version }}${{ inputs.db-watcher-disabled == 'false' && ' [legacy watchers]' || '' }} (${{ matrix.shard }}/${{ inputs.total-shard }}) steps: - name: Collect Workflow Telemetry @@ -153,6 +144,7 @@ jobs: # the same reason we need to rebuild the docker image at this point is the reason we dont want to publish it publish-image: false setup: false + service: 'rocketchat' NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Set DEBUG_LOG_LEVEL (debug enabled) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8f603f7005633..9e4dd17f073a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,18 +27,25 @@ jobs: outputs: release: ${{ steps.by-tag.outputs.release }} latest-release: ${{ steps.latest.outputs.latest-release }} - docker-tag: ${{ steps.docker.outputs.docker-tag }} gh-docker-tag: ${{ steps.docker.outputs.gh-docker-tag }} lowercase-repo: ${{ steps.var.outputs.lowercase-repo }} - rc-dockerfile: '${{ github.workspace }}/apps/meteor/.docker/Dockerfile' - rc-docker-tag: '${{ steps.docker.outputs.gh-docker-tag }}' node-version: ${{ steps.var.outputs.node-version }} deno-version: ${{ steps.var.outputs.deno-version }} - official-platform: 'alpine' + services: ${{ steps.var.outputs.services }} # this is 100% intentional, secrets are not available for forks, so ee-tests will always fail # to avoid this, we are using a dummy license, expiring at 2026-07-01 enterprise-license: Uo7Jcr6WW0XYA8ydHd+Sk6pZ9/0V6dIASnyTwvUrNym/zJg2Ma3eYNKkC8osXLCc72y1ahohnWY7/+7IYkvono3GYXQR+IGvYbbrVgNR6OjMahd9P/odHZL1GFTm2qHrEL5Hh/XEOG+YluFeRdWPzCizQlp4zGGOi0+PkQo096TR9NVCLrsErVl2MW1WM6ZM1W5EUJG9pKly4BQnaOTUAlor1im6i8qPTDCKrISZfLiZEWuQKaPW/GE3mRKjQNjDh0CabX1N2S880pRRGoozBYAnp2NmFfrQW0+5ihKisBTIeMbMZ7K5NE5PkYU1nhQDcc+rpDHtwG9Ceg5X0J+oea3UfrPTmDON2aSI0iO22kvL6G7QI3fyrEIvJrMbxcNKxAFeQYgnjisw/b06+chWSG4jG686Fx58XrVS87dFhWL9WoGltsk1dJCntUQvI1sX6zOfpvyg1iWRnHfYDOrwoWlX57XMm29fWineEoqnOOTOVnA/uP+DKEhercQ9Xuo7Cr6zJxpQpwd03e7ODVjiEbTDqlkZE687rmxRCD4Wmu8L86WIl2xSEIajKLX301Ww5mz/FdLqk+Mg32lkW66W3azQKvJ1440NBrYxhpJ+dl9vSFMb3s1+xnz1cYUbjUcq9mARvORcgy5mLwKulmqT6Sq0Uvbv10YCO0TW0beXYW8= steps: + - name: Github Info + run: | + echo "GITHUB_ACTION: $GITHUB_ACTION" + echo "GITHUB_ACTOR: $GITHUB_ACTOR" + echo "GITHUB_REF: $GITHUB_REF" + echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF" + echo "GITHUB_BASE_REF: $GITHUB_BASE_REF" + echo "github.event_name: ${{ github.event_name }}" + cat $GITHUB_EVENT_PATH + - uses: actions/checkout@v4 with: sparse-checkout: | @@ -62,6 +69,8 @@ jobs: echo "DENO_VERSION: ${DENO_VERSION}" echo "deno-version=${DENO_VERSION}" >> $GITHUB_OUTPUT + echo "services=['rocketchat','authorization-service','account-service','ddp-streamer-service','presence-service','stream-hub-service','queue-worker-service','omnichannel-transcript-service']" >> $GITHUB_OUTPUT + - id: by-tag run: | if echo "$GITHUB_REF_NAME" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' ; then @@ -86,7 +95,7 @@ jobs: if [[ '${{ github.event_name }}' == 'pull_request' ]]; then DOCKER_TAG="pr-${{ github.event.number }}" else - DOCKER_TAG="gh-${{ github.run_id }}" + DOCKER_TAG=$GITHUB_REF_NAME fi echo "DOCKER_TAG: ${DOCKER_TAG}" echo "gh-docker-tag=${DOCKER_TAG}" >> $GITHUB_OUTPUT @@ -138,16 +147,6 @@ jobs: needs: [release-versions, notify-draft-services] runs-on: ubuntu-24.04 steps: - - name: Github Info - run: | - echo "GITHUB_ACTION: $GITHUB_ACTION" - echo "GITHUB_ACTOR: $GITHUB_ACTOR" - echo "GITHUB_REF: $GITHUB_REF" - echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF" - echo "GITHUB_BASE_REF: $GITHUB_BASE_REF" - echo "github.event_name: ${{ github.event_name }}" - cat $GITHUB_EVENT_PATH - - name: Set Swap Space uses: pierotofy/set-swap-space@master with: @@ -178,6 +177,18 @@ jobs: - name: Build Rocket.Chat Packages run: yarn build + - name: Archive packages build output + run: | + tar -czf /tmp/RocketChat-packages-build.tar.gz \ + $(git ls-files -oi --exclude-standard -- '*/dist/*' 'packages/apps-engine/*' ':(exclude)node_modules/*' ':(exclude)**/node_modules/*' ':(exclude)**/.meteor/*' ':(exclude)**/.deno-cache/*' ':(exclude)**/.turbo/*' ':(exclude)packages/livechat/*') + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: packages-build + path: /tmp/RocketChat-packages-build.tar.gz + retention-days: 5 + - name: Store turbo build uses: actions/upload-artifact@v4 with: @@ -187,7 +198,7 @@ jobs: include-hidden-files: true build: - name: 📦 Meteor Build - coverage + name: 📦 Meteor Build needs: [release-versions, packages-build] runs-on: ubuntu-24.04 @@ -198,70 +209,38 @@ jobs: theme: dark job_summary: true comment_on_pr: false - - name: Github Info - run: | - echo "GITHUB_ACTION: $GITHUB_ACTION" - echo "GITHUB_ACTOR: $GITHUB_ACTOR" - echo "GITHUB_REF: $GITHUB_REF" - echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF" - echo "GITHUB_BASE_REF: $GITHUB_BASE_REF" - echo "github.event_name: ${{ github.event_name }}" - cat $GITHUB_EVENT_PATH - uses: actions/checkout@v4 - - uses: ./.github/actions/meteor-build - with: - node-version: ${{ needs.release-versions.outputs.node-version }} - deno-version: ${{ needs.release-versions.outputs.deno-version }} - coverage: true - - build-prod: - name: 📦 Meteor Build - official - needs: [tests-done, release-versions, packages-build] - if: (github.event_name == 'release' || github.ref == 'refs/heads/develop') - runs-on: ubuntu-24.04 - - steps: - - name: Collect Workflow Telemetry - uses: catchpoint/workflow-telemetry-action@v2 - with: - theme: dark - job_summary: true - comment_on_pr: false - - name: Github Info + - name: Create tar file of the checkout files + shell: bash run: | - echo "GITHUB_ACTION: $GITHUB_ACTION" - echo "GITHUB_ACTOR: $GITHUB_ACTOR" - echo "GITHUB_REF: $GITHUB_REF" - echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF" - echo "GITHUB_BASE_REF: $GITHUB_BASE_REF" - echo "github.event_name: ${{ github.event_name }}" - cat $GITHUB_EVENT_PATH + ls -la - - uses: actions/checkout@v4 + tar -czf /tmp/RocketChat-build.tar.gz \ + --exclude='.github' \ + . - uses: ./.github/actions/meteor-build with: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} - coverage: false + coverage: ${{ github.event_name != 'release' && github.ref != 'refs/heads/develop' }} - build-gh-docker-coverage: - name: 🚢 Build Docker Images for Testing + build-gh-docker: + name: 🚢 Build Docker needs: [build, release-versions] - runs-on: ubuntu-24.04 + runs-on: ubuntu-24.04${{ matrix.arch == 'arm64' && '-arm' || '' }} env: - RC_DOCKERFILE: ${{ needs.release-versions.outputs.rc-dockerfile }}.${{ matrix.platform }} - RC_DOCKER_TAG: ${{ needs.release-versions.outputs.rc-docker-tag }}.${{ matrix.platform }} - DOCKER_TAG: ${{ needs.release-versions.outputs.gh-docker-tag }} + DOCKER_TAG: ${{ needs.release-versions.outputs.gh-docker-tag }}-${{ matrix.arch }} LOWERCASE_REPOSITORY: ${{ needs.release-versions.outputs.lowercase-repo }} strategy: fail-fast: false matrix: - platform: ['alpine'] + arch: ['amd64', 'arm64'] + service: ${{ fromJson(needs.release-versions.outputs.services) }} steps: - uses: actions/checkout@v4 @@ -274,60 +253,73 @@ jobs: CR_PAT: ${{ secrets.CR_PAT }} node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} - platform: ${{ matrix.platform }} - build-containers: ${{ matrix.platform == needs.release-versions.outputs.official-platform && 'authorization-service account-service ddp-streamer-service presence-service stream-hub-service queue-worker-service omnichannel-transcript-service' || '' }} + arch: ${{ matrix.arch }} + service: ${{ matrix.service }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Rename official Docker tag to GitHub Container Registry - if: matrix.platform == needs.release-versions.outputs.official-platform && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') && github.actor != 'dependabot[bot]' - run: | - IMAGE_NAME_BASE="ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${DOCKER_TAG}" - - echo "Push Docker image: ${IMAGE_NAME_BASE}.official" - docker tag ${IMAGE_NAME_BASE}.${{matrix.platform}} ${IMAGE_NAME_BASE}.official - docker push ${IMAGE_NAME_BASE}.official - - build-gh-docker: - name: 🚢 Build Docker Images for Production - needs: [build-prod, release-versions] + build-gh-docker-publish: + name: 🚢 Publish Docker Images (ghcr.io) + needs: [build-gh-docker, release-versions] runs-on: ubuntu-24.04 env: - RC_DOCKERFILE: ${{ needs.release-versions.outputs.rc-dockerfile }}.${{ matrix.platform }} - RC_DOCKER_TAG: ${{ needs.release-versions.outputs.rc-docker-tag }}.${{ matrix.platform }} DOCKER_TAG: ${{ needs.release-versions.outputs.gh-docker-tag }} LOWERCASE_REPOSITORY: ${{ needs.release-versions.outputs.lowercase-repo }} - strategy: - fail-fast: false - matrix: - platform: ['alpine'] - steps: - uses: actions/checkout@v4 + if: github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') + with: + sparse-checkout: | + docker-compose-ci.yml + sparse-checkout-cone-mode: false + ref: ${{ github.ref }} - - uses: ./.github/actions/build-docker + - name: Login to GitHub Container Registry + if: github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') + uses: docker/login-action@v3 with: - CR_USER: ${{ secrets.CR_USER }} - CR_PAT: ${{ secrets.CR_PAT }} - node-version: ${{ needs.release-versions.outputs.node-version }} - deno-version: ${{ needs.release-versions.outputs.deno-version }} - platform: ${{ matrix.platform }} - build-containers: ${{ matrix.platform == needs.release-versions.outputs.official-platform && 'authorization-service account-service ddp-streamer-service presence-service stream-hub-service queue-worker-service omnichannel-transcript-service' || '' }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + registry: ghcr.io + username: ${{ secrets.CR_USER }} + password: ${{ secrets.CR_PAT }} + + - name: Download digests + if: github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') + uses: actions/download-artifact@v4 + with: + pattern: digests-* + path: /tmp/digests + merge-multiple: true - - name: Rename official Docker tag to GitHub Container Registry - if: matrix.platform == needs.release-versions.outputs.official-platform + - name: Create and push multi-arch manifests + if: github.actor != 'dependabot[bot]' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') run: | - IMAGE_NAME_BASE="ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${DOCKER_TAG}" + set -o xtrace + shopt -s nullglob - echo "Push Docker image: ${IMAGE_NAME_BASE}" - docker tag ${IMAGE_NAME_BASE}.${{matrix.platform}} $IMAGE_NAME_BASE - docker push $IMAGE_NAME_BASE + for service_dir in /tmp/digests/*; do + [[ -d "$service_dir" ]] || continue + service="$(basename "$service_dir")" + echo "Creating manifest for $service" - echo "Push Docker image: ${IMAGE_NAME_BASE}.official" - docker tag ${IMAGE_NAME_BASE}.${{matrix.platform}} ${IMAGE_NAME_BASE}.official - docker push ${IMAGE_NAME_BASE}.official + mapfile -t refs < <( + find "$service_dir" -type f -name 'digest.txt' -print0 \ + | xargs -0 -I{} sh -c "tr -d '\r' < '{}' | sed '/^[[:space:]]*$/d'" + ) + + echo "Digest for ${service}: ${refs[@]}" + + # Get image name from docker-compose-ci.yml since rocketchat image is different from service name (rocket.chat) + IMAGE=$(docker compose -f docker-compose-ci.yml config --format json 2>/dev/null | jq -r --arg s "$service" '.services[$s].image') + + echo $IMAGE + + docker buildx imagetools create \ + --debug \ + --annotation "manifest-descriptor:org.opencontainers.image.description=Build run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" \ + --tag "${IMAGE}" \ + ${refs[@]} + done checks: needs: [release-versions, packages-build] @@ -363,7 +355,7 @@ jobs: test-api: name: 🔨 Test API (CE) - needs: [checks, build-gh-docker-coverage, release-versions] + needs: [checks, build-gh-docker-publish, release-versions] uses: ./.github/workflows/ci-test-e2e.yml with: @@ -372,8 +364,6 @@ jobs: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} lowercase-repo: ${{ needs.release-versions.outputs.lowercase-repo }} - rc-dockerfile: ${{ needs.release-versions.outputs.rc-dockerfile }} - rc-docker-tag: ${{ needs.release-versions.outputs.rc-docker-tag }} gh-docker-tag: ${{ needs.release-versions.outputs.gh-docker-tag }} secrets: CR_USER: ${{ secrets.CR_USER }} @@ -381,7 +371,7 @@ jobs: test-ui: name: 🔨 Test UI (CE) - needs: [checks, build-gh-docker-coverage, release-versions] + needs: [checks, build-gh-docker-publish, release-versions] uses: ./.github/workflows/ci-test-e2e.yml with: @@ -394,8 +384,6 @@ jobs: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} lowercase-repo: ${{ needs.release-versions.outputs.lowercase-repo }} - rc-dockerfile: ${{ needs.release-versions.outputs.rc-dockerfile }} - rc-docker-tag: ${{ needs.release-versions.outputs.rc-docker-tag }} gh-docker-tag: ${{ needs.release-versions.outputs.gh-docker-tag }} retries: ${{ (github.event_name == 'release' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/master') && 2 || 0 }} secrets: @@ -408,7 +396,7 @@ jobs: test-api-ee: name: 🔨 Test API (EE) - needs: [checks, build-gh-docker-coverage, release-versions] + needs: [checks, build-gh-docker-publish, release-versions] uses: ./.github/workflows/ci-test-e2e.yml with: @@ -420,8 +408,6 @@ jobs: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} lowercase-repo: ${{ needs.release-versions.outputs.lowercase-repo }} - rc-dockerfile: ${{ needs.release-versions.outputs.rc-dockerfile }} - rc-docker-tag: ${{ needs.release-versions.outputs.rc-docker-tag }} gh-docker-tag: ${{ needs.release-versions.outputs.gh-docker-tag }} secrets: CR_USER: ${{ secrets.CR_USER }} @@ -429,7 +415,7 @@ jobs: test-ui-ee: name: 🔨 Test UI (EE) - needs: [checks, build-gh-docker-coverage, release-versions] + needs: [checks, build-gh-docker-publish, release-versions] uses: ./.github/workflows/ci-test-e2e.yml with: @@ -443,8 +429,6 @@ jobs: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} lowercase-repo: ${{ needs.release-versions.outputs.lowercase-repo }} - rc-dockerfile: ${{ needs.release-versions.outputs.rc-dockerfile }} - rc-docker-tag: ${{ needs.release-versions.outputs.rc-docker-tag }} gh-docker-tag: ${{ needs.release-versions.outputs.gh-docker-tag }} retries: ${{ (github.event_name == 'release' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/master') && 2 || 0 }} secrets: @@ -458,7 +442,7 @@ jobs: test-ui-ee-watcher: name: 🔨 Test UI (EE) - needs: [checks, build-gh-docker-coverage, release-versions] + needs: [checks, build-gh-docker-publish, release-versions] uses: ./.github/workflows/ci-test-e2e.yml with: @@ -472,8 +456,6 @@ jobs: node-version: ${{ needs.release-versions.outputs.node-version }} deno-version: ${{ needs.release-versions.outputs.deno-version }} lowercase-repo: ${{ needs.release-versions.outputs.lowercase-repo }} - rc-dockerfile: ${{ needs.release-versions.outputs.rc-dockerfile }} - rc-docker-tag: ${{ needs.release-versions.outputs.rc-docker-tag }} gh-docker-tag: ${{ needs.release-versions.outputs.gh-docker-tag }} retries: ${{ (github.event_name == 'release' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/master') && 2 || 0 }} db-watcher-disabled: 'false' @@ -528,7 +510,7 @@ jobs: name: 🚀 Publish build assets runs-on: ubuntu-24.04 if: github.event_name == 'release' || github.ref == 'refs/heads/develop' - needs: [build-gh-docker, release-versions] + needs: [build-gh-docker-publish, release-versions] steps: - uses: actions/checkout@v4 @@ -579,125 +561,22 @@ jobs: aws s3 cp $ROCKET_DEPLOY_DIR/ s3://download.rocket.chat/build/ --recursive docker-image-publish: - name: 🚀 Publish Docker Image (main) + name: 🚀 Publish Docker Images (DockerHub) runs-on: ubuntu-24.04 needs: [deploy, release-versions] strategy: matrix: - # this is currently a mix of variants and different images - release: ['alpine'] - env: - IMAGE_NAME: 'rocketchat/rocket.chat' + service: ${{ fromJson(needs.release-versions.outputs.services) }} steps: - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USER }} - password: ${{ secrets.DOCKER_PASS }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + - uses: actions/checkout@v4 with: - registry: ghcr.io - username: ${{ secrets.CR_USER }} - password: ${{ secrets.CR_PAT }} - - - name: Get Docker image name - id: gh-docker - run: | - GH_IMAGE_NAME="ghcr.io/${{ needs.release-versions.outputs.lowercase-repo }}/rocket.chat:${{ needs.release-versions.outputs.gh-docker-tag }}.${{ matrix.release }}" - - echo "GH_IMAGE_NAME: $GH_IMAGE_NAME" - - echo "gh-image-name=${GH_IMAGE_NAME}" >> $GITHUB_OUTPUT - - DOCKER_TAG_SHA="sha-${GITHUB_SHA:0:7}" - - echo "DOCKER_TAG_SHA: ${DOCKER_TAG_SHA}" - echo "gh-docker-tag-sha=${DOCKER_TAG_SHA}" >> $GITHUB_OUTPUT - - - name: Pull Docker image - run: docker pull ${{ steps.gh-docker.outputs.gh-image-name }} - - - name: Publish Docker image - run: | - if [[ '${{ matrix.release }}' = 'preview' ]]; then - IMAGE_NAME="${IMAGE_NAME}.preview" - fi; - - # 'develop' or 'tag' - DOCKER_TAG=$GITHUB_REF_NAME - - # append the variant name to docker tag - if [[ '${{ matrix.release }}' = 'debian' ]]; then - DOCKER_TAG="${DOCKER_TAG}-${{ matrix.release }}" - fi; - - PUBLISHED_TAGS=() - - # tag and push the specific tag version - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $IMAGE_NAME:$DOCKER_TAG - docker push $IMAGE_NAME:$DOCKER_TAG - - PUBLISHED_TAGS+=("$IMAGE_NAME:$DOCKER_TAG") - - if [[ $GITHUB_REF == refs/tags/* ]]; then - RELEASE="${{ needs.release-versions.outputs.release }}" - - if [[ '${{ matrix.release }}' = 'debian' ]]; then - RELEASE="${RELEASE}-${{ matrix.release }}" - fi; - - echo "RELEASE: $RELEASE" - - if [[ $RELEASE == 'latest' ]]; then - if [[ '${{ needs.release-versions.outputs.latest-release }}' == $GITHUB_REF_NAME ]]; then - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $IMAGE_NAME:$RELEASE - docker push $IMAGE_NAME:$RELEASE - - PUBLISHED_TAGS+=("$IMAGE_NAME:$RELEASE") - fi - else - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $IMAGE_NAME:$RELEASE - docker push $IMAGE_NAME:$RELEASE - - PUBLISHED_TAGS+=("$IMAGE_NAME:$RELEASE") - fi - fi - - # commit hash - TAG_SHA="${{ steps.gh-docker.outputs.gh-docker-tag-sha }}" - - # append the variant name to docker tag - if [[ '${{ matrix.release }}' = 'debian' ]]; then - TAG_SHA="${TAG_SHA}-${{ matrix.release }}" - fi; - - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $IMAGE_NAME:$TAG_SHA - docker push $IMAGE_NAME:$TAG_SHA - - PUBLISHED_TAGS+=("$IMAGE_NAME:$TAG_SHA") - - echo "::group::Published tags" - - for TAG in ${PUBLISHED_TAGS[@]}; do - echo $TAG - done - - echo "::endgroup::" - - services-docker-image-publish: - name: 🚀 Publish Docker Image (services) - runs-on: ubuntu-24.04 - needs: [deploy, release-versions] - - strategy: - matrix: - service: ['account', 'authorization', 'ddp-streamer', 'omnichannel-transcript', 'presence', 'queue-worker', 'stream-hub'] + sparse-checkout: | + docker-compose-ci.yml + sparse-checkout-cone-mode: false + ref: ${{ github.ref }} - steps: - name: Login to DockerHub uses: docker/login-action@v3 with: @@ -714,74 +593,82 @@ jobs: - name: Get Docker image name id: gh-docker run: | - GH_IMAGE_NAME="ghcr.io/${{ needs.release-versions.outputs.lowercase-repo }}/${{ matrix.service }}-service:${{ needs.release-versions.outputs.gh-docker-tag }}" + # Get image name from docker-compose-ci.yml since rocketchat image is different from service name (rocket.chat) + GH_IMAGE_NAME=$(docker compose -f docker-compose-ci.yml config --format json 2>/dev/null | jq -r --arg s "$service" '.services[$s].image') echo "GH_IMAGE_NAME: $GH_IMAGE_NAME" echo "gh-image-name=${GH_IMAGE_NAME}" >> $GITHUB_OUTPUT - DOCKER_TAG_SHA="sha-${GITHUB_SHA:0:7}" - - echo "DOCKER_TAG_SHA: ${DOCKER_TAG_SHA}" - echo "gh-docker-tag-sha=${DOCKER_TAG_SHA}" >> $GITHUB_OUTPUT - - - name: Pull Docker image - run: docker pull ${{ steps.gh-docker.outputs.gh-image-name }} + # - name: Pull Docker image + # run: docker pull ${{ steps.gh-docker.outputs.gh-image-name }} - name: Publish Docker images run: | - DH_IMAGE_NAME="rocketchat/${{ matrix.service }}-service" + set -euo pipefail + + sudo apt-get update -y + sudo apt-get install -y skopeo + + if [[ '${{ matrix.service }}' == 'rocketchat' ]]; then + IMAGE_NAME="${{ needs.release-versions.outputs.lowercase-repo }}/rocket.chat" + else + IMAGE_NAME="${{ needs.release-versions.outputs.lowercase-repo }}/${{ matrix.service }}" + fi # 'develop' or 'tag' DOCKER_TAG=$GITHUB_REF_NAME - PUBLISHED_TAGS=() - - # tag and push the specific tag version - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $DH_IMAGE_NAME:$DOCKER_TAG - docker push $DH_IMAGE_NAME:$DOCKER_TAG + declare -a TAGS=() - PUBLISHED_TAGS+=("$DH_IMAGE_NAME:$DOCKER_TAG") + # tag specific tag version + TAGS+=("$DOCKER_TAG") if [[ $GITHUB_REF == refs/tags/* ]]; then RELEASE="${{ needs.release-versions.outputs.release }}" + + echo "RELEASE: $RELEASE" if [[ $RELEASE == 'latest' ]]; then if [[ '${{ needs.release-versions.outputs.latest-release }}' == $GITHUB_REF_NAME ]]; then - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $DH_IMAGE_NAME:$RELEASE - docker push $DH_IMAGE_NAME:$RELEASE - - PUBLISHED_TAGS+=("$DH_IMAGE_NAME:$RELEASE") + TAGS+=("$RELEASE") fi else - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $DH_IMAGE_NAME:$RELEASE - docker push $DH_IMAGE_NAME:$RELEASE - - PUBLISHED_TAGS+=("$DH_IMAGE_NAME:$RELEASE") + TAGS+=("$RELEASE") fi fi # commit hash - TAG_SHA="${{ steps.gh-docker.outputs.gh-docker-tag-sha }}" + COMMIT_SHA="sha-${GITHUB_SHA:0:7}" + echo "COMMIT_SHA: ${COMMIT_SHA}" + TAGS+=("${COMMIT_SHA}") - docker tag ${{ steps.gh-docker.outputs.gh-image-name }} $DH_IMAGE_NAME:$TAG_SHA - docker push $DH_IMAGE_NAME:$TAG_SHA + echo "Tags: ${TAGS[*]}" - PUBLISHED_TAGS+=("$DH_IMAGE_NAME:$TAG_SHA") + # get first tag as primary + PRIMARY="${TAGS[0]}" - echo "::group::Published tags" + SRC="${{ steps.gh-docker.outputs.gh-image-name }}" + DEST_REPO="docker.io/${IMAGE_NAME}" - for TAG in ${PUBLISHED_TAGS[@]}; do - echo $TAG - done + # build --additional-tag for all other tags + EXTRA_ARGS=() + if (( ${#TAGS[@]} > 1 )); then + for t in "${TAGS[@]:1}"; do + EXTRA_ARGS+=( --additional-tag "${DEST_REPO}:${t}" ) + done + fi - echo "::endgroup::" + echo "Copying $SRC to ${DEST_REPO}:${PRIMARY} with extras ${EXTRA_ARGS[*]}" + skopeo copy --all \ + "docker://${SRC}" \ + "docker://${DEST_REPO}:${PRIMARY}" \ + "${EXTRA_ARGS[@]}" notify-services: name: 🚀 Notify external services runs-on: ubuntu-24.04 needs: - - services-docker-image-publish - docker-image-publish - release-versions steps: @@ -829,7 +716,6 @@ jobs: if: github.event_name == 'release' needs: - - services-docker-image-publish - docker-image-publish uses: ./.github/workflows/update-version-durability.yml diff --git a/apps/meteor/.docker/Dockerfile.alpine b/apps/meteor/.docker/Dockerfile.alpine index 0576b843f0ce1..c453ea7c51a39 100644 --- a/apps/meteor/.docker/Dockerfile.alpine +++ b/apps/meteor/.docker/Dockerfile.alpine @@ -1,9 +1,39 @@ +FROM node:22.16.0-alpine3.20 AS builder + +ENV LANG=C.UTF-8 + +RUN apk add --no-cache --virtual deps python3 make g++ py3-setuptools libc6-compat + +COPY . /app + +ENV NODE_ENV=production \ + HOME=/tmp + +RUN cd /app/bundle/programs/server \ + && npm install --omit=dev --loglevel=verbose \ + && cd /app/bundle/programs/server \ + && rm -rf npm/node_modules/sharp \ + && npm install sharp@0.32.6 --no-save --loglevel=verbose \ + && mv node_modules/sharp npm/node_modules/sharp \ + # End hack for sharp + # # Start hack for isolated-vm... + # && rm -rf npm/node_modules/isolated-vm \ + # && npm install isolated-vm@4.6.0 \ + # && mv node_modules/isolated-vm npm/node_modules/isolated-vm \ + # # End hack for isolated-vm + && cd /app/bundle/programs/server/npm \ + && npm rebuild bcrypt --build-from-source --loglevel=verbose \ + && npm cache clear --force + FROM node:22.16.0-alpine3.20 LABEL maintainer="buildmaster@rocket.chat" ENV LANG=C.UTF-8 +# Solves CVE https://scout.docker.com/vulnerabilities/id/CVE-2025-9230 +RUN apk update && apk upgrade --no-cache openssl libssl3 libcrypto3 + # `nogroup` group is historically reserved for NFS. # We don't use any NFS related tools in this image. # For the same reason of NFS using the gid, we can also use it as long as there are no conflicts in terms of running processes with the same egid (which is 1 in our case). @@ -16,12 +46,13 @@ ENV LANG=C.UTF-8 # and more complex or security conscious daemons run as dedicated users. # The daemon user is also handy for locally installed daemons. # """ -RUN apk add --no-cache deno ttf-dejavu \ - && apk add --no-cache --virtual deps shadow python3 make g++ py3-setuptools libc6-compat \ +RUN apk add --no-cache deno ttf-dejavu shadow \ && groupmod -n rocketchat nogroup \ && useradd -u 65533 -r -g rocketchat rocketchat -COPY --chown=rocketchat:rocketchat . /app +COPY --from=builder --chown=rocketchat:rocketchat /app /app + +USER rocketchat # needs a mongo instance - defaults to container linking with alias 'mongo' ENV DEPLOY_METHOD=docker \ @@ -32,30 +63,6 @@ ENV DEPLOY_METHOD=docker \ ROOT_URL=http://localhost:3000 \ Accounts_AvatarStorePath=/app/uploads -USER rocketchat - -RUN cd /app/bundle/programs/server \ - && npm install --omit=dev \ - && cd /app/bundle/programs/server \ - && rm -rf npm/node_modules/sharp \ - && npm install sharp@0.32.6 --no-save \ - && mv node_modules/sharp npm/node_modules/sharp \ - # End hack for sharp - # # Start hack for isolated-vm... - # && rm -rf npm/node_modules/isolated-vm \ - # && npm install isolated-vm@4.6.0 \ - # && mv node_modules/isolated-vm npm/node_modules/isolated-vm \ - # # End hack for isolated-vm - && cd /app/bundle/programs/server/npm \ - && npm rebuild bcrypt --build-from-source \ - && npm cache clear --force - -USER root - -RUN apk del deps - -USER rocketchat - VOLUME /app/uploads WORKDIR /app/bundle diff --git a/apps/meteor/.meteor/packages b/apps/meteor/.meteor/packages index 7f6f660851cf2..0dce43f784ee4 100644 --- a/apps/meteor/.meteor/packages +++ b/apps/meteor/.meteor/packages @@ -9,13 +9,13 @@ rocketchat:livechat rocketchat:streamer rocketchat:version -accounts-base@3.1.1 +accounts-base@3.1.2 accounts-facebook@1.3.4 accounts-github@1.5.1 accounts-google@1.4.1 accounts-meteor-developer@1.5.1 accounts-oauth@1.4.6 -accounts-password@3.2.0 +accounts-password@3.2.1 accounts-twitter@1.5.2 google-oauth@1.4.5 @@ -31,12 +31,12 @@ meteor-base@1.5.2 ddp-common@1.4.4 webapp@2.0.7 -mongo@2.1.2 +mongo@2.1.4 reload@1.3.2 service-configuration@1.3.5 session@1.2.2 -shell-server@0.6.1 +shell-server@0.6.2 dispatch:run-as-user ostrio:cookies @@ -53,11 +53,11 @@ tracker@1.3.4 reactive-dict@1.3.2 reactive-var@1.0.13 -babel-compiler@7.12.0 +babel-compiler@7.12.2 standard-minifier-css@1.9.3 dynamic-import@0.7.4 -ecmascript@0.16.11 -typescript@5.6.4 +ecmascript@0.16.13 +typescript@5.6.6 autoupdate@2.0.1 diff --git a/apps/meteor/.meteor/release b/apps/meteor/.meteor/release index d515fb7f4946d..4876d6ff64c16 100644 --- a/apps/meteor/.meteor/release +++ b/apps/meteor/.meteor/release @@ -1 +1 @@ -METEOR@3.3 +METEOR@3.3.2 diff --git a/apps/meteor/.meteor/versions b/apps/meteor/.meteor/versions index 2c3b80cb7b7c1..04d79cb550212 100644 --- a/apps/meteor/.meteor/versions +++ b/apps/meteor/.meteor/versions @@ -1,19 +1,19 @@ -accounts-base@3.1.1 +accounts-base@3.1.2 accounts-facebook@1.3.4 accounts-github@1.5.1 accounts-google@1.4.1 accounts-meteor-developer@1.5.1 accounts-oauth@1.4.6 -accounts-password@3.2.0 +accounts-password@3.2.1 accounts-twitter@1.5.2 allow-deny@2.1.0 autoupdate@2.0.1 -babel-compiler@7.12.0 +babel-compiler@7.12.2 babel-runtime@1.5.2 base64@1.0.13 binary-heap@1.0.12 -boilerplate-generator@2.0.1 -callback-hook@1.6.0 +boilerplate-generator@2.0.2 +callback-hook@1.6.1 check@1.4.4 core-runtime@1.0.0 ddp@1.4.2 @@ -24,7 +24,7 @@ ddp-server@3.1.2 diff-sequence@1.1.3 dispatch:run-as-user@1.1.1 dynamic-import@0.7.4 -ecmascript@0.16.11 +ecmascript@0.16.13 ecmascript-runtime@0.8.3 ecmascript-runtime-client@0.12.3 ecmascript-runtime-server@0.11.1 @@ -48,15 +48,15 @@ meteor-base@1.5.2 meteor-developer-oauth@1.3.3 meteorhacks:inject-initial@1.0.5 minifier-css@2.0.1 -minimongo@2.0.2 -modern-browsers@0.2.2 +minimongo@2.0.4 +modern-browsers@0.2.3 modules@0.20.3 modules-runtime@0.13.2 -mongo@2.1.2 +mongo@2.1.4 mongo-decimal@0.2.0 mongo-dev-server@1.1.1 mongo-id@1.0.9 -npm-mongo@6.10.2 +npm-mongo@6.16.1 oauth@3.0.2 oauth1@1.5.2 oauth2@1.3.3 @@ -79,12 +79,12 @@ routepolicy@1.1.2 service-configuration@1.3.5 session@1.2.2 sha@1.0.10 -shell-server@0.6.1 +shell-server@0.6.2 socket-stream-client@0.6.1 standard-minifier-css@1.9.3 tracker@1.3.4 twitter-oauth@1.3.4 -typescript@5.6.4 +typescript@5.6.6 underscore@1.6.4 url@1.3.5 webapp@2.0.7 diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index c348d21134a9a..7ce5e3d3c3b80 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "7.12.0-develop" + "version": "7.13.0-develop" } diff --git a/apps/meteor/client/views/root/hooks/loggedIn/useNotificationUserCalendar.ts b/apps/meteor/client/views/root/hooks/loggedIn/useNotificationUserCalendar.ts index 0785cba01c4c3..8bf576c35629a 100644 --- a/apps/meteor/client/views/root/hooks/loggedIn/useNotificationUserCalendar.ts +++ b/apps/meteor/client/views/root/hooks/loggedIn/useNotificationUserCalendar.ts @@ -15,8 +15,24 @@ export const useNotificationUserCalendar = (user: IUser) => { return; } + let body = notification.text; + if (notification.payload?.startTimeUtc) { + try { + const time = new Date(notification.payload.startTimeUtc); + const formattedTime = time.toLocaleTimeString(undefined, { + hour: 'numeric', + minute: 'numeric', + dayPeriod: 'narrow', + }); + body = formattedTime; + } catch (error) { + console.error('Failed to format calendar notification time:', error); + body = notification.text; + } + } + const n = new Notification(notification.title, { - body: notification.text, + body, tag: notification.payload._id, silent: true, requireInteraction, diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 25d38ef433e96..f586940988705 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -39,7 +39,7 @@ "jaeger-client": "^3.19.0", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "sodium-native": "^4.3.3", diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 5f19685a74194..c2d47cdc40001 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "7.12.0-develop", + "version": "7.13.0-develop", "private": true, "type": "commonjs", "author": { @@ -402,7 +402,7 @@ "moment": "^2.30.1", "moment-timezone": "^0.5.48", "mongo-message-queue": "^1.1.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "node-dogstatsd": "^0.0.7", "node-fetch": "2.7.0", diff --git a/apps/meteor/server/services/calendar/service.ts b/apps/meteor/server/services/calendar/service.ts index 642f13f114c8f..b6b469ddd46fa 100644 --- a/apps/meteor/server/services/calendar/service.ts +++ b/apps/meteor/server/services/calendar/service.ts @@ -355,6 +355,7 @@ export class CalendarService extends ServiceClassInternal implements ICalendarSe text: event.startTime.toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric', dayPeriod: 'narrow' }), payload: { _id: event._id, + startTimeUtc: event.startTime.toISOString(), }, }); } diff --git a/docker-compose-ci.yml b/docker-compose-ci.yml index e0df913077166..768bd21cbc8fc 100644 --- a/docker-compose-ci.yml +++ b/docker-compose-ci.yml @@ -1,16 +1,18 @@ -version: '3.8' - services: rocketchat: volumes: - /tmp/coverage:/tmp/coverage platform: linux/amd64 build: - dockerfile: ${RC_DOCKERFILE} + dockerfile: ${GITHUB_WORKSPACE}/apps/meteor/.docker/Dockerfile.alpine context: /tmp/build + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: DENO_VERSION: ${DENO_VERSION} - image: ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${RC_DOCKER_TAG} + image: ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${DOCKER_TAG} environment: - TEST_MODE=true - DEBUG=${DEBUG} @@ -42,6 +44,10 @@ services: build: dockerfile: ee/apps/authorization-service/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: authorization-service DENO_VERSION: ${DENO_VERSION} @@ -60,6 +66,10 @@ services: build: dockerfile: ee/apps/account-service/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: account-service image: ghcr.io/${LOWERCASE_REPOSITORY}/account-service:${DOCKER_TAG} @@ -77,6 +87,10 @@ services: build: dockerfile: ee/apps/presence-service/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: presence-service DENO_VERSION: ${DENO_VERSION} @@ -95,6 +109,10 @@ services: build: dockerfile: ee/apps/ddp-streamer/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: ddp-streamer image: ghcr.io/${LOWERCASE_REPOSITORY}/ddp-streamer-service:${DOCKER_TAG} @@ -118,6 +136,10 @@ services: build: dockerfile: ee/apps/stream-hub-service/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: stream-hub-service image: ghcr.io/${LOWERCASE_REPOSITORY}/stream-hub-service:${DOCKER_TAG} @@ -136,6 +158,10 @@ services: build: dockerfile: ee/apps/queue-worker/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: queue-worker image: ghcr.io/${LOWERCASE_REPOSITORY}/queue-worker-service:${DOCKER_TAG} @@ -153,6 +179,10 @@ services: build: dockerfile: ee/apps/omnichannel-transcript/Dockerfile context: . + x-bake: + platforms: + - linux/amd64 + - linux/arm64 args: SERVICE: omnichannel-transcript image: ghcr.io/${LOWERCASE_REPOSITORY}/omnichannel-transcript-service:${DOCKER_TAG} diff --git a/docker-compose-local.yml b/docker-compose-local.yml index 917d9304370d8..9e5120759d696 100644 --- a/docker-compose-local.yml +++ b/docker-compose-local.yml @@ -4,9 +4,9 @@ services: rocketchat: platform: linux/amd64 build: - dockerfile: ${RC_DOCKERFILE} + dockerfile: apps/meteor/.docker/Dockerfile.alpine context: /tmp/build - image: ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${RC_DOCKER_TAG} + image: ghcr.io/${LOWERCASE_REPOSITORY}/rocket.chat:${DOCKER_TAG} environment: - TEST_MODE=true - EXIT_UNHANDLEDPROMISEREJECTION=true diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 3780a0ec5988c..2e3138f6912c2 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -33,7 +33,7 @@ "eventemitter3": "^5.0.1", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 1589198557a42..856f594b55781 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -31,7 +31,7 @@ "eventemitter3": "^5.0.1", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index ed655e07bc1ad..b4922d23f8328 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -33,7 +33,7 @@ "jaeger-client": "^3.19.0", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 6552e38b97e73..b25a265d81ccb 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -39,7 +39,7 @@ "moleculer": "^0.14.35", "moment-timezone": "^0.5.48", "mongo-message-queue": "^1.1.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index a25686bcb6d23..1731737f71c3f 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -31,7 +31,7 @@ "eventemitter3": "^5.0.1", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index 8b73d1342527d..7c225bd6b1814 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -33,7 +33,7 @@ "moleculer": "^0.14.35", "moment-timezone": "^0.5.48", "mongo-message-queue": "^1.1.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 3e6a18114ab4b..894b5338dd085 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -30,7 +30,7 @@ "eventemitter3": "^5.0.1", "mem": "^8.1.1", "moleculer": "^0.14.35", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "nats": "^2.28.2", "pino": "^8.21.0", "polka": "^0.5.2", diff --git a/ee/packages/federation-matrix/package.json b/ee/packages/federation-matrix/package.json index 3e90d6f4207c6..8b257b1c58f3b 100644 --- a/ee/packages/federation-matrix/package.json +++ b/ee/packages/federation-matrix/package.json @@ -46,7 +46,7 @@ "@rocket.chat/rest-typings": "workspace:^", "emojione": "^4.5.0", "marked": "^16.1.2", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "pino": "^9.11.0", "reflect-metadata": "^0.2.2", "sanitize-html": "~2.17.0", diff --git a/ee/packages/omni-core-ee/package.json b/ee/packages/omni-core-ee/package.json index 8faf0c4b53664..207c68706ccdd 100644 --- a/ee/packages/omni-core-ee/package.json +++ b/ee/packages/omni-core-ee/package.json @@ -30,7 +30,7 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/omni-core": "workspace:^", "mem": "^8.1.1", - "mongodb": "6.10.0" + "mongodb": "6.16.0" }, "volta": { "extends": "../../../package.json" diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index 82ccbaec70cf5..5dac2198d1e3d 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -33,7 +33,7 @@ "mem": "^8.1.1", "moment-timezone": "^0.5.48", "mongo-message-queue": "^1.1.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "pino": "^8.21.0" }, "scripts": { diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index d8f131ef2fcbd..ac335ea068e76 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -35,6 +35,6 @@ "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/models": "workspace:^", - "mongodb": "6.10.0" + "mongodb": "6.16.0" } } diff --git a/package.json b/package.json index fa2e640069817..88bcfb8eb3b53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "7.12.0-develop", + "version": "7.13.0-develop", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/agenda/package.json b/packages/agenda/package.json index 97a8844aaf6a1..fb3be8881dffd 100644 --- a/packages/agenda/package.json +++ b/packages/agenda/package.json @@ -9,7 +9,7 @@ "debug": "~4.3.7", "human-interval": "^2.0.1", "moment-timezone": "~0.5.48", - "mongodb": "6.10.0" + "mongodb": "6.16.0" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/packages/core-services/package.json b/packages/core-services/package.json index baafbe4f42795..ed4610f14dd6b 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -14,7 +14,7 @@ "babel-jest": "~30.2.0", "eslint": "~8.45.0", "jest": "~30.2.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "prettier": "~3.3.3", "typescript": "~5.9.3" }, diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index d4006cdb2dc65..f165120533de3 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -2,13 +2,13 @@ "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", "private": true, - "version": "7.12.0-develop", + "version": "7.13.0-develop", "devDependencies": { "@rocket.chat/apps-engine": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", "@types/express": "^4.17.23", "eslint": "~8.45.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "npm-run-all": "~4.1.5", "prettier": "~3.3.3", "rimraf": "^6.0.1", diff --git a/packages/core-typings/src/INotification.ts b/packages/core-typings/src/INotification.ts index c50dc3d3a4a22..1310d97ae4826 100644 --- a/packages/core-typings/src/INotification.ts +++ b/packages/core-typings/src/INotification.ts @@ -75,5 +75,6 @@ export interface ICalendarNotification { text: string; payload: { _id: ICalendarEvent['_id']; + startTimeUtc?: string; }; } diff --git a/packages/cron/package.json b/packages/cron/package.json index 1dbf65c305e2c..18fa2a777327c 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -23,7 +23,7 @@ "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/random": "workspace:^", - "mongodb": "6.10.0" + "mongodb": "6.16.0" }, "volta": { "extends": "../../package.json" diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index cc6963b29c974..0544a17de68bb 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -6,7 +6,7 @@ "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/tsconfig": "workspace:*", "eslint": "~8.45.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "prettier": "~3.3.3", "typescript": "~5.9.3" }, diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index b743bc19177f3..918845caafe40 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -5,7 +5,7 @@ "devDependencies": { "@types/node-rsa": "^1.1.4", "eslint": "~8.45.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "typescript": "~5.9.3" }, "scripts": { diff --git a/packages/mongo-adapter/package.json b/packages/mongo-adapter/package.json index 8c5edefd6ffa4..e8ee09a9101ce 100644 --- a/packages/mongo-adapter/package.json +++ b/packages/mongo-adapter/package.json @@ -19,7 +19,7 @@ "@rocket.chat/jest-presets": "workspace:~", "eslint": "~8.45.0", "jest": "~30.2.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "typescript": "~5.9.3" }, "peerDependencies": { diff --git a/packages/omni-core/package.json b/packages/omni-core/package.json index e1ce395091b18..5d41443a3b43d 100644 --- a/packages/omni-core/package.json +++ b/packages/omni-core/package.json @@ -31,6 +31,6 @@ "dependencies": { "@rocket.chat/models": "workspace:^", "@rocket.chat/patch-injection": "workspace:^", - "mongodb": "6.10.0" + "mongodb": "6.16.0" } } diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 896451a6cd7dc..77166faa02862 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/rest-typings", - "version": "7.12.0-develop", + "version": "7.13.0-develop", "devDependencies": { "@rocket.chat/apps-engine": "workspace:^", "@rocket.chat/eslint-config": "workspace:~", "@types/jest": "~30.0.0", "eslint": "~8.45.0", "jest": "~30.2.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "typescript": "~5.9.3" }, "scripts": { diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 13950fa150102..1fb920b467027 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -19,7 +19,7 @@ "eslint-plugin-react-hooks": "^5.0.0", "i18next": "~23.4.9", "jest": "~30.2.0", - "mongodb": "6.10.0", + "mongodb": "6.16.0", "react": "~18.3.1", "typescript": "~5.9.3" }, diff --git a/yarn.lock b/yarn.lock index ad901035c76fd..f05d70f69b326 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8016,7 +8016,7 @@ __metadata: eventemitter3: "npm:^5.0.1" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -8047,7 +8047,7 @@ __metadata: eslint: "npm:~8.45.0" human-interval: "npm:^2.0.1" moment-timezone: "npm:~0.5.48" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -8151,7 +8151,7 @@ __metadata: eventemitter3: "npm:^5.0.1" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -8214,7 +8214,7 @@ __metadata: babel-jest: "npm:~30.2.0" eslint: "npm:~8.45.0" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" prettier: "npm:~3.3.3" typescript: "npm:~5.9.3" languageName: unknown @@ -8231,7 +8231,7 @@ __metadata: "@rocket.chat/ui-kit": "workspace:~" "@types/express": "npm:^4.17.23" eslint: "npm:~8.45.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" npm-run-all: "npm:~4.1.5" prettier: "npm:~3.3.3" rimraf: "npm:^6.0.1" @@ -8251,7 +8251,7 @@ __metadata: "@rocket.chat/random": "workspace:^" "@rocket.chat/tsconfig": "workspace:*" eslint: "npm:~8.45.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -8333,7 +8333,7 @@ __metadata: jaeger-client: "npm:^3.19.0" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" pino-pretty: "npm:^7.6.1" @@ -8424,7 +8424,7 @@ __metadata: eslint: "npm:~8.45.0" jest: "npm:~30.2.0" marked: "npm:^16.1.2" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" pino: "npm:^9.11.0" pino-pretty: "npm:^7.6.1" reflect-metadata: "npm:^0.2.2" @@ -8774,7 +8774,7 @@ __metadata: "@rocket.chat/tracing": "workspace:^" "@rocket.chat/tsconfig": "workspace:*" eslint: "npm:~8.45.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" prettier: "npm:~3.3.3" typescript: "npm:~5.9.3" languageName: unknown @@ -9386,7 +9386,7 @@ __metadata: moment: "npm:^2.30.1" moment-timezone: "npm:^0.5.48" mongo-message-queue: "npm:^1.1.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" node-dogstatsd: "npm:^0.0.7" node-fetch: "npm:2.7.0" @@ -9520,7 +9520,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@types/node-rsa": "npm:^1.1.4" eslint: "npm:~8.45.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -9554,7 +9554,7 @@ __metadata: "@rocket.chat/jest-presets": "workspace:~" eslint: "npm:~8.45.0" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" peerDependencies: mongodb: 6.10.0 @@ -9605,7 +9605,7 @@ __metadata: eslint: "npm:~8.45.0" jest: "npm:~30.2.0" mem: "npm:^8.1.1" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -9623,7 +9623,7 @@ __metadata: "@types/jest": "npm:~30.0.0" eslint: "npm:~8.45.0" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -9659,7 +9659,7 @@ __metadata: mem: "npm:^8.1.1" moment-timezone: "npm:^0.5.48" mongo-message-queue: "npm:^1.1.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" pino: "npm:^8.21.0" typescript: "npm:~5.9.3" languageName: unknown @@ -9700,7 +9700,7 @@ __metadata: moleculer: "npm:^0.14.35" moment-timezone: "npm:^0.5.48" mongo-message-queue: "npm:^1.1.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -9848,7 +9848,7 @@ __metadata: eventemitter3: "npm:^5.0.1" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -9875,7 +9875,7 @@ __metadata: babel-jest: "npm:~30.2.0" eslint: "npm:~8.45.0" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -9916,7 +9916,7 @@ __metadata: moleculer: "npm:^0.14.35" moment-timezone: "npm:^0.5.48" mongo-message-queue: "npm:^1.1.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -9992,7 +9992,7 @@ __metadata: ajv-formats: "npm:^3.0.1" eslint: "npm:~8.45.0" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -10102,7 +10102,7 @@ __metadata: eventemitter3: "npm:^5.0.1" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" pino: "npm:^8.21.0" polka: "npm:^0.5.2" @@ -10327,7 +10327,7 @@ __metadata: eslint-plugin-react-hooks: "npm:^5.0.0" i18next: "npm:~23.4.9" jest: "npm:~30.2.0" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" react: "npm:~18.3.1" typescript: "npm:~5.9.3" peerDependencies: @@ -33862,7 +33862,7 @@ __metadata: jaeger-client: "npm:^3.19.0" mem: "npm:^8.1.1" moleculer: "npm:^0.14.35" - mongodb: "npm:6.10.0" + mongodb: "npm:6.16.0" nats: "npm:^2.28.2" npm-run-all: "npm:^4.1.5" pino: "npm:^8.21.0"