├── .gitignore ├── LICENSE ├── README.md ├── app └── api │ └── send │ └── route.ts ├── package.json ├── pnpm-lock.yaml ├── renovate.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | .next 3 | .vercel 4 | node_modules 5 | next-env.d.ts -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Plus Five Five, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Resend with Vercel Functions 2 | 3 | This example shows how to use Resend with [Vercel Functions](https://vercel.com/docs/functions). 4 | 5 | ## Prerequisites 6 | 7 | To get the most out of this guide, you’ll need to: 8 | 9 | - [Create an API key](https://resend.com/api-keys) 10 | - [Verify your domain](https://resend.com/domains) 11 | 12 | ## Instructions 13 | 14 | 1. Install dependencies: 15 | 16 | ```sh 17 | pnpm install 18 | ``` 19 | 20 | 2. Run Next.js locally: 21 | 22 | ```sh 23 | pnpm run dev 24 | ``` 25 | 26 | 3. Open URL in the browser: 27 | 28 | ``` 29 | http://localhost:3000/api/send 30 | ``` 31 | 32 | ## License 33 | 34 | MIT License 35 | -------------------------------------------------------------------------------- /app/api/send/route.ts: -------------------------------------------------------------------------------- 1 | const RESEND_API_KEY = 're_123456789'; 2 | 3 | export async function POST() { 4 | const res = await fetch('https://api.resend.com/emails', { 5 | method: 'POST', 6 | headers: { 7 | 'Content-Type': 'application/json', 8 | Authorization: `Bearer ${RESEND_API_KEY}`, 9 | }, 10 | body: JSON.stringify({ 11 | from: 'Acme ', 12 | to: ['delivered@resend.dev'], 13 | subject: 'hello world', 14 | html: 'it works!', 15 | }), 16 | }); 17 | 18 | if (res.ok) { 19 | const data = await res.json(); 20 | return Response.json(data); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev --turbo", 5 | "build": "next build", 6 | "start": "next start" 7 | }, 8 | "dependencies": { 9 | "next": "^14.2.3", 10 | "react": "^18.3.1", 11 | "react-dom": "^18.3.1", 12 | "resend": "^3.2.0" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "20.14.2", 16 | "@types/react": "18.3.3", 17 | "typescript": "5.4.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | next: 9 | specifier: ^14.2.3 10 | version: 14.2.3(react-dom@18.3.1)(react@18.3.1) 11 | react: 12 | specifier: ^18.3.1 13 | version: 18.3.1 14 | react-dom: 15 | specifier: ^18.3.1 16 | version: 18.3.1(react@18.3.1) 17 | resend: 18 | specifier: ^3.2.0 19 | version: 3.2.0 20 | 21 | devDependencies: 22 | '@types/node': 23 | specifier: 20.14.2 24 | version: 20.14.2 25 | '@types/react': 26 | specifier: 18.3.3 27 | version: 18.3.3 28 | typescript: 29 | specifier: 5.4.5 30 | version: 5.4.5 31 | 32 | packages: 33 | 34 | /@isaacs/cliui@8.0.2: 35 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 36 | engines: {node: '>=12'} 37 | dependencies: 38 | string-width: 5.1.2 39 | string-width-cjs: /string-width@4.2.3 40 | strip-ansi: 7.1.0 41 | strip-ansi-cjs: /strip-ansi@6.0.1 42 | wrap-ansi: 8.1.0 43 | wrap-ansi-cjs: /wrap-ansi@7.0.0 44 | dev: false 45 | 46 | /@next/env@14.2.3: 47 | resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} 48 | dev: false 49 | 50 | /@next/swc-darwin-arm64@14.2.3: 51 | resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} 52 | engines: {node: '>= 10'} 53 | cpu: [arm64] 54 | os: [darwin] 55 | requiresBuild: true 56 | dev: false 57 | optional: true 58 | 59 | /@next/swc-darwin-x64@14.2.3: 60 | resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} 61 | engines: {node: '>= 10'} 62 | cpu: [x64] 63 | os: [darwin] 64 | requiresBuild: true 65 | dev: false 66 | optional: true 67 | 68 | /@next/swc-linux-arm64-gnu@14.2.3: 69 | resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} 70 | engines: {node: '>= 10'} 71 | cpu: [arm64] 72 | os: [linux] 73 | requiresBuild: true 74 | dev: false 75 | optional: true 76 | 77 | /@next/swc-linux-arm64-musl@14.2.3: 78 | resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} 79 | engines: {node: '>= 10'} 80 | cpu: [arm64] 81 | os: [linux] 82 | requiresBuild: true 83 | dev: false 84 | optional: true 85 | 86 | /@next/swc-linux-x64-gnu@14.2.3: 87 | resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} 88 | engines: {node: '>= 10'} 89 | cpu: [x64] 90 | os: [linux] 91 | requiresBuild: true 92 | dev: false 93 | optional: true 94 | 95 | /@next/swc-linux-x64-musl@14.2.3: 96 | resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} 97 | engines: {node: '>= 10'} 98 | cpu: [x64] 99 | os: [linux] 100 | requiresBuild: true 101 | dev: false 102 | optional: true 103 | 104 | /@next/swc-win32-arm64-msvc@14.2.3: 105 | resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} 106 | engines: {node: '>= 10'} 107 | cpu: [arm64] 108 | os: [win32] 109 | requiresBuild: true 110 | dev: false 111 | optional: true 112 | 113 | /@next/swc-win32-ia32-msvc@14.2.3: 114 | resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} 115 | engines: {node: '>= 10'} 116 | cpu: [ia32] 117 | os: [win32] 118 | requiresBuild: true 119 | dev: false 120 | optional: true 121 | 122 | /@next/swc-win32-x64-msvc@14.2.3: 123 | resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} 124 | engines: {node: '>= 10'} 125 | cpu: [x64] 126 | os: [win32] 127 | requiresBuild: true 128 | dev: false 129 | optional: true 130 | 131 | /@one-ini/wasm@0.1.1: 132 | resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} 133 | dev: false 134 | 135 | /@pkgjs/parseargs@0.11.0: 136 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 137 | engines: {node: '>=14'} 138 | requiresBuild: true 139 | dev: false 140 | optional: true 141 | 142 | /@react-email/render@0.0.12: 143 | resolution: {integrity: sha512-S8WRv/PqECEi6x0QJBj0asnAb5GFtJaHlnByxLETLkgJjc76cxMYDH4r9wdbuJ4sjkcbpwP3LPnVzwS+aIjT7g==} 144 | engines: {node: '>=18.0.0'} 145 | dependencies: 146 | html-to-text: 9.0.5 147 | js-beautify: 1.15.1 148 | react: 18.2.0 149 | react-dom: 18.2.0(react@18.2.0) 150 | dev: false 151 | 152 | /@selderee/plugin-htmlparser2@0.11.0: 153 | resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} 154 | dependencies: 155 | domhandler: 5.0.3 156 | selderee: 0.11.0 157 | dev: false 158 | 159 | /@swc/counter@0.1.3: 160 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 161 | dev: false 162 | 163 | /@swc/helpers@0.5.5: 164 | resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 165 | dependencies: 166 | '@swc/counter': 0.1.3 167 | tslib: 2.6.3 168 | dev: false 169 | 170 | /@types/node@20.14.2: 171 | resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} 172 | dependencies: 173 | undici-types: 5.26.5 174 | dev: true 175 | 176 | /@types/prop-types@15.7.12: 177 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 178 | dev: true 179 | 180 | /@types/react@18.3.3: 181 | resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} 182 | dependencies: 183 | '@types/prop-types': 15.7.12 184 | csstype: 3.1.3 185 | dev: true 186 | 187 | /abbrev@2.0.0: 188 | resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} 189 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 190 | dev: false 191 | 192 | /ansi-regex@5.0.1: 193 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 194 | engines: {node: '>=8'} 195 | dev: false 196 | 197 | /ansi-regex@6.0.1: 198 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 199 | engines: {node: '>=12'} 200 | dev: false 201 | 202 | /ansi-styles@4.3.0: 203 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 204 | engines: {node: '>=8'} 205 | dependencies: 206 | color-convert: 2.0.1 207 | dev: false 208 | 209 | /ansi-styles@6.2.1: 210 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 211 | engines: {node: '>=12'} 212 | dev: false 213 | 214 | /balanced-match@1.0.2: 215 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 216 | dev: false 217 | 218 | /brace-expansion@2.0.1: 219 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 220 | dependencies: 221 | balanced-match: 1.0.2 222 | dev: false 223 | 224 | /busboy@1.6.0: 225 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 226 | engines: {node: '>=10.16.0'} 227 | dependencies: 228 | streamsearch: 1.1.0 229 | dev: false 230 | 231 | /caniuse-lite@1.0.30001629: 232 | resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} 233 | dev: false 234 | 235 | /client-only@0.0.1: 236 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 237 | dev: false 238 | 239 | /color-convert@2.0.1: 240 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 241 | engines: {node: '>=7.0.0'} 242 | dependencies: 243 | color-name: 1.1.4 244 | dev: false 245 | 246 | /color-name@1.1.4: 247 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 248 | dev: false 249 | 250 | /commander@10.0.1: 251 | resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 252 | engines: {node: '>=14'} 253 | dev: false 254 | 255 | /config-chain@1.1.13: 256 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 257 | dependencies: 258 | ini: 1.3.8 259 | proto-list: 1.2.4 260 | dev: false 261 | 262 | /cross-spawn@7.0.3: 263 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 264 | engines: {node: '>= 8'} 265 | dependencies: 266 | path-key: 3.1.1 267 | shebang-command: 2.0.0 268 | which: 2.0.2 269 | dev: false 270 | 271 | /csstype@3.1.3: 272 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 273 | dev: true 274 | 275 | /deepmerge@4.3.1: 276 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 277 | engines: {node: '>=0.10.0'} 278 | dev: false 279 | 280 | /dom-serializer@2.0.0: 281 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 282 | dependencies: 283 | domelementtype: 2.3.0 284 | domhandler: 5.0.3 285 | entities: 4.5.0 286 | dev: false 287 | 288 | /domelementtype@2.3.0: 289 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 290 | dev: false 291 | 292 | /domhandler@5.0.3: 293 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 294 | engines: {node: '>= 4'} 295 | dependencies: 296 | domelementtype: 2.3.0 297 | dev: false 298 | 299 | /domutils@3.1.0: 300 | resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 301 | dependencies: 302 | dom-serializer: 2.0.0 303 | domelementtype: 2.3.0 304 | domhandler: 5.0.3 305 | dev: false 306 | 307 | /eastasianwidth@0.2.0: 308 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 309 | dev: false 310 | 311 | /editorconfig@1.0.4: 312 | resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} 313 | engines: {node: '>=14'} 314 | hasBin: true 315 | dependencies: 316 | '@one-ini/wasm': 0.1.1 317 | commander: 10.0.1 318 | minimatch: 9.0.1 319 | semver: 7.6.2 320 | dev: false 321 | 322 | /emoji-regex@8.0.0: 323 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 324 | dev: false 325 | 326 | /emoji-regex@9.2.2: 327 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 328 | dev: false 329 | 330 | /entities@4.5.0: 331 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 332 | engines: {node: '>=0.12'} 333 | dev: false 334 | 335 | /foreground-child@3.1.1: 336 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 337 | engines: {node: '>=14'} 338 | dependencies: 339 | cross-spawn: 7.0.3 340 | signal-exit: 4.1.0 341 | dev: false 342 | 343 | /glob@10.4.1: 344 | resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} 345 | engines: {node: '>=16 || 14 >=14.18'} 346 | hasBin: true 347 | dependencies: 348 | foreground-child: 3.1.1 349 | jackspeak: 3.4.0 350 | minimatch: 9.0.4 351 | minipass: 7.1.2 352 | path-scurry: 1.11.1 353 | dev: false 354 | 355 | /graceful-fs@4.2.11: 356 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 357 | dev: false 358 | 359 | /html-to-text@9.0.5: 360 | resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} 361 | engines: {node: '>=14'} 362 | dependencies: 363 | '@selderee/plugin-htmlparser2': 0.11.0 364 | deepmerge: 4.3.1 365 | dom-serializer: 2.0.0 366 | htmlparser2: 8.0.2 367 | selderee: 0.11.0 368 | dev: false 369 | 370 | /htmlparser2@8.0.2: 371 | resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 372 | dependencies: 373 | domelementtype: 2.3.0 374 | domhandler: 5.0.3 375 | domutils: 3.1.0 376 | entities: 4.5.0 377 | dev: false 378 | 379 | /ini@1.3.8: 380 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 381 | dev: false 382 | 383 | /is-fullwidth-code-point@3.0.0: 384 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 385 | engines: {node: '>=8'} 386 | dev: false 387 | 388 | /isexe@2.0.0: 389 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 390 | dev: false 391 | 392 | /jackspeak@3.4.0: 393 | resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} 394 | engines: {node: '>=14'} 395 | dependencies: 396 | '@isaacs/cliui': 8.0.2 397 | optionalDependencies: 398 | '@pkgjs/parseargs': 0.11.0 399 | dev: false 400 | 401 | /js-beautify@1.15.1: 402 | resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} 403 | engines: {node: '>=14'} 404 | hasBin: true 405 | dependencies: 406 | config-chain: 1.1.13 407 | editorconfig: 1.0.4 408 | glob: 10.4.1 409 | js-cookie: 3.0.5 410 | nopt: 7.2.1 411 | dev: false 412 | 413 | /js-cookie@3.0.5: 414 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 415 | engines: {node: '>=14'} 416 | dev: false 417 | 418 | /js-tokens@4.0.0: 419 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 420 | dev: false 421 | 422 | /leac@0.6.0: 423 | resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} 424 | dev: false 425 | 426 | /loose-envify@1.4.0: 427 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 428 | hasBin: true 429 | dependencies: 430 | js-tokens: 4.0.0 431 | dev: false 432 | 433 | /lru-cache@10.2.2: 434 | resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} 435 | engines: {node: 14 || >=16.14} 436 | dev: false 437 | 438 | /minimatch@9.0.1: 439 | resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} 440 | engines: {node: '>=16 || 14 >=14.17'} 441 | dependencies: 442 | brace-expansion: 2.0.1 443 | dev: false 444 | 445 | /minimatch@9.0.4: 446 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 447 | engines: {node: '>=16 || 14 >=14.17'} 448 | dependencies: 449 | brace-expansion: 2.0.1 450 | dev: false 451 | 452 | /minipass@7.1.2: 453 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 454 | engines: {node: '>=16 || 14 >=14.17'} 455 | dev: false 456 | 457 | /nanoid@3.3.7: 458 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 459 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 460 | hasBin: true 461 | dev: false 462 | 463 | /next@14.2.3(react-dom@18.3.1)(react@18.3.1): 464 | resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} 465 | engines: {node: '>=18.17.0'} 466 | hasBin: true 467 | peerDependencies: 468 | '@opentelemetry/api': ^1.1.0 469 | '@playwright/test': ^1.41.2 470 | react: ^18.2.0 471 | react-dom: ^18.2.0 472 | sass: ^1.3.0 473 | peerDependenciesMeta: 474 | '@opentelemetry/api': 475 | optional: true 476 | '@playwright/test': 477 | optional: true 478 | sass: 479 | optional: true 480 | dependencies: 481 | '@next/env': 14.2.3 482 | '@swc/helpers': 0.5.5 483 | busboy: 1.6.0 484 | caniuse-lite: 1.0.30001629 485 | graceful-fs: 4.2.11 486 | postcss: 8.4.31 487 | react: 18.3.1 488 | react-dom: 18.3.1(react@18.3.1) 489 | styled-jsx: 5.1.1(react@18.3.1) 490 | optionalDependencies: 491 | '@next/swc-darwin-arm64': 14.2.3 492 | '@next/swc-darwin-x64': 14.2.3 493 | '@next/swc-linux-arm64-gnu': 14.2.3 494 | '@next/swc-linux-arm64-musl': 14.2.3 495 | '@next/swc-linux-x64-gnu': 14.2.3 496 | '@next/swc-linux-x64-musl': 14.2.3 497 | '@next/swc-win32-arm64-msvc': 14.2.3 498 | '@next/swc-win32-ia32-msvc': 14.2.3 499 | '@next/swc-win32-x64-msvc': 14.2.3 500 | transitivePeerDependencies: 501 | - '@babel/core' 502 | - babel-plugin-macros 503 | dev: false 504 | 505 | /nopt@7.2.1: 506 | resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} 507 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 508 | hasBin: true 509 | dependencies: 510 | abbrev: 2.0.0 511 | dev: false 512 | 513 | /parseley@0.12.1: 514 | resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} 515 | dependencies: 516 | leac: 0.6.0 517 | peberminta: 0.9.0 518 | dev: false 519 | 520 | /path-key@3.1.1: 521 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 522 | engines: {node: '>=8'} 523 | dev: false 524 | 525 | /path-scurry@1.11.1: 526 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 527 | engines: {node: '>=16 || 14 >=14.18'} 528 | dependencies: 529 | lru-cache: 10.2.2 530 | minipass: 7.1.2 531 | dev: false 532 | 533 | /peberminta@0.9.0: 534 | resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} 535 | dev: false 536 | 537 | /picocolors@1.0.1: 538 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 539 | dev: false 540 | 541 | /postcss@8.4.31: 542 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 543 | engines: {node: ^10 || ^12 || >=14} 544 | dependencies: 545 | nanoid: 3.3.7 546 | picocolors: 1.0.1 547 | source-map-js: 1.2.0 548 | dev: false 549 | 550 | /proto-list@1.2.4: 551 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 552 | dev: false 553 | 554 | /react-dom@18.2.0(react@18.2.0): 555 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 556 | peerDependencies: 557 | react: ^18.2.0 558 | dependencies: 559 | loose-envify: 1.4.0 560 | react: 18.2.0 561 | scheduler: 0.23.2 562 | dev: false 563 | 564 | /react-dom@18.3.1(react@18.3.1): 565 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 566 | peerDependencies: 567 | react: ^18.3.1 568 | dependencies: 569 | loose-envify: 1.4.0 570 | react: 18.3.1 571 | scheduler: 0.23.2 572 | dev: false 573 | 574 | /react@18.2.0: 575 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 576 | engines: {node: '>=0.10.0'} 577 | dependencies: 578 | loose-envify: 1.4.0 579 | dev: false 580 | 581 | /react@18.3.1: 582 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 583 | engines: {node: '>=0.10.0'} 584 | dependencies: 585 | loose-envify: 1.4.0 586 | dev: false 587 | 588 | /resend@3.2.0: 589 | resolution: {integrity: sha512-lDHhexiFYPoLXy7zRlJ8D5eKxoXy6Tr9/elN3+Vv7PkUoYuSSD1fpiIfa/JYXEWyiyN2UczkCTLpkT8dDPJ4Pg==} 590 | engines: {node: '>=18'} 591 | dependencies: 592 | '@react-email/render': 0.0.12 593 | dev: false 594 | 595 | /scheduler@0.23.2: 596 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 597 | dependencies: 598 | loose-envify: 1.4.0 599 | dev: false 600 | 601 | /selderee@0.11.0: 602 | resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} 603 | dependencies: 604 | parseley: 0.12.1 605 | dev: false 606 | 607 | /semver@7.6.2: 608 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 609 | engines: {node: '>=10'} 610 | hasBin: true 611 | dev: false 612 | 613 | /shebang-command@2.0.0: 614 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 615 | engines: {node: '>=8'} 616 | dependencies: 617 | shebang-regex: 3.0.0 618 | dev: false 619 | 620 | /shebang-regex@3.0.0: 621 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 622 | engines: {node: '>=8'} 623 | dev: false 624 | 625 | /signal-exit@4.1.0: 626 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 627 | engines: {node: '>=14'} 628 | dev: false 629 | 630 | /source-map-js@1.2.0: 631 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 632 | engines: {node: '>=0.10.0'} 633 | dev: false 634 | 635 | /streamsearch@1.1.0: 636 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 637 | engines: {node: '>=10.0.0'} 638 | dev: false 639 | 640 | /string-width@4.2.3: 641 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 642 | engines: {node: '>=8'} 643 | dependencies: 644 | emoji-regex: 8.0.0 645 | is-fullwidth-code-point: 3.0.0 646 | strip-ansi: 6.0.1 647 | dev: false 648 | 649 | /string-width@5.1.2: 650 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 651 | engines: {node: '>=12'} 652 | dependencies: 653 | eastasianwidth: 0.2.0 654 | emoji-regex: 9.2.2 655 | strip-ansi: 7.1.0 656 | dev: false 657 | 658 | /strip-ansi@6.0.1: 659 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 660 | engines: {node: '>=8'} 661 | dependencies: 662 | ansi-regex: 5.0.1 663 | dev: false 664 | 665 | /strip-ansi@7.1.0: 666 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 667 | engines: {node: '>=12'} 668 | dependencies: 669 | ansi-regex: 6.0.1 670 | dev: false 671 | 672 | /styled-jsx@5.1.1(react@18.3.1): 673 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 674 | engines: {node: '>= 12.0.0'} 675 | peerDependencies: 676 | '@babel/core': '*' 677 | babel-plugin-macros: '*' 678 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 679 | peerDependenciesMeta: 680 | '@babel/core': 681 | optional: true 682 | babel-plugin-macros: 683 | optional: true 684 | dependencies: 685 | client-only: 0.0.1 686 | react: 18.3.1 687 | dev: false 688 | 689 | /tslib@2.6.3: 690 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 691 | dev: false 692 | 693 | /typescript@5.4.5: 694 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 695 | engines: {node: '>=14.17'} 696 | hasBin: true 697 | dev: true 698 | 699 | /undici-types@5.26.5: 700 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 701 | dev: true 702 | 703 | /which@2.0.2: 704 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 705 | engines: {node: '>= 8'} 706 | hasBin: true 707 | dependencies: 708 | isexe: 2.0.0 709 | dev: false 710 | 711 | /wrap-ansi@7.0.0: 712 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 713 | engines: {node: '>=10'} 714 | dependencies: 715 | ansi-styles: 4.3.0 716 | string-width: 4.2.3 717 | strip-ansi: 6.0.1 718 | dev: false 719 | 720 | /wrap-ansi@8.1.0: 721 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 722 | engines: {node: '>=12'} 723 | dependencies: 724 | ansi-styles: 6.2.1 725 | string-width: 5.1.2 726 | strip-ansi: 7.1.0 727 | dev: false 728 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "strict": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "noEmit": true, 14 | "incremental": true, 15 | "esModuleInterop": true, 16 | "module": "esnext", 17 | "resolveJsonModule": true, 18 | "moduleResolution": "node", 19 | "isolatedModules": true, 20 | "jsx": "preserve", 21 | "plugins": [ 22 | { 23 | "name": "next" 24 | } 25 | ] 26 | }, 27 | "include": [ 28 | "next-env.d.ts", 29 | "**/*.ts", 30 | "**/*.tsx", 31 | ".next/types/**/*.ts" 32 | ], 33 | "exclude": [ 34 | "node_modules" 35 | ] 36 | } 37 | --------------------------------------------------------------------------------