Openstatus www.openstatus.dev

fix: raw email for pause (#1660)

* raw email for pause

* ci: apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

authored by

Thibault Le Ouay
autofix-ci[bot]
and committed by
GitHub
ccc93778 83d2f62c

+181 -156
+1 -1
apps/server/.dockerignore
··· 1 - # This file is generated by Dofigen v2.6.0 1 + # This file is generated by Dofigen v2.5.1 2 2 # See https://github.com/lenra-io/dofigen 3 3 4 4 node_modules
+3 -4
apps/server/Dockerfile
··· 1 - # syntax=docker/dockerfile:1.19.0 2 - # This file is generated by Dofigen v2.6.0 1 + # syntax=docker/dockerfile:1.11 2 + # This file is generated by Dofigen v2.5.1 3 3 # See https://github.com/lenra-io/dofigen 4 4 5 5 # install ··· 12 12 RUN \ 13 13 --mount=type=bind,target=bunfig.toml,source=bunfig.toml \ 14 14 --mount=type=bind,target=package.json,source=package.json \ 15 - --mount=type=bind,target=patches,source=patches \ 16 15 --mount=type=bind,target=apps/server/package.json,source=apps/server/package.json \ 17 16 --mount=type=bind,target=packages/analytics/package.json,source=packages/analytics/package.json \ 18 17 --mount=type=bind,target=packages/db/package.json,source=packages/db/package.json \ ··· 49 48 # runtime 50 49 FROM debian@sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b AS runtime 51 50 LABEL \ 52 - io.dofigen.version="2.6.0" \ 51 + io.dofigen.version="2.5.1" \ 53 52 org.opencontainers.image.authors="OpenStatus Team" \ 54 53 org.opencontainers.image.base.digest="sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b" \ 55 54 org.opencontainers.image.base.name="docker.io/debian:bullseye-slim" \
+32 -35
apps/server/dofigen.lock
··· 10 10 - /packages/api 11 11 - /packages/integrations/vercel 12 12 builders: 13 - install: 13 + build: 14 14 fromImage: 15 15 path: oven/bun 16 16 digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 17 17 label: 18 + org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 19 + org.opencontainers.image.stage: build 18 20 org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 21 + workdir: /app/apps/server 22 + env: 23 + NODE_ENV: production 24 + copy: 25 + - paths: 26 + - . 27 + target: /app/ 28 + - fromBuilder: install 29 + paths: 30 + - /app/node_modules 31 + target: /app/node_modules 32 + run: 33 + - bun build --compile --sourcemap src/index.ts --outfile=app 34 + install: 35 + fromImage: 36 + path: oven/bun 37 + digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 38 + label: 19 39 org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 20 40 org.opencontainers.image.stage: install 41 + org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 21 42 workdir: /app/ 22 43 run: 23 44 - bun install --production --frozen-lockfile --verbose ··· 28 49 source: bunfig.toml 29 50 - target: package.json 30 51 source: package.json 31 - - target: patches 32 - source: patches 33 52 - target: apps/server/package.json 34 53 source: apps/server/package.json 35 54 - target: packages/analytics/package.json ··· 56 75 source: packages/assertions/package.json 57 76 - target: packages/theme-store/package.json 58 77 source: packages/theme-store/package.json 59 - build: 60 - fromImage: 61 - path: oven/bun 62 - digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 63 - label: 64 - org.opencontainers.image.stage: build 65 - org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 66 - org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 67 - workdir: /app/apps/server 68 - env: 69 - NODE_ENV: production 70 - copy: 71 - - paths: 72 - - . 73 - target: /app/ 74 - - fromBuilder: install 75 - paths: 76 - - /app/node_modules 77 - target: /app/node_modules 78 - run: 79 - - bun build --compile --sourcemap src/index.ts --outfile=app 80 78 fromImage: 81 79 path: debian 82 80 digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 83 81 label: 84 - org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus 85 82 org.opencontainers.image.vendor: OpenStatus 86 - org.opencontainers.image.base.name: docker.io/debian:bullseye-slim 87 - org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 88 83 org.opencontainers.image.description: REST API server with Hono framework for OpenStatus 84 + org.opencontainers.image.authors: OpenStatus Team 85 + org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus 89 86 org.opencontainers.image.title: OpenStatus Server 90 - io.dofigen.version: 2.6.0 91 - org.opencontainers.image.authors: OpenStatus Team 87 + org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 88 + io.dofigen.version: 2.5.1 89 + org.opencontainers.image.base.name: docker.io/debian:bullseye-slim 92 90 user: 93 91 user: '1000' 94 92 group: '1000' ··· 115 113 retries: 3 116 114 images: 117 115 docker.io: 118 - oven: 119 - bun: 120 - 1.3.3: 121 - digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 122 116 library: 123 117 debian: 124 118 bullseye-slim: 125 119 digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 120 + oven: 121 + bun: 122 + 1.3.3: 123 + digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 126 124 resources: 127 125 dofigen.yml: 128 - hash: 792c6663065e391b2fc4c3dfc18eedc3c7777b3244674f74651bba79f9ea05cb 126 + hash: f2069730c7b0f5e8be704cbfc3ae77ac031f05b2a3b916bcbe758f7955edfa5e 129 127 content: | 130 128 # Files to exclude from Docker context 131 129 ignore: ··· 149 147 bind: 150 148 - bunfig.toml 151 149 - package.json 152 - - patches 153 150 - apps/server/package.json 154 151 - packages/analytics/package.json 155 152 - packages/db/package.json
-1
apps/server/dofigen.yml
··· 20 20 bind: 21 21 - bunfig.toml 22 22 - package.json 23 - - patches 24 23 - apps/server/package.json 25 24 - packages/analytics/package.json 26 25 - packages/db/package.json
+1 -1
apps/workflows/.dockerignore
··· 1 - # This file is generated by Dofigen v2.6.0 1 + # This file is generated by Dofigen v2.5.1 2 2 # See https://github.com/lenra-io/dofigen 3 3 4 4 node_modules
+3 -4
apps/workflows/Dockerfile
··· 1 - # syntax=docker/dockerfile:1.19.0 2 - # This file is generated by Dofigen v2.6.0 1 + # syntax=docker/dockerfile:1.11 2 + # This file is generated by Dofigen v2.5.1 3 3 # See https://github.com/lenra-io/dofigen 4 4 5 5 # ca-certs ··· 30 30 RUN \ 31 31 --mount=type=bind,target=bunfig.toml,source=bunfig.toml \ 32 32 --mount=type=bind,target=package.json,source=package.json \ 33 - --mount=type=bind,target=patches,source=patches \ 34 33 --mount=type=bind,target=apps/workflows/package.json,source=apps/workflows/package.json \ 35 34 --mount=type=bind,target=packages/assertions/package.json,source=packages/assertions/package.json \ 36 35 --mount=type=bind,target=packages/db/package.json,source=packages/db/package.json \ ··· 86 85 # runtime 87 86 FROM debian@sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b AS runtime 88 87 LABEL \ 89 - io.dofigen.version="2.6.0" \ 88 + io.dofigen.version="2.5.1" \ 90 89 org.opencontainers.image.authors="OpenStatus Team" \ 91 90 org.opencontainers.image.base.digest="sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b" \ 92 91 org.opencontainers.image.base.name="docker.io/debian:bullseye-slim" \
+50 -53
apps/workflows/dofigen.lock
··· 12 12 - /packages/error 13 13 - /packages/tracker 14 14 builders: 15 - ca-certs: 15 + build: 16 16 fromImage: 17 - path: debian 18 - digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 17 + path: oven/bun 18 + digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 19 19 label: 20 - org.opencontainers.image.base.name: docker.io/debian:bullseye-slim 21 - org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 20 + org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 21 + org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 22 + org.opencontainers.image.stage: build 23 + workdir: /app/apps/workflows 24 + env: 25 + NODE_ENV: production 26 + copy: 27 + - paths: 28 + - . 29 + target: /app/ 30 + - fromBuilder: install 31 + paths: 32 + - /app/node_modules 33 + target: /app/node_modules 22 34 run: 23 - - apt update && apt install -y ca-certificates && update-ca-certificates 35 + - bun build --compile --target bun --sourcemap --format=cjs src/index.ts --outfile=app --external '@libsql/*' --external libsql 36 + libsql: 37 + fromImage: 38 + path: oven/bun 39 + digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 40 + label: 41 + org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 42 + org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 43 + workdir: /app/ 44 + copy: 45 + - fromBuilder: docker 46 + paths: 47 + - /app/apps/build-docker/package.json 48 + target: /app/package.json 49 + run: 50 + - bun install 24 51 install: 25 52 fromImage: 26 53 path: oven/bun ··· 39 66 source: bunfig.toml 40 67 - target: package.json 41 68 source: package.json 42 - - target: patches 43 - source: patches 44 69 - target: apps/workflows/package.json 45 70 source: apps/workflows/package.json 46 71 - target: packages/assertions/package.json ··· 81 106 source: packages/upstash/package.json 82 107 - target: packages/theme-store/package.json 83 108 source: packages/theme-store/package.json 84 - libsql: 109 + ca-certs: 85 110 fromImage: 86 - path: oven/bun 87 - digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 111 + path: debian 112 + digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 88 113 label: 89 - org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 90 - org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 91 - workdir: /app/ 92 - copy: 93 - - fromBuilder: docker 94 - paths: 95 - - /app/apps/build-docker/package.json 96 - target: /app/package.json 114 + org.opencontainers.image.base.name: docker.io/debian:bullseye-slim 115 + org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 97 116 run: 98 - - bun install 117 + - apt update && apt install -y ca-certificates && update-ca-certificates 99 118 docker: 100 119 fromImage: 101 120 path: oven/bun 102 121 digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 103 122 label: 104 - org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 105 123 org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 124 + org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 106 125 workdir: /app/apps/workflows 107 126 copy: 108 127 - paths: ··· 110 129 target: /app/ 111 130 run: 112 131 - bun run src/build-docker.ts 113 - build: 114 - fromImage: 115 - path: oven/bun 116 - digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 117 - label: 118 - org.opencontainers.image.base.digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 119 - org.opencontainers.image.stage: build 120 - org.opencontainers.image.base.name: docker.io/oven/bun:1.3.3 121 - workdir: /app/apps/workflows 122 - env: 123 - NODE_ENV: production 124 - copy: 125 - - paths: 126 - - . 127 - target: /app/ 128 - - fromBuilder: install 129 - paths: 130 - - /app/node_modules 131 - target: /app/node_modules 132 - run: 133 - - bun build --compile --target bun --sourcemap --format=cjs src/index.ts --outfile=app --external '@libsql/*' --external libsql 134 132 fromImage: 135 133 path: debian 136 134 digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 137 135 label: 138 - io.dofigen.version: 2.6.0 139 - org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 140 - org.opencontainers.image.title: OpenStatus Workflows 136 + org.opencontainers.image.authors: OpenStatus Team 141 137 org.opencontainers.image.source: https://github.com/openstatusHQ/openstatus 142 138 org.opencontainers.image.base.name: docker.io/debian:bullseye-slim 139 + org.opencontainers.image.base.digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 140 + org.opencontainers.image.description: Background job processing and probe scheduling for OpenStatus 143 141 org.opencontainers.image.vendor: OpenStatus 144 - org.opencontainers.image.authors: OpenStatus Team 145 - org.opencontainers.image.description: Background job processing and probe scheduling for OpenStatus 142 + org.opencontainers.image.title: OpenStatus Workflows 143 + io.dofigen.version: 2.5.1 146 144 workdir: /app/ 147 145 copy: 148 146 - fromBuilder: build ··· 168 166 - port: 3000 169 167 images: 170 168 docker.io: 171 - library: 172 - debian: 173 - bullseye-slim: 174 - digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 175 169 oven: 176 170 bun: 177 171 1.3.3: 178 172 digest: sha256:fbf8e67e9d3b806c86be7a2f2e9bae801f2d9212a21db4dcf8cc9889f5a3c9c4 173 + library: 174 + debian: 175 + bullseye-slim: 176 + digest: sha256:530a3348fc4b5734ffe1a137ddbcee6850154285251b53c3425c386ea8fac77b 179 177 resources: 180 178 dofigen.yml: 181 - hash: 2e5154caff216dd012001bfb09b4c3d811dc7cbd437cd325f6de9c311b2e771e 179 + hash: 7e59e1efd94f649c01720f89c8966945798a8a0c4572e2fb783d6e406e5384c4 182 180 content: | 183 181 ignore: 184 182 - node_modules ··· 201 199 bind: 202 200 - bunfig.toml 203 201 - package.json 204 - - patches 205 202 - apps/workflows/package.json 206 203 - packages/assertions/package.json 207 204 - packages/db/package.json
-1
apps/workflows/dofigen.yml
··· 19 19 bind: 20 20 - bunfig.toml 21 21 - package.json 22 - - patches 23 22 - apps/workflows/package.json 24 23 - packages/assertions/package.json 25 24 - packages/db/package.json
+38 -30
apps/workflows/src/cron/monitor.ts
··· 13 13 } from "@openstatus/db"; 14 14 import { session, user } from "@openstatus/db/src/schema"; 15 15 import { 16 - MonitorDeactivationEmail, 17 - MonitorPausedEmail, 16 + monitorDeactivationEmail, 17 + monitorPausedEmail, 18 18 } from "@openstatus/emails"; 19 - import { sendWithRender } from "@openstatus/emails/src/send"; 19 + import { sendBatchEmailHtml } from "@openstatus/emails/src/send"; 20 20 import { Redis } from "@openstatus/upstash"; 21 21 import { RateLimiter } from "limiter"; 22 22 import { z } from "zod"; ··· 194 194 // TODO: Send email 195 195 196 196 if (user.email) { 197 - await sendWithRender({ 198 - to: [user.email], 199 - subject: "Your OpenStatus monitors will be paused soon", 200 - from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 201 - reply_to: "thibault@openstatus.dev", 202 - 203 - react: MonitorDeactivationEmail({ 204 - deactivateAt: new Date(new Date().setDate(new Date().getDate() + 14)), 205 - }), 206 - }); 197 + await sendBatchEmailHtml([ 198 + { 199 + to: user.email, 200 + subject: "Your OpenStatus monitors will be paused in 14 days", 201 + from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 202 + reply_to: "thibault@openstatus.dev", 203 + html: monitorDeactivationEmail({ 204 + date: new Date( 205 + new Date().setDate(new Date().getDate() + 14), 206 + ).toDateString(), 207 + }), 208 + }, 209 + ]); 207 210 208 211 await CreateTask({ 209 212 parent, ··· 231 234 const user = await getUser(userId); 232 235 233 236 if (user.email) { 234 - await sendWithRender({ 235 - to: [user.email], 236 - subject: "Your OpenStatus monitors will be paused in 3 days", 237 - from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 238 - reply_to: "thibault@openstatus.dev", 239 - 240 - react: MonitorDeactivationEmail({ 241 - deactivateAt: new Date(new Date().setDate(new Date().getDate() + 3)), 242 - }), 243 - }); 237 + await sendBatchEmailHtml([ 238 + { 239 + to: user.email, 240 + subject: "Your OpenStatus monitors will be paused in 3 days", 241 + from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 242 + reply_to: "thibault@openstatus.dev", 243 + html: monitorDeactivationEmail({ 244 + date: new Date( 245 + new Date().setDate(new Date().getDate() + 3), 246 + ).toDateString(), 247 + }), 248 + }, 249 + ]); 244 250 } 245 251 246 252 // Send second email ··· 303 309 // Remove user for workflow 304 310 305 311 if (currentUser.email) { 306 - await sendWithRender({ 307 - to: [currentUser.email], 308 - subject: "Your monitors have been paused", 309 - from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 310 - reply_to: "thibault@openstatus.dev", 311 - react: MonitorPausedEmail(), 312 - }); 312 + await sendBatchEmailHtml([ 313 + { 314 + to: currentUser.email, 315 + subject: "Your monitors have been paused", 316 + from: "Thibault From OpenStatus <thibault@notifications.openstatus.dev>", 317 + reply_to: "thibault@openstatus.dev", 318 + html: monitorPausedEmail(), 319 + }, 320 + ]); 313 321 } 314 322 await redis.srem("workflow:users", userId); 315 323 }
+1 -4
package.json
··· 32 32 } 33 33 }, 34 34 "name": "openstatus", 35 - "workspaces": ["apps/*", "packages/**/*"], 36 - "patchedDependencies": { 37 - "@react-email/render@2.0.0": "patches/@react-email%2Frender@2.0.0.patch" 38 - } 35 + "workspaces": ["apps/*", "packages/**/*"] 39 36 }
-2
packages/emails/hotfix/monitor-alert.ts
··· 18 18 <ul> 19 19 <li>URL: ${props.url || "N/A"}</li> 20 20 <li>Status: ${props.status || "N/A"}</li> 21 - <li>Latency: ${props.latency || "N/A"}</li> 22 - <li>Region: ${props.region || "N/A"}</li> 23 21 <li>Timestamp: ${props.timestamp || "N/A"}</li> 24 22 <li>Message: ${props.message || "N/A"}</li> 25 23 </ul>
+26
packages/emails/hotfix/monitor-deactivation.ts
··· 1 + interface MonitorDeactivationEmailProps { 2 + date: string; 3 + } 4 + 5 + export const monitorDeactivationEmail = ( 6 + props: MonitorDeactivationEmailProps, 7 + ) => { 8 + return ` 9 + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 10 + <html xmlns="http://www.w3.org/1999/xhtml"> 11 + <head> 12 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 13 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 14 + <title>Login to your OpenStatus account to keep your monitors active.</title> 15 + <style> 16 + body { 17 + font-family: Arial, sans-serif; 18 + } 19 + </style> 20 + </head> 21 + <body> 22 + <p>Hello, </p><p>To save on cloud resources and avoid having stale monitors. We are deactivating monitors for free account if you have not logged in for the last 2 months.</p><p>Your monitor(s) will be deactivated on ${props.date}</p><p>If you would like to keep your monitor(s) active, please login to your account or upgrade to a paid plan.</p><p>If you have any questions, please reply to this email.</p><p>Merci,</p><p>Thibault</p> 23 + </body> 24 + </html> 25 + `; 26 + };
+21
packages/emails/hotfix/monitor-paused.ts
··· 1 + export const monitorPausedEmail = () => { 2 + return ` 3 + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 + <html xmlns="http://www.w3.org/1999/xhtml"> 5 + <head> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 8 + <title>Your monitors have been paused</title> 9 + <style> 10 + body { 11 + font-family: Arial, sans-serif; 12 + } 13 + </style> 14 + </head> 15 + <body> 16 + <p>Hello, </p><p>To save on cloud resources, your monitor(s) has been paused due to inactivity.</p><p>If you would like to unpause your monitor(s), please login to your account or upgrade to a paid plan.</p><p>If you have any questions, please reply to this email.</p><p>Merci,</p><p>Thibault</p> 17 + </body> 18 + </html> 19 + 20 + `; 21 + };
+2
packages/emails/src/index.ts
··· 5 5 export { default as MonitorPausedEmail } from "../emails/monitor-paused"; 6 6 export { default as MonitorDeactivationEmail } from "../emails/monitor-deactivation"; 7 7 8 + export { monitorDeactivationEmail } from "../hotfix/monitor-deactivation"; 9 + export { monitorPausedEmail } from "../hotfix/monitor-paused"; 8 10 export { sendEmail, sendEmailHtml, sendBatchEmailHtml } from "./send"; 9 11 10 12 export { EmailClient } from "./client";
+1
packages/emails/src/send.ts
··· 19 19 subject: string; 20 20 to: string; 21 21 from: string; 22 + reply_to?: string; 22 23 }; 23 24 export const sendEmail = async (email: Emails) => { 24 25 if (process.env.NODE_ENV !== "production") return;
-20
patches/@react-email%2Frender@2.0.0.patch
··· 1 - diff --git a/dist/node/index.mjs b/dist/node/index.mjs 2 - index a4cc76316326b3c5a60e00416321355f5782797e..edac4c159b3bb0990f1cd19eaf9d38a4807a38b2 100644 3 - --- a/dist/node/index.mjs 4 - +++ b/dist/node/index.mjs 5 - @@ -4,6 +4,7 @@ import { convert } from "html-to-text"; 6 - import { Suspense } from "react"; 7 - import { Writable } from "node:stream"; 8 - import { jsx } from "react/jsx-runtime"; 9 - +import reactDOMServer from "react-dom/server"; 10 - 11 - //#region src/shared/utils/pretty.ts 12 - function recursivelyMapDoc(doc, callback) { 13 - @@ -125,7 +126,6 @@ const readStream = async (stream) => { 14 - //#region src/node/render.tsx 15 - const render = async (node, options) => { 16 - const suspendedElement = /* @__PURE__ */ jsx(Suspense, { children: node }); 17 - - const reactDOMServer = await import("react-dom/server").then((m) => m.default); 18 - let html$1; 19 - if (Object.hasOwn(reactDOMServer, "renderToReadableStream") && typeof WritableStream !== "undefined") html$1 = await readStream(await reactDOMServer.renderToReadableStream(suspendedElement, { progressiveChunkSize: Number.POSITIVE_INFINITY })); 20 - else await new Promise((resolve, reject) => {
+2
pnpm-lock.yaml
··· 1747 1747 specifier: 5.9.3 1748 1748 version: 5.9.3 1749 1749 1750 + packages/react/dist: {} 1751 + 1750 1752 packages/regions: 1751 1753 dependencies: 1752 1754 zod: