Openstatus www.openstatus.dev

๐Ÿ› cc in email (#994)

* ๐Ÿ› cc in email

* 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
a9c03d8e ac7a45a5

+130 -79
+10 -10
apps/server/src/v1/statusReports/post.ts
··· 11 11 } from "@openstatus/db/src/schema"; 12 12 13 13 import { getLimit } from "@openstatus/db/src/schema/plan/utils"; 14 - import { sendEmailHtml } from "@openstatus/emails"; 14 + import { sendBatchEmailHtml } from "@openstatus/emails/emails/send"; 15 15 import { HTTPException } from "hono/http-exception"; 16 16 import { openApiErrorResponses } from "../../libs/errors/openapi-error-responses"; 17 17 import { isoDate } from "../utils"; ··· 149 149 .where(eq(page.id, _newStatusReport.pageId)) 150 150 .get(); 151 151 if (pageInfo) { 152 - const subscribersEmails = subscribers.map( 153 - (subscriber) => subscriber.email, 154 - ); 155 - await sendEmailHtml({ 156 - to: subscribersEmails, 157 - subject: `New status update for ${pageInfo.title}`, 158 - html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 159 - `, 160 - from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 152 + const emails = subscribers.map((subscriber) => { 153 + return { 154 + to: subscriber.email, 155 + subject: `New status update for ${pageInfo.title}`, 156 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 157 + `, 158 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 159 + }; 161 160 }); 161 + await sendBatchEmailHtml(emails); 162 162 } 163 163 } 164 164
+13 -12
apps/server/src/v1/statusReports/update/post.ts
··· 6 6 statusReport, 7 7 statusReportUpdate, 8 8 } from "@openstatus/db/src/schema"; 9 - import { sendEmailHtml } from "@openstatus/emails"; 9 + import { getLimit } from "@openstatus/db/src/schema/plan/utils"; 10 + import { sendBatchEmailHtml } from "@openstatus/emails/emails/send"; 10 11 import { HTTPException } from "hono/http-exception"; 11 12 import { openApiErrorResponses } from "../../../libs/errors/openapi-error-responses"; 12 13 import { StatusReportUpdateSchema } from "../../statusReportUpdates/schema"; ··· 48 49 const input = c.req.valid("json"); 49 50 const { id } = c.req.valid("param"); 50 51 const workspaceId = c.get("workspaceId"); 51 - const workspacePlan = c.get("workspacePlan"); 52 + const limits = c.get("limits"); 52 53 53 54 const _statusReport = await db 54 55 .update(statusReport) ··· 76 77 .returning() 77 78 .get(); 78 79 79 - if (workspacePlan.limits.notifications && _statusReport.pageId) { 80 + if (getLimit(limits, "notifications") && _statusReport.pageId) { 80 81 const subscribers = await db 81 82 .select() 82 83 .from(pageSubscriber) ··· 93 94 .where(eq(page.id, _statusReport.pageId)) 94 95 .get(); 95 96 if (pageInfo) { 96 - const subscribersEmails = subscribers.map( 97 - (subscriber) => subscriber.email, 98 - ); 99 - await sendEmailHtml({ 100 - to: subscribersEmails, 101 - subject: `New status update for ${pageInfo.title}`, 102 - html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 103 - `, 104 - from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 97 + const subscribersEmails = subscribers.map((subscriber) => { 98 + return { 99 + to: subscriber.email, 100 + subject: `New status update for ${pageInfo.title}`, 101 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${statusReportUpdate.status}</p><p>${statusReportUpdate.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 102 + `, 103 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 104 + }; 105 105 }); 106 + await sendBatchEmailHtml(subscribersEmails); 106 107 } 107 108 } 108 109
+1 -1
apps/web/package.json
··· 80 80 "rehype-react": "7.2.0", 81 81 "remark-parse": "10.0.2", 82 82 "remark-rehype": "10.1.0", 83 - "resend": "1.1.0", 83 + "resend": "4.0.0", 84 84 "rss": "1.2.2", 85 85 "shiki": "0.14.4", 86 86 "sonner": "1.3.1",
+12 -9
packages/api/src/router/statusReport.ts
··· 16 16 statusReportUpdate, 17 17 workspace, 18 18 } from "@openstatus/db/src/schema"; 19 - import { sendEmailHtml } from "@openstatus/emails/emails/send"; 19 + import { sendBatchEmailHtml } from "@openstatus/emails/emails/send"; 20 20 21 21 import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; 22 22 ··· 99 99 .where(eq(page.id, _statusReport.pageId)) 100 100 .get(); 101 101 if (pageInfo) { 102 - const subscribersEmails = subscribers.map( 103 - (subscriber) => subscriber.email, 104 - ); 105 - await sendEmailHtml({ 106 - to: subscribersEmails, 107 - subject: `New status update for ${pageInfo.title}`, 108 - html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${updatedValue.status}</p><p>${updatedValue.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 102 + const emails = subscribers.map((subscriber) => { 103 + return { 104 + to: subscriber.email, 105 + 106 + subject: `New status update for ${pageInfo.title}`, 107 + html: `<p>Hi,</p><p>${pageInfo.title} just posted an update on their status page:</p><p>New Status : ${updatedValue.status}</p><p>${updatedValue.message}</p></p><p></p><p>Powered by OpenStatus</p><p></p><p></p><p></p><p></p><p></p> 109 108 `, 110 - from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 109 + from: "Notification OpenStatus <notification@notifications.openstatus.dev>", 110 + }; 111 111 }); 112 + if (emails.length > 0) { 113 + await sendBatchEmailHtml(emails); 114 + } 112 115 } 113 116 } 114 117 return updatedValue;
+6 -2
packages/emails/emails/send.ts
··· 15 15 export type EmailHtml = { 16 16 html: string; 17 17 subject: string; 18 - to: string[]; 18 + to: string; 19 19 from: string; 20 20 }; 21 21 export const sendEmail = async (email: Emails) => { 22 22 await resend.emails.send(email); 23 23 }; 24 24 25 + export const sendBatchEmailHtml = async (emails: EmailHtml[]) => { 26 + await resend.batch.send(emails); 27 + }; 28 + 25 29 export const sendEmailHtml = async (email: EmailHtml) => { 26 - await fetch("https://api.resend.com/emails", { 30 + await fetch("https://api.resend.com/emails/batch", { 27 31 method: "POST", 28 32 headers: { 29 33 "Content-Type": "application/json",
+1 -1
packages/emails/package.json
··· 17 17 "@react-email/tailwind": "0.0.9", 18 18 "@t3-oss/env-core": "0.7.0", 19 19 "react-email": "1.10.0", 20 - "resend": "2.0.0", 20 + "resend": "4.0.0", 21 21 "zod": "3.23.8" 22 22 }, 23 23 "devDependencies": {
+1 -1
packages/notifications/email/package.json
··· 10 10 "@react-email/components": "0.0.7", 11 11 "@react-email/render": "0.0.7", 12 12 "@t3-oss/env-core": "0.7.0", 13 - "resend": "1.1.0", 13 + "resend": "4.0.0", 14 14 "zod": "3.23.8" 15 15 }, 16 16 "devDependencies": {
+86 -43
pnpm-lock.yaml
··· 192 192 version: link:../../packages/utils 193 193 '@scalar/hono-api-reference': 194 194 specifier: 0.5.131 195 - version: 0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 195 + version: 0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 196 196 '@t3-oss/env-core': 197 197 specifier: 0.7.1 198 198 version: 0.7.1(typescript@5.5.2)(zod@3.23.8) ··· 444 444 specifier: 10.1.0 445 445 version: 10.1.0 446 446 resend: 447 - specifier: 1.1.0 448 - version: 1.1.0 447 + specifier: 4.0.0 448 + version: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 449 449 rss: 450 450 specifier: 1.2.2 451 451 version: 1.2.2 ··· 685 685 specifier: 1.10.0 686 686 version: 1.10.0(encoding@0.1.13) 687 687 resend: 688 - specifier: 2.0.0 689 - version: 2.0.0 688 + specifier: 4.0.0 689 + version: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 690 690 zod: 691 691 specifier: 3.23.8 692 692 version: 3.23.8 ··· 775 775 specifier: 0.7.0 776 776 version: 0.7.0(typescript@5.5.2)(zod@3.23.8) 777 777 resend: 778 - specifier: 1.1.0 779 - version: 1.1.0 778 + specifier: 4.0.0 779 + version: 4.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 780 780 zod: 781 781 specifier: 3.23.8 782 782 version: 3.23.8 ··· 4454 4454 resolution: {integrity: sha512-FdLhg/E5PH5qZU/jf9NbvRi5v5134kbX7o8zIhOJIk/TALxB18ggprnH5tQX96dGQFqlLob8OLReaRwrpEF7YA==} 4455 4455 engines: {node: '>=18.0.0'} 4456 4456 4457 + '@react-email/render@0.0.17': 4458 + resolution: {integrity: sha512-xBQ+/73+WsGuXKY7r1U73zMBNV28xdV0cp9cFjhNYipBReDHhV97IpA6v7Hl0dDtDzt+yS/72dY5vYXrF1v8NA==} 4459 + engines: {node: '>=18.0.0'} 4460 + peerDependencies: 4461 + react: ^18.2.0 4462 + react-dom: ^18.2.0 4463 + 4457 4464 '@react-email/render@0.0.7': 4458 4465 resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} 4459 4466 engines: {node: '>=16.0.0'} 4460 4467 4461 - '@react-email/render@0.0.9': 4462 - resolution: {integrity: sha512-nrim7wiACnaXsGtL7GF6jp3Qmml8J6vAjAH88jkC8lIbfNZaCyuPQHANjyYIXlvQeAbsWADQJFZgOHUqFqjh/A==} 4463 - engines: {node: '>=18.0.0'} 4464 - 4465 4468 '@react-email/row@0.0.5': 4466 4469 resolution: {integrity: sha512-dir5l1M7Z/1BQqQkUrKUPIIDPt6ueEf6ScMGoBOcUh+VNNqmnqJE2Q2CH5X3w2uo6a5X7tnVhoJHGa2KTKe8Sw==} 4467 4470 engines: {node: '>=16.0.0'} ··· 5388 5391 5389 5392 abbrev@1.1.1: 5390 5393 resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 5394 + 5395 + abbrev@2.0.0: 5396 + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} 5397 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 5391 5398 5392 5399 abort-controller@3.0.0: 5393 5400 resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} ··· 6580 6587 resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 6581 6588 engines: {node: '>=4'} 6582 6589 6590 + fast-deep-equal@2.0.1: 6591 + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} 6592 + 6583 6593 fast-deep-equal@3.1.3: 6584 6594 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 6585 6595 ··· 7409 7419 engines: {node: '>=12'} 7410 7420 hasBin: true 7411 7421 7422 + js-beautify@1.15.1: 7423 + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} 7424 + engines: {node: '>=14'} 7425 + hasBin: true 7426 + 7412 7427 js-cookie@3.0.5: 7413 7428 resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 7414 7429 engines: {node: '>=14'} ··· 8282 8297 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 8283 8298 hasBin: true 8284 8299 8300 + nopt@7.2.1: 8301 + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} 8302 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 8303 + hasBin: true 8304 + 8285 8305 normalize-package-data@2.5.0: 8286 8306 resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 8287 8307 ··· 8837 8857 react-is@18.3.1: 8838 8858 resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 8839 8859 8860 + react-promise-suspense@0.3.4: 8861 + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} 8862 + 8840 8863 react-property@2.0.0: 8841 8864 resolution: {integrity: sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==} 8842 8865 ··· 9062 9085 resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 9063 9086 engines: {node: '>=0.10.0'} 9064 9087 9065 - resend@1.1.0: 9066 - resolution: {integrity: sha512-it8TIDVT+/gAiJsUlv2tdHuvzwCCv4Zwu+udDqIm/dIuByQwe68TtFDcPccxqpSVVrNCBxxXLzsdT1tsV+P3GA==} 9067 - engines: {node: '>=18'} 9068 - 9069 - resend@2.0.0: 9070 - resolution: {integrity: sha512-jAh0DN84ZjjmzGM2vMjJ1hphPBg1mG98dzopF7kJzmin62v8ESg4og2iCKWdkAboGOT2SeO5exbr/8Xh8gLddw==} 9088 + resend@4.0.0: 9089 + resolution: {integrity: sha512-rDX0rspl/XcmC2JV2V5obQvRX2arzxXUvNFUDMOv5ObBLR68+7kigCOysb7+dlkb0JE3erhQG0nHrbBt/ZCWIg==} 9071 9090 engines: {node: '>=18'} 9072 9091 9073 9092 resolve-from@5.0.0: ··· 9758 9777 type-fest@2.19.0: 9759 9778 resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 9760 9779 engines: {node: '>=12.20'} 9761 - 9762 - type-fest@3.13.0: 9763 - resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} 9764 - engines: {node: '>=14.16'} 9765 9780 9766 9781 type-fest@3.13.1: 9767 9782 resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} ··· 12570 12585 dependencies: 12571 12586 tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) 12572 12587 12573 - '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))': 12574 - dependencies: 12575 - tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)) 12576 - 12577 12588 '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))': 12578 12589 dependencies: 12579 12590 tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) ··· 14034 14045 react: 18.2.0 14035 14046 react-dom: 18.2.0(react@18.2.0) 14036 14047 14037 - '@react-email/render@0.0.7': 14048 + '@react-email/render@0.0.17(react-dom@18.3.1(react@18.2.0))(react@18.2.0)': 14038 14049 dependencies: 14039 - html-to-text: 9.0.3 14040 - pretty: 2.0.0 14050 + html-to-text: 9.0.5 14051 + js-beautify: 1.15.1 14041 14052 react: 18.2.0 14042 - react-dom: 18.2.0(react@18.2.0) 14053 + react-dom: 18.3.1(react@18.2.0) 14054 + react-promise-suspense: 0.3.4 14043 14055 14044 - '@react-email/render@0.0.9': 14056 + '@react-email/render@0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 14045 14057 dependencies: 14046 14058 html-to-text: 9.0.5 14059 + js-beautify: 1.15.1 14060 + react: 18.3.1 14061 + react-dom: 18.3.1(react@18.3.1) 14062 + react-promise-suspense: 0.3.4 14063 + 14064 + '@react-email/render@0.0.7': 14065 + dependencies: 14066 + html-to-text: 9.0.3 14047 14067 pretty: 2.0.0 14048 14068 react: 18.2.0 14049 14069 react-dom: 18.2.0(react@18.2.0) ··· 14101 14121 optionalDependencies: 14102 14122 rollup: 2.78.0 14103 14123 14104 - '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14124 + '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14105 14125 dependencies: 14106 - '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2))) 14126 + '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2))) 14107 14127 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.5.2)) 14108 14128 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.5.2) 14109 14129 '@scalar/draggable': 0.1.4(typescript@5.5.2) ··· 14139 14159 - typescript 14140 14160 - vitest 14141 14161 14142 - '@scalar/api-reference@1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14162 + '@scalar/api-reference@1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14143 14163 dependencies: 14144 14164 '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.5.2)) 14145 14165 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.5.2)) 14146 - '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 14166 + '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 14147 14167 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.5.2) 14148 14168 '@scalar/oas-utils': 0.2.26(typescript@5.5.2) 14149 14169 '@scalar/openapi-parser': 0.7.2 ··· 14228 14248 transitivePeerDependencies: 14229 14249 - typescript 14230 14250 14231 - '@scalar/hono-api-reference@0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14251 + '@scalar/hono-api-reference@0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14232 14252 dependencies: 14233 - '@scalar/api-reference': 1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 14253 + '@scalar/api-reference': 1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 14234 14254 hono: 4.5.3 14235 14255 transitivePeerDependencies: 14236 14256 - '@jest/globals' ··· 15485 15505 15486 15506 abbrev@1.1.1: {} 15487 15507 15508 + abbrev@2.0.0: {} 15509 + 15488 15510 abort-controller@3.0.0: 15489 15511 dependencies: 15490 15512 event-target-shim: 5.0.1 ··· 16766 16788 iconv-lite: 0.4.24 16767 16789 tmp: 0.0.33 16768 16790 16791 + fast-deep-equal@2.0.1: {} 16792 + 16769 16793 fast-deep-equal@3.1.3: {} 16770 16794 16771 16795 fast-equals@5.0.1: {} ··· 17788 17812 glob: 8.1.0 17789 17813 nopt: 6.0.0 17790 17814 17815 + js-beautify@1.15.1: 17816 + dependencies: 17817 + config-chain: 1.1.13 17818 + editorconfig: 1.0.4 17819 + glob: 10.3.4 17820 + js-cookie: 3.0.5 17821 + nopt: 7.2.1 17822 + 17791 17823 js-cookie@3.0.5: {} 17792 17824 17793 17825 js-tokens@4.0.0: {} ··· 19180 19212 dependencies: 19181 19213 abbrev: 1.1.1 19182 19214 19215 + nopt@7.2.1: 19216 + dependencies: 19217 + abbrev: 2.0.0 19218 + 19183 19219 normalize-package-data@2.5.0: 19184 19220 dependencies: 19185 19221 hosted-git-info: 2.8.9 ··· 19799 19835 19800 19836 react-is@18.3.1: {} 19801 19837 19838 + react-promise-suspense@0.3.4: 19839 + dependencies: 19840 + fast-deep-equal: 2.0.1 19841 + 19802 19842 react-property@2.0.0: {} 19803 19843 19804 19844 react-remove-scroll-bar@2.3.4(@types/react@18.3.3)(react@18.3.1): ··· 20149 20189 20150 20190 require-from-string@2.0.2: {} 20151 20191 20152 - resend@1.1.0: 20192 + resend@4.0.0(react-dom@18.3.1(react@18.2.0))(react@18.2.0): 20153 20193 dependencies: 20154 - '@react-email/render': 0.0.7 20155 - type-fest: 3.13.0 20194 + '@react-email/render': 0.0.17(react-dom@18.3.1(react@18.2.0))(react@18.2.0) 20195 + transitivePeerDependencies: 20196 + - react 20197 + - react-dom 20156 20198 20157 - resend@2.0.0: 20199 + resend@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 20158 20200 dependencies: 20159 - '@react-email/render': 0.0.9 20201 + '@react-email/render': 0.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 20202 + transitivePeerDependencies: 20203 + - react 20204 + - react-dom 20160 20205 20161 20206 resolve-from@5.0.0: {} 20162 20207 ··· 20976 21021 type-fest@1.4.0: {} 20977 21022 20978 21023 type-fest@2.19.0: {} 20979 - 20980 - type-fest@3.13.0: {} 20981 21024 20982 21025 type-fest@3.13.1: {} 20983 21026