feat: add In-Reply-To option (#165)
This commit is contained in:
@@ -605,6 +605,10 @@
|
|||||||
"scheduledAt": {
|
"scheduledAt": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "date-time"
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"inReplyToId": {
|
||||||
|
"type": "string",
|
||||||
|
"nullable": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
@@ -758,6 +762,10 @@
|
|||||||
"scheduledAt": {
|
"scheduledAt": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "date-time"
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"inReplyToId": {
|
||||||
|
"type": "string",
|
||||||
|
"nullable": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": [
|
"required": [
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
"@aws-sdk/client-sns": "^3.797.0",
|
"@aws-sdk/client-sns": "^3.797.0",
|
||||||
"@aws-sdk/s3-request-presigner": "^3.797.0",
|
"@aws-sdk/s3-request-presigner": "^3.797.0",
|
||||||
"@hono/swagger-ui": "^0.5.1",
|
"@hono/swagger-ui": "^0.5.1",
|
||||||
"@hono/zod-openapi": "^0.19.5",
|
"@hono/zod-openapi": "^0.10.0",
|
||||||
"@hookform/resolvers": "^5.0.1",
|
"@hookform/resolvers": "^5.0.1",
|
||||||
"@isaacs/ttlcache": "^1.4.1",
|
"@isaacs/ttlcache": "^1.4.1",
|
||||||
"@prisma/client": "^6.6.0",
|
"@prisma/client": "^6.6.0",
|
||||||
|
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Email" ADD COLUMN "inReplyToId" TEXT;
|
@@ -245,6 +245,7 @@ model Email {
|
|||||||
attachments String?
|
attachments String?
|
||||||
campaignId String?
|
campaignId String?
|
||||||
contactId String?
|
contactId String?
|
||||||
|
inReplyToId String?
|
||||||
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
||||||
emailEvents EmailEvent[]
|
emailEvents EmailEvent[]
|
||||||
|
|
||||||
|
@@ -103,96 +103,7 @@ export async function getDomainIdentity(domain: string, region: string) {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function sendEmailThroughSes({
|
export async function sendRawEmail({
|
||||||
to,
|
|
||||||
from,
|
|
||||||
subject,
|
|
||||||
cc,
|
|
||||||
bcc,
|
|
||||||
text,
|
|
||||||
html,
|
|
||||||
replyTo,
|
|
||||||
region,
|
|
||||||
configurationSetName,
|
|
||||||
unsubUrl,
|
|
||||||
isBulk,
|
|
||||||
}: Partial<EmailContent> & {
|
|
||||||
region: string;
|
|
||||||
configurationSetName: string;
|
|
||||||
cc?: string[];
|
|
||||||
bcc?: string[];
|
|
||||||
replyTo?: string[];
|
|
||||||
to?: string[];
|
|
||||||
isBulk?: boolean;
|
|
||||||
}) {
|
|
||||||
const sesClient = getSesClient(region);
|
|
||||||
const command = new SendEmailCommand({
|
|
||||||
FromEmailAddress: from,
|
|
||||||
ReplyToAddresses: replyTo ? replyTo : undefined,
|
|
||||||
Destination: {
|
|
||||||
ToAddresses: to,
|
|
||||||
CcAddresses: cc,
|
|
||||||
BccAddresses: bcc,
|
|
||||||
},
|
|
||||||
Content: {
|
|
||||||
// EmailContent
|
|
||||||
Simple: {
|
|
||||||
// Message
|
|
||||||
Subject: {
|
|
||||||
// Content
|
|
||||||
Data: subject, // required
|
|
||||||
Charset: "UTF-8",
|
|
||||||
},
|
|
||||||
Body: {
|
|
||||||
// Body
|
|
||||||
Text: text
|
|
||||||
? {
|
|
||||||
Data: text, // required
|
|
||||||
Charset: "UTF-8",
|
|
||||||
}
|
|
||||||
: undefined,
|
|
||||||
Html: html
|
|
||||||
? {
|
|
||||||
Data: html, // required
|
|
||||||
Charset: "UTF-8",
|
|
||||||
}
|
|
||||||
: undefined,
|
|
||||||
},
|
|
||||||
Headers: [
|
|
||||||
// Spread in any unsubscribe headers if unsubUrl is defined
|
|
||||||
...(unsubUrl
|
|
||||||
? [
|
|
||||||
{ Name: "List-Unsubscribe", Value: `<${unsubUrl}>` },
|
|
||||||
{
|
|
||||||
Name: "List-Unsubscribe-Post",
|
|
||||||
Value: "List-Unsubscribe=One-Click",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: []),
|
|
||||||
// Spread in the precedence header if present
|
|
||||||
...(isBulk ? [{ Name: "Precedence", Value: "bulk" }] : []),
|
|
||||||
{
|
|
||||||
Name: "X-Entity-Ref-ID",
|
|
||||||
Value: nanoid(),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ConfigurationSetName: configurationSetName,
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await sesClient.send(command);
|
|
||||||
console.log("Email sent! Message ID:", response.MessageId);
|
|
||||||
return response.MessageId;
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Failed to send email", error);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Need to improve this. Use some kinda library to do this
|
|
||||||
export async function sendEmailWithAttachments({
|
|
||||||
to,
|
to,
|
||||||
from,
|
from,
|
||||||
subject,
|
subject,
|
||||||
@@ -200,22 +111,28 @@ export async function sendEmailWithAttachments({
|
|||||||
cc,
|
cc,
|
||||||
bcc,
|
bcc,
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
text,
|
text, // text is not used directly in raw email but kept for interface consistency
|
||||||
html,
|
html,
|
||||||
attachments,
|
attachments,
|
||||||
region,
|
region,
|
||||||
configurationSetName,
|
configurationSetName,
|
||||||
|
unsubUrl,
|
||||||
|
isBulk,
|
||||||
|
inReplyToMessageId,
|
||||||
}: Partial<EmailContent> & {
|
}: Partial<EmailContent> & {
|
||||||
region: string;
|
region: string;
|
||||||
configurationSetName: string;
|
configurationSetName: string;
|
||||||
attachments: { filename: string; content: string }[];
|
attachments?: { filename: string; content: string }[]; // Made attachments optional
|
||||||
cc?: string[];
|
cc?: string[];
|
||||||
bcc?: string[];
|
bcc?: string[];
|
||||||
replyTo?: string[];
|
replyTo?: string[];
|
||||||
to?: string[];
|
to?: string[];
|
||||||
|
unsubUrl?: string;
|
||||||
|
isBulk?: boolean;
|
||||||
|
inReplyToMessageId?: string;
|
||||||
}) {
|
}) {
|
||||||
const sesClient = getSesClient(region);
|
const sesClient = getSesClient(region);
|
||||||
const boundary = "NextPart";
|
const boundary = `NextPart`;
|
||||||
let rawEmail = `From: ${from}\n`;
|
let rawEmail = `From: ${from}\n`;
|
||||||
rawEmail += `To: ${Array.isArray(to) ? to.join(", ") : to}\n`;
|
rawEmail += `To: ${Array.isArray(to) ? to.join(", ") : to}\n`;
|
||||||
rawEmail += cc && cc.length ? `Cc: ${cc.join(", ")}\n` : "";
|
rawEmail += cc && cc.length ? `Cc: ${cc.join(", ")}\n` : "";
|
||||||
@@ -224,12 +141,29 @@ export async function sendEmailWithAttachments({
|
|||||||
replyTo && replyTo.length ? `Reply-To: ${replyTo.join(", ")}\n` : "";
|
replyTo && replyTo.length ? `Reply-To: ${replyTo.join(", ")}\n` : "";
|
||||||
rawEmail += `Subject: ${subject}\n`;
|
rawEmail += `Subject: ${subject}\n`;
|
||||||
rawEmail += `MIME-Version: 1.0\n`;
|
rawEmail += `MIME-Version: 1.0\n`;
|
||||||
|
|
||||||
|
// Add headers
|
||||||
|
if (unsubUrl) {
|
||||||
|
rawEmail += `List-Unsubscribe: <${unsubUrl}>\n`;
|
||||||
|
rawEmail += `List-Unsubscribe-Post: List-Unsubscribe=One-Click\n`;
|
||||||
|
}
|
||||||
|
if (isBulk) {
|
||||||
|
rawEmail += `Precedence: bulk\n`;
|
||||||
|
}
|
||||||
|
if (inReplyToMessageId) {
|
||||||
|
rawEmail += `In-Reply-To: <${inReplyToMessageId}@email.amazonses.com>\n`;
|
||||||
|
rawEmail += `References: <${inReplyToMessageId}@email.amazonses.com>\n`;
|
||||||
|
}
|
||||||
|
rawEmail += `X-Entity-Ref-ID: ${nanoid()}\n`;
|
||||||
|
|
||||||
rawEmail += `Content-Type: multipart/mixed; boundary="${boundary}"\n\n`;
|
rawEmail += `Content-Type: multipart/mixed; boundary="${boundary}"\n\n`;
|
||||||
rawEmail += `--${boundary}\n`;
|
rawEmail += `--${boundary}\n`;
|
||||||
rawEmail += `Content-Type: text/html; charset="UTF-8"\n\n`;
|
rawEmail += `Content-Type: text/html; charset="UTF-8"\n\n`;
|
||||||
rawEmail += `${html}\n\n`;
|
rawEmail += `${html}\n\n`;
|
||||||
|
|
||||||
|
if (attachments && attachments.length > 0) {
|
||||||
for (const attachment of attachments) {
|
for (const attachment of attachments) {
|
||||||
const content = attachment.content; // Convert buffer to base64
|
const content = attachment.content; // Assumes content is base64
|
||||||
const mimeType =
|
const mimeType =
|
||||||
mime.lookup(attachment.filename) || "application/octet-stream";
|
mime.lookup(attachment.filename) || "application/octet-stream";
|
||||||
rawEmail += `--${boundary}\n`;
|
rawEmail += `--${boundary}\n`;
|
||||||
@@ -238,6 +172,7 @@ export async function sendEmailWithAttachments({
|
|||||||
rawEmail += `Content-Transfer-Encoding: base64\n\n`;
|
rawEmail += `Content-Transfer-Encoding: base64\n\n`;
|
||||||
rawEmail += `${content}\n\n`;
|
rawEmail += `${content}\n\n`;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rawEmail += `--${boundary}--`;
|
rawEmail += `--${boundary}--`;
|
||||||
|
|
||||||
@@ -252,11 +187,13 @@ export async function sendEmailWithAttachments({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await sesClient.send(command);
|
const response = await sesClient.send(command);
|
||||||
console.log("Email with attachments sent! Message ID:", response.MessageId);
|
console.log("Email sent! Message ID:", response.MessageId);
|
||||||
return response.MessageId;
|
return response.MessageId;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to send email with attachments", error);
|
console.error("Failed to send email", error);
|
||||||
throw new Error("Failed to send email with attachments");
|
// It's better to throw the original error or a new error with more context
|
||||||
|
// throw new Error("Failed to send email");
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { PublicAPIApp } from "~/server/public-api/hono";
|
import { PublicAPIApp } from "~/server/public-api/hono";
|
||||||
import { getTeamFromToken } from "~/server/public-api/auth";
|
|
||||||
import { sendEmail } from "~/server/service/email-service";
|
import { sendEmail } from "~/server/service/email-service";
|
||||||
import { emailSchema } from "../../schemas/email-schema";
|
import { emailSchema } from "../../schemas/email-schema";
|
||||||
|
|
||||||
|
@@ -70,7 +70,6 @@ export function getApp() {
|
|||||||
|
|
||||||
let currentRequests: number;
|
let currentRequests: number;
|
||||||
let ttl: number;
|
let ttl: number;
|
||||||
let isNewKey = false;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Increment the key. If the key does not exist, it is created and set to 1.
|
// Increment the key. If the key does not exist, it is created and set to 1.
|
||||||
|
@@ -29,6 +29,7 @@ export const emailSchema = z
|
|||||||
.max(10) // Limit attachments array size if desired
|
.max(10) // Limit attachments array size if desired
|
||||||
.optional(),
|
.optional(),
|
||||||
scheduledAt: z.string().datetime({ offset: true }).optional(), // Ensure ISO 8601 format with offset
|
scheduledAt: z.string().datetime({ offset: true }).optional(), // Ensure ISO 8601 format with offset
|
||||||
|
inReplyToId: z.string().optional().nullable(),
|
||||||
})
|
})
|
||||||
.refine(
|
.refine(
|
||||||
(data) => !!data.subject || !!data.templateId,
|
(data) => !!data.subject || !!data.templateId,
|
||||||
|
@@ -4,7 +4,7 @@ import { EmailAttachment } from "~/types";
|
|||||||
import { convert as htmlToText } from "html-to-text";
|
import { convert as htmlToText } from "html-to-text";
|
||||||
import { getConfigurationSetName } from "~/utils/ses-utils";
|
import { getConfigurationSetName } from "~/utils/ses-utils";
|
||||||
import { db } from "../db";
|
import { db } from "../db";
|
||||||
import { sendEmailThroughSes, sendEmailWithAttachments } from "../aws/ses";
|
import { sendRawEmail } from "../aws/ses";
|
||||||
import { getRedis } from "../redis";
|
import { getRedis } from "../redis";
|
||||||
import { DEFAULT_QUEUE_OPTIONS } from "../queue/queue-constants";
|
import { DEFAULT_QUEUE_OPTIONS } from "../queue/queue-constants";
|
||||||
import { Prisma } from "@prisma/client";
|
import { Prisma } from "@prisma/client";
|
||||||
@@ -331,9 +331,22 @@ async function executeEmail(
|
|||||||
? htmlToText(email.html)
|
? htmlToText(email.html)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
|
let inReplyToMessageId: string | undefined = undefined;
|
||||||
|
|
||||||
|
if (email.inReplyToId) {
|
||||||
|
const replyEmail = await db.email.findUnique({
|
||||||
|
where: {
|
||||||
|
id: email.inReplyToId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (replyEmail && replyEmail.sesEmailId) {
|
||||||
|
inReplyToMessageId = replyEmail.sesEmailId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const messageId = attachments.length
|
const messageId = await sendRawEmail({
|
||||||
? await sendEmailWithAttachments({
|
|
||||||
to: email.to,
|
to: email.to,
|
||||||
from: email.from,
|
from: email.from,
|
||||||
subject: email.subject,
|
subject: email.subject,
|
||||||
@@ -344,20 +357,10 @@ async function executeEmail(
|
|||||||
html: email.html ?? undefined,
|
html: email.html ?? undefined,
|
||||||
region: domain?.region ?? env.AWS_DEFAULT_REGION,
|
region: domain?.region ?? env.AWS_DEFAULT_REGION,
|
||||||
configurationSetName,
|
configurationSetName,
|
||||||
attachments,
|
attachments: attachments.length > 0 ? attachments : undefined,
|
||||||
})
|
|
||||||
: await sendEmailThroughSes({
|
|
||||||
to: email.to,
|
|
||||||
from: email.from,
|
|
||||||
subject: email.subject,
|
|
||||||
replyTo: email.replyTo ?? undefined,
|
|
||||||
text,
|
|
||||||
html: email.html ?? undefined,
|
|
||||||
region: domain?.region ?? env.AWS_DEFAULT_REGION,
|
|
||||||
configurationSetName,
|
|
||||||
attachments,
|
|
||||||
unsubUrl,
|
unsubUrl,
|
||||||
isBulk,
|
isBulk,
|
||||||
|
inReplyToMessageId,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Delete attachments after sending the email
|
// Delete attachments after sending the email
|
||||||
|
@@ -63,6 +63,7 @@ export async function sendEmail(
|
|||||||
bcc,
|
bcc,
|
||||||
scheduledAt,
|
scheduledAt,
|
||||||
apiKeyId,
|
apiKeyId,
|
||||||
|
inReplyToId,
|
||||||
} = emailContent;
|
} = emailContent;
|
||||||
let subject = subjectFromApiCall;
|
let subject = subjectFromApiCall;
|
||||||
let html = htmlFromApiCall;
|
let html = htmlFromApiCall;
|
||||||
@@ -99,6 +100,22 @@ export async function sendEmail(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inReplyToId) {
|
||||||
|
const email = await db.email.findUnique({
|
||||||
|
where: {
|
||||||
|
id: inReplyToId,
|
||||||
|
teamId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!email) {
|
||||||
|
throw new UnsendApiError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: '"inReplyTo" is invalid',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!text && !html) {
|
if (!text && !html) {
|
||||||
throw new UnsendApiError({
|
throw new UnsendApiError({
|
||||||
code: "BAD_REQUEST",
|
code: "BAD_REQUEST",
|
||||||
@@ -131,6 +148,7 @@ export async function sendEmail(
|
|||||||
scheduledAt: scheduledAtDate,
|
scheduledAt: scheduledAtDate,
|
||||||
latestStatus: scheduledAtDate ? "SCHEDULED" : "QUEUED",
|
latestStatus: scheduledAtDate ? "SCHEDULED" : "QUEUED",
|
||||||
apiId: apiKeyId,
|
apiId: apiKeyId,
|
||||||
|
inReplyToId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ export type EmailContent = {
|
|||||||
from: string;
|
from: string;
|
||||||
subject?: string;
|
subject?: string;
|
||||||
templateId?: string;
|
templateId?: string;
|
||||||
variables?: Record<string, string>,
|
variables?: Record<string, string>;
|
||||||
text?: string;
|
text?: string;
|
||||||
html?: string;
|
html?: string;
|
||||||
replyTo?: string | string[];
|
replyTo?: string | string[];
|
||||||
@@ -12,6 +12,7 @@ export type EmailContent = {
|
|||||||
attachments?: Array<EmailAttachment>;
|
attachments?: Array<EmailAttachment>;
|
||||||
unsubUrl?: string;
|
unsubUrl?: string;
|
||||||
scheduledAt?: string;
|
scheduledAt?: string;
|
||||||
|
inReplyToId?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type EmailAttachment = {
|
export type EmailAttachment = {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "unsend",
|
"name": "unsend",
|
||||||
"version": "1.5.0",
|
"version": "1.5.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.mjs",
|
"module": "./dist/index.mjs",
|
||||||
|
255
packages/sdk/types/schema.d.ts
vendored
255
packages/sdk/types/schema.d.ts
vendored
@@ -3,15 +3,30 @@
|
|||||||
* Do not make direct changes to the file.
|
* Do not make direct changes to the file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
export interface paths {
|
export interface paths {
|
||||||
"/v1/domains": {
|
"/v1/domains": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
get: {
|
get: {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": ({
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @description The ID of the domain
|
* @description The ID of the domain
|
||||||
* @example 1
|
* @example 1
|
||||||
@@ -30,28 +45,35 @@ export interface paths {
|
|||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
status: "NOT_STARTED" | "PENDING" | "SUCCESS" | "FAILED" | "TEMPORARY_FAILURE";
|
status: "NOT_STARTED" | "PENDING" | "SUCCESS" | "FAILED" | "TEMPORARY_FAILURE";
|
||||||
/** @default us-east-1 */
|
/** @default us-east-1 */
|
||||||
region?: string;
|
region: string;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
clickTracking?: boolean;
|
clickTracking: boolean;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
openTracking?: boolean;
|
openTracking: boolean;
|
||||||
publicKey: string;
|
publicKey: string;
|
||||||
dkimStatus?: string | null;
|
dkimStatus?: string | null;
|
||||||
spfDetails?: string | null;
|
spfDetails?: string | null;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
dmarcAdded?: boolean;
|
dmarcAdded: boolean;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
isVerifying?: boolean;
|
isVerifying: boolean;
|
||||||
errorMessage?: string | null;
|
errorMessage?: string | null;
|
||||||
subdomain?: string | null;
|
subdomain?: string | null;
|
||||||
})[];
|
}[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
put?: never;
|
||||||
post: {
|
post: {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
@@ -63,6 +85,9 @@ export interface paths {
|
|||||||
responses: {
|
responses: {
|
||||||
/** @description Create a new domain */
|
/** @description Create a new domain */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
@@ -83,20 +108,20 @@ export interface paths {
|
|||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
status: "NOT_STARTED" | "PENDING" | "SUCCESS" | "FAILED" | "TEMPORARY_FAILURE";
|
status: "NOT_STARTED" | "PENDING" | "SUCCESS" | "FAILED" | "TEMPORARY_FAILURE";
|
||||||
/** @default us-east-1 */
|
/** @default us-east-1 */
|
||||||
region?: string;
|
region: string;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
clickTracking?: boolean;
|
clickTracking: boolean;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
openTracking?: boolean;
|
openTracking: boolean;
|
||||||
publicKey: string;
|
publicKey: string;
|
||||||
dkimStatus?: string | null;
|
dkimStatus?: string | null;
|
||||||
spfDetails?: string | null;
|
spfDetails?: string | null;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
dmarcAdded?: boolean;
|
dmarcAdded: boolean;
|
||||||
/** @default false */
|
/** @default false */
|
||||||
isVerifying?: boolean;
|
isVerifying: boolean;
|
||||||
errorMessage?: string | null;
|
errorMessage?: string | null;
|
||||||
subdomain?: string | null;
|
subdomain?: string | null;
|
||||||
};
|
};
|
||||||
@@ -104,17 +129,36 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/domains/{id}/verify": {
|
"/v1/domains/{id}/verify": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
get?: never;
|
||||||
put: {
|
put: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
id: number | null;
|
id: number | null;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Create a new domain */
|
/** @description Create a new domain */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
message: string;
|
message: string;
|
||||||
@@ -123,17 +167,36 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
post?: never;
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/emails/{emailId}": {
|
"/v1/emails/{emailId}": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
get: {
|
get: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
emailId: string;
|
emailId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the email */
|
/** @description Retrieve the email */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -148,23 +211,31 @@ export interface paths {
|
|||||||
text: string | null;
|
text: string | null;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
emailEvents: ({
|
emailEvents: {
|
||||||
emailId: string;
|
emailId: string;
|
||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
status: "SCHEDULED" | "QUEUED" | "SENT" | "DELIVERY_DELAYED" | "BOUNCED" | "REJECTED" | "RENDERING_FAILURE" | "DELIVERED" | "OPENED" | "CLICKED" | "COMPLAINED" | "FAILED" | "CANCELLED";
|
status: "SCHEDULED" | "QUEUED" | "SENT" | "DELIVERY_DELAYED" | "BOUNCED" | "REJECTED" | "RENDERING_FAILURE" | "DELIVERED" | "OPENED" | "CLICKED" | "COMPLAINED" | "FAILED" | "CANCELLED";
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
data?: unknown;
|
data?: unknown;
|
||||||
})[];
|
}[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
put?: never;
|
||||||
|
post?: never;
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
patch: {
|
patch: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
emailId: string;
|
emailId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
@@ -177,6 +248,9 @@ export interface paths {
|
|||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
emailId?: string;
|
emailId?: string;
|
||||||
@@ -185,9 +259,24 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/emails": {
|
"/v1/emails": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
get?: never;
|
||||||
|
put?: never;
|
||||||
post: {
|
post: {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
@@ -212,12 +301,16 @@ export interface paths {
|
|||||||
}[];
|
}[];
|
||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
scheduledAt?: string;
|
scheduledAt?: string;
|
||||||
|
inReplyToId?: string | null;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
emailId?: string;
|
emailId?: string;
|
||||||
@@ -226,12 +319,31 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/emails/batch": {
|
"/v1/emails/batch": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
get?: never;
|
||||||
|
put?: never;
|
||||||
post: {
|
post: {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
"application/json": ({
|
"application/json": {
|
||||||
to: string | string[];
|
to: string | string[];
|
||||||
/** Format: email */
|
/** Format: email */
|
||||||
from: string;
|
from: string;
|
||||||
@@ -253,12 +365,16 @@ export interface paths {
|
|||||||
}[];
|
}[];
|
||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
scheduledAt?: string;
|
scheduledAt?: string;
|
||||||
})[];
|
inReplyToId?: string | null;
|
||||||
|
}[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
responses: {
|
responses: {
|
||||||
/** @description List of successfully created email IDs */
|
/** @description List of successfully created email IDs */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
data: {
|
data: {
|
||||||
@@ -269,17 +385,37 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/emails/{emailId}/cancel": {
|
"/v1/emails/{emailId}/cancel": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
|
get?: never;
|
||||||
|
put?: never;
|
||||||
post: {
|
post: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
emailId: string;
|
emailId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
emailId?: string;
|
emailId?: string;
|
||||||
@@ -288,8 +424,19 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/contactBooks/{contactBookId}/contacts": {
|
"/v1/contactBooks/{contactBookId}/contacts": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
get: {
|
get: {
|
||||||
parameters: {
|
parameters: {
|
||||||
query?: {
|
query?: {
|
||||||
@@ -298,37 +445,47 @@ export interface paths {
|
|||||||
limit?: number;
|
limit?: number;
|
||||||
ids?: string;
|
ids?: string;
|
||||||
};
|
};
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve multiple contacts */
|
/** @description Retrieve multiple contacts */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": ({
|
"application/json": {
|
||||||
id: string;
|
id: string;
|
||||||
firstName?: string | null;
|
firstName?: string | null;
|
||||||
lastName?: string | null;
|
lastName?: string | null;
|
||||||
email: string;
|
email: string;
|
||||||
/** @default true */
|
/** @default true */
|
||||||
subscribed?: boolean;
|
subscribed: boolean;
|
||||||
properties: {
|
properties: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
})[];
|
}[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
put?: never;
|
||||||
post: {
|
post: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
@@ -346,6 +503,9 @@ export interface paths {
|
|||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
contactId?: string;
|
contactId?: string;
|
||||||
@@ -354,18 +514,36 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
delete?: never;
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
|
patch?: never;
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
"/v1/contactBooks/{contactBookId}/contacts/{contactId}": {
|
"/v1/contactBooks/{contactBookId}/contacts/{contactId}": {
|
||||||
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
|
path?: never;
|
||||||
|
cookie?: never;
|
||||||
|
};
|
||||||
get: {
|
get: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
contactId: string;
|
contactId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the contact */
|
/** @description Retrieve the contact */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -373,7 +551,7 @@ export interface paths {
|
|||||||
lastName?: string | null;
|
lastName?: string | null;
|
||||||
email: string;
|
email: string;
|
||||||
/** @default true */
|
/** @default true */
|
||||||
subscribed?: boolean;
|
subscribed: boolean;
|
||||||
properties: {
|
properties: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
@@ -387,9 +565,12 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
put: {
|
put: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
@@ -407,6 +588,9 @@ export interface paths {
|
|||||||
responses: {
|
responses: {
|
||||||
/** @description Contact upserted successfully */
|
/** @description Contact upserted successfully */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
contactId: string;
|
contactId: string;
|
||||||
@@ -415,16 +599,24 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
post?: never;
|
||||||
delete: {
|
delete: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
contactId: string;
|
contactId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
|
requestBody?: never;
|
||||||
responses: {
|
responses: {
|
||||||
/** @description Contact deleted successfully */
|
/** @description Contact deleted successfully */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
@@ -433,12 +625,17 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
options?: never;
|
||||||
|
head?: never;
|
||||||
patch: {
|
patch: {
|
||||||
parameters: {
|
parameters: {
|
||||||
|
query?: never;
|
||||||
|
header?: never;
|
||||||
path: {
|
path: {
|
||||||
contactBookId: string;
|
contactBookId: string;
|
||||||
contactId: string;
|
contactId: string;
|
||||||
};
|
};
|
||||||
|
cookie?: never;
|
||||||
};
|
};
|
||||||
requestBody: {
|
requestBody: {
|
||||||
content: {
|
content: {
|
||||||
@@ -455,6 +652,9 @@ export interface paths {
|
|||||||
responses: {
|
responses: {
|
||||||
/** @description Retrieve the user */
|
/** @description Retrieve the user */
|
||||||
200: {
|
200: {
|
||||||
|
headers: {
|
||||||
|
[name: string]: unknown;
|
||||||
|
};
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
contactId?: string;
|
contactId?: string;
|
||||||
@@ -463,24 +663,17 @@ export interface paths {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
trace?: never;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export type webhooks = Record<string, never>;
|
export type webhooks = Record<string, never>;
|
||||||
|
|
||||||
export interface components {
|
export interface components {
|
||||||
schemas: {
|
schemas: never;
|
||||||
};
|
|
||||||
responses: never;
|
responses: never;
|
||||||
parameters: {
|
parameters: never;
|
||||||
};
|
|
||||||
requestBodies: never;
|
requestBodies: never;
|
||||||
headers: never;
|
headers: never;
|
||||||
pathItems: never;
|
pathItems: never;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type $defs = Record<string, never>;
|
export type $defs = Record<string, never>;
|
||||||
|
|
||||||
export type external = Record<string, never>;
|
|
||||||
|
|
||||||
export type operations = Record<string, never>;
|
export type operations = Record<string, never>;
|
||||||
|
16
pnpm-lock.yaml
generated
16
pnpm-lock.yaml
generated
@@ -147,8 +147,8 @@ importers:
|
|||||||
specifier: ^0.5.1
|
specifier: ^0.5.1
|
||||||
version: 0.5.1(hono@4.7.7)
|
version: 0.5.1(hono@4.7.7)
|
||||||
'@hono/zod-openapi':
|
'@hono/zod-openapi':
|
||||||
specifier: ^0.19.5
|
specifier: ^0.10.0
|
||||||
version: 0.19.5(hono@4.7.7)(zod@3.24.3)
|
version: 0.10.1(hono@4.7.7)(zod@3.24.3)
|
||||||
'@hookform/resolvers':
|
'@hookform/resolvers':
|
||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1(react-hook-form@7.56.1)
|
version: 5.0.1(react-hook-form@7.56.1)
|
||||||
@@ -2435,21 +2435,21 @@ packages:
|
|||||||
hono: 4.7.7
|
hono: 4.7.7
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@hono/zod-openapi@0.19.5(hono@4.7.7)(zod@3.24.3):
|
/@hono/zod-openapi@0.10.1(hono@4.7.7)(zod@3.24.3):
|
||||||
resolution: {integrity: sha512-n2RqdZL7XIaWPwBNygctG/1eySyRtSBnS7l+pIsP3f2JW5P2l7Smm6SLluscrGwB5l2C2fxbfvhWoC6Ig+SxXw==}
|
resolution: {integrity: sha512-IIenwxruTH7wJ2cLPVfSg8j7bMv7F3+W69+mOOs8KsqSiBgNxwqUhkjm5ilQ1xL/Y/GHT2mB5AEBfvWb31Biiw==}
|
||||||
engines: {node: '>=16.0.0'}
|
engines: {node: '>=16.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
hono: '>=4.3.6'
|
hono: '>=3.11.3'
|
||||||
zod: 3.*
|
zod: 3.*
|
||||||
dependencies:
|
dependencies:
|
||||||
'@asteasolutions/zod-to-openapi': 7.3.0(zod@3.24.3)
|
'@asteasolutions/zod-to-openapi': 7.3.0(zod@3.24.3)
|
||||||
'@hono/zod-validator': 0.4.3(hono@4.7.7)(zod@3.24.3)
|
'@hono/zod-validator': 0.2.1(hono@4.7.7)(zod@3.24.3)
|
||||||
hono: 4.7.7
|
hono: 4.7.7
|
||||||
zod: 3.24.3
|
zod: 3.24.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@hono/zod-validator@0.4.3(hono@4.7.7)(zod@3.24.3):
|
/@hono/zod-validator@0.2.1(hono@4.7.7)(zod@3.24.3):
|
||||||
resolution: {integrity: sha512-xIgMYXDyJ4Hj6ekm9T9Y27s080Nl9NXHcJkOvkXPhubOLj8hZkOL8pDnnXfvCf5xEE8Q4oMFenQUZZREUY2gqQ==}
|
resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
hono: '>=3.9.0'
|
hono: '>=3.9.0'
|
||||||
zod: ^3.19.1
|
zod: ^3.19.1
|
||||||
|
Reference in New Issue
Block a user