Adding the resend package and fixing issues with the webapp
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@trigger.dev/resend": patch
|
||||
---
|
||||
|
||||
Adding the resend integration package
|
||||
@@ -12,7 +12,7 @@ import { run as graphileRun } from "graphile-worker";
|
||||
import { omit } from "lodash";
|
||||
import { z } from "zod";
|
||||
import { PrismaClient, PrismaClientOrTransaction } from "~/db.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
export interface MessageCatalogSchema {
|
||||
[key: string]: z.ZodFirstPartySchemaTypes | z.ZodDiscriminatedUnion<any, any>;
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
DisplayPropertySchema,
|
||||
EventSpecificationSchema,
|
||||
IntegrationMetadataSchema,
|
||||
} from "@/../../packages/internal/src";
|
||||
} from "@trigger.dev/internal";
|
||||
import { PrismaClient, prisma } from "~/db.server";
|
||||
import { Project } from "~/models/project.server";
|
||||
import { User } from "~/models/user.server";
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ import {
|
||||
ClockIcon,
|
||||
XCircleIcon,
|
||||
} from "@heroicons/react/24/solid";
|
||||
import { TaskAttemptStatus } from "@trigger.dev/database";
|
||||
import type { TaskAttemptStatus } from "@trigger.dev/database";
|
||||
import { Paragraph } from "~/components/primitives/Paragraph";
|
||||
import { Spinner } from "~/components/primitives/Spinner";
|
||||
import { cn } from "~/utils/cn";
|
||||
|
||||
+21
-24
@@ -1,28 +1,8 @@
|
||||
import { LoaderArgs } from "@remix-run/server-runtime";
|
||||
import { typedjson, useTypedLoaderData } from "remix-typedjson";
|
||||
import invariant from "tiny-invariant";
|
||||
import { CodeBlock } from "~/components/code/CodeBlock";
|
||||
import { Header3 } from "~/components/primitives/Headers";
|
||||
import { Paragraph } from "~/components/primitives/Paragraph";
|
||||
import { TaskDetailsPresenter } from "~/presenters/TaskDetailsPresenter.server";
|
||||
import { requireUserId } from "~/services/session.server";
|
||||
import { formatDateTime, formatDuration } from "~/utils";
|
||||
import { cn } from "~/utils/cn";
|
||||
import {
|
||||
RunPanel,
|
||||
RunPanelBody,
|
||||
RunPanelDescription,
|
||||
RunPanelDivider,
|
||||
RunPanelProperties,
|
||||
RunPanelHeader,
|
||||
RunPanelIconProperty,
|
||||
RunPanelIconSection,
|
||||
RunPanelIconTitle,
|
||||
UpdatingDelay,
|
||||
UpdatingDuration,
|
||||
} from "../_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/RunCard";
|
||||
import { TaskStatusIcon } from "../_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskStatus";
|
||||
import { sensitiveDataReplacer } from "~/services/logger";
|
||||
import {
|
||||
Table,
|
||||
TableBody,
|
||||
@@ -31,14 +11,31 @@ import {
|
||||
TableHeaderCell,
|
||||
TableRow,
|
||||
} from "~/components/primitives/Table";
|
||||
import { TaskDetailsPresenter } from "~/presenters/TaskDetailsPresenter.server";
|
||||
import { requireUserId } from "~/services/session.server";
|
||||
import { formatDateTime, formatDuration } from "~/utils";
|
||||
import { cn } from "~/utils/cn";
|
||||
import { TaskParamsSchema } from "~/utils/pathBuilder";
|
||||
import {
|
||||
RunPanel,
|
||||
RunPanelBody,
|
||||
RunPanelDescription,
|
||||
RunPanelDivider,
|
||||
RunPanelHeader,
|
||||
RunPanelIconProperty,
|
||||
RunPanelIconSection,
|
||||
RunPanelIconTitle,
|
||||
RunPanelProperties,
|
||||
UpdatingDelay,
|
||||
UpdatingDuration,
|
||||
} from "../_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/RunCard";
|
||||
import { TaskStatusIcon } from "../_app.orgs.$organizationSlug.projects.$projectParam.jobs.$jobParam.runs.$runParam/TaskStatus";
|
||||
import { TaskAttemptStatusLabel } from "./TaskAttemptStatus";
|
||||
import { sensitiveDataReplacer } from "~/services/sensitiveDataReplacer";
|
||||
|
||||
export const loader = async ({ request, params }: LoaderArgs) => {
|
||||
const userId = await requireUserId(request);
|
||||
const { jobParam, runParam, taskParam } = params;
|
||||
invariant(jobParam, "jobParam not found");
|
||||
invariant(runParam, "runParam not found");
|
||||
invariant(taskParam, "selectedParam not found");
|
||||
const { taskParam } = TaskParamsSchema.parse(params);
|
||||
|
||||
const presenter = new TaskDetailsPresenter();
|
||||
const task = await presenter.call({
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import { DisplayProperty, StyleName } from "@/../../packages/internal/src";
|
||||
import type { DisplayProperty, StyleName } from "@trigger.dev/internal";
|
||||
import { motion } from "framer-motion";
|
||||
import { HourglassIcon } from "lucide-react";
|
||||
import { ReactNode, useEffect, useState } from "react";
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import { TaskStatus } from "@/../../packages/internal/src";
|
||||
import type { TaskStatus } from "@trigger.dev/internal";
|
||||
import {
|
||||
CheckCircleIcon,
|
||||
CheckIcon,
|
||||
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
import { RuntimeEnvironmentType } from "@/../../packages/internal/src";
|
||||
import type { RuntimeEnvironmentType } from "@trigger.dev/internal";
|
||||
import { conform } from "@conform-to/react";
|
||||
import { parse } from "@conform-to/zod";
|
||||
import { BoltIcon, ForwardIcon } from "@heroicons/react/24/solid";
|
||||
@@ -294,11 +294,11 @@ export default function Page() {
|
||||
<TaskCard
|
||||
key={task.id}
|
||||
selectedId={selectedId}
|
||||
selectedTask={(taskId) =>
|
||||
selectedTask={(taskId) => {
|
||||
navigate(
|
||||
runTaskPath(organization, project, job, run, taskId)
|
||||
)
|
||||
}
|
||||
);
|
||||
}}
|
||||
isLast={isLast}
|
||||
depth={0}
|
||||
{...task}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { z } from "zod";
|
||||
import { prisma } from "~/db.server";
|
||||
import { resolveApiConnection } from "~/models/runConnection.server";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
endpointSlug: z.string(),
|
||||
|
||||
@@ -2,7 +2,7 @@ import type { ActionArgs } from "@remix-run/server-runtime";
|
||||
import { json } from "@remix-run/server-runtime";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { UnregisterScheduleService } from "~/services/schedules/unregisterSchedule.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
} from "@trigger.dev/internal";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { RegisterScheduleService } from "~/services/schedules/registerSchedule.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -3,7 +3,7 @@ import { json } from "@remix-run/server-runtime";
|
||||
import { UpdateTriggerSourceBodySchema } from "@trigger.dev/internal";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { UpdateSourceService } from "~/services/sources/updateSource.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -3,7 +3,7 @@ import { json } from "@remix-run/server-runtime";
|
||||
import { RegisterTriggerBodySchema } from "@trigger.dev/internal";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { RegisterTriggerSourceService } from "~/services/triggers/registerTriggerSource.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -3,7 +3,7 @@ import { json } from "@remix-run/server-runtime";
|
||||
import { InitializeTriggerBodySchema } from "@trigger.dev/internal";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { InitializeTriggerService } from "~/services/triggers/initializeTrigger.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -3,7 +3,7 @@ import { z } from "zod";
|
||||
import { prisma } from "~/db.server";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { IndexEndpointService } from "~/services/endpoints/indexEndpoint.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
endpointSlug: z.string(),
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
import { ActionArgs, LoaderArgs, json } from "@remix-run/server-runtime";
|
||||
import { z } from "zod";
|
||||
import { PrismaClient, prisma } from "~/db.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { workerQueue } from "~/services/worker.server";
|
||||
import { safeJsonParse } from "~/utils/json";
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { json } from "@remix-run/server-runtime";
|
||||
import { z } from "zod";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { CreateEndpointService } from "~/services/endpoints/createEndpoint.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
const BodySchema = z.object({
|
||||
url: z.string(),
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
authenticateApiRequest,
|
||||
AuthenticatedEnvironment,
|
||||
} from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
runId: z.string(),
|
||||
|
||||
@@ -7,7 +7,7 @@ import { $transaction, PrismaClient, prisma } from "~/db.server";
|
||||
import { taskWithAttemptsToServerTask } from "~/models/task.server";
|
||||
import type { AuthenticatedEnvironment } from "~/services/apiAuth.server";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
runId: z.string(),
|
||||
|
||||
@@ -10,7 +10,7 @@ import { $transaction, PrismaClient, prisma } from "~/db.server";
|
||||
import { taskWithAttemptsToServerTask } from "~/models/task.server";
|
||||
import type { AuthenticatedEnvironment } from "~/services/apiAuth.server";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { formatError } from "~/utils/formatErrors.server";
|
||||
|
||||
const ParamsSchema = z.object({
|
||||
|
||||
@@ -9,7 +9,7 @@ import { z } from "zod";
|
||||
import { $transaction, PrismaClient, prisma } from "~/db.server";
|
||||
import { taskWithAttemptsToServerTask } from "~/models/task.server";
|
||||
import { authenticateApiRequest } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { ulid } from "~/services/ulid.server";
|
||||
import { workerQueue } from "~/services/worker.server";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ActionArgs, LoaderArgs } from "@remix-run/server-runtime";
|
||||
import { z } from "zod";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { HandleHttpSourceService } from "~/services/sources/handleHttpSource.server";
|
||||
|
||||
export async function action({ request, params }: ActionArgs) {
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ import {
|
||||
PongResponseSchema,
|
||||
RunJobResponseSchema,
|
||||
} from "@trigger.dev/internal";
|
||||
import { logger } from "./logger";
|
||||
import { logger } from "./logger.server";
|
||||
|
||||
export class EndpointApiError extends Error {
|
||||
constructor(message: string, stack?: string) {
|
||||
@@ -1,7 +1,7 @@
|
||||
import { customAlphabet } from "nanoid";
|
||||
import { $transaction, prisma, PrismaClient } from "~/db.server";
|
||||
import { AuthenticatedEnvironment } from "../apiAuth.server";
|
||||
import { EndpointApi } from "../endpointApi";
|
||||
import { EndpointApi } from "../endpointApi.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
|
||||
const indexingHookIdentifier = customAlphabet(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { $transaction, PrismaClient } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import { EndpointApi } from "../endpointApi";
|
||||
import { EndpointApi } from "../endpointApi.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
import type { EndpointIndexSource } from "@trigger.dev/database";
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import type { EventDispatcher, EventRecord } from "@trigger.dev/database";
|
||||
import type { EventFilter } from "@trigger.dev/internal";
|
||||
import { EventFilterSchema } from "@trigger.dev/internal";
|
||||
import { $transaction, PrismaClientOrTransaction, prisma } from "~/db.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
|
||||
export class DeliverEventService {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { z } from "zod";
|
||||
import type { PrismaClientOrTransaction } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import { logger } from "~/services/logger";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { CreateRunService } from "~/services/runs/createRun.server";
|
||||
|
||||
const JobVersionDispatchableSchema = z.object({
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { $transaction, PrismaClientOrTransaction, prisma } from "~/db.server";
|
||||
import { IngestSendEvent } from "../events/ingestSendEvent.server";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
import { MISSING_CONNECTION_RESOLVED_NOTIFICATION } from "@/../../packages/internal/src";
|
||||
import { MISSING_CONNECTION_RESOLVED_NOTIFICATION } from "@trigger.dev/internal";
|
||||
|
||||
export class IntegrationConnectionCreatedService {
|
||||
#prismaClient: PrismaClientOrTransaction;
|
||||
|
||||
@@ -15,7 +15,7 @@ import { DEFAULT_MAX_CONCURRENT_RUNS } from "~/consts";
|
||||
import type { PrismaClient } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import type { AuthenticatedEnvironment } from "../apiAuth.server";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
import type { RuntimeEnvironment } from "~/models/runtimeEnvironment.server";
|
||||
import { RegisterScheduleSourceService } from "../schedules/registerScheduleSource.server";
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { EventSpecificationSchema } from "@/../../packages/internal/src";
|
||||
import { EventSpecificationSchema } from "@trigger.dev/internal";
|
||||
import { PrismaClient, prisma } from "~/db.server";
|
||||
import { CreateRunService } from "../runs/createRun.server";
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
import type { LogLevel } from "@trigger.dev/internal";
|
||||
import { Logger } from "@trigger.dev/internal";
|
||||
import { sensitiveDataReplacer } from "./sensitiveDataReplacer";
|
||||
|
||||
export const logger = new Logger(
|
||||
"webapp",
|
||||
(process.env.APP_LOG_LEVEL ?? "debug") as LogLevel,
|
||||
[],
|
||||
sensitiveDataReplacer
|
||||
);
|
||||
@@ -1,7 +1,7 @@
|
||||
import { $transaction, PrismaClientOrTransaction, prisma } from "~/db.server";
|
||||
import { IngestSendEvent } from "../events/ingestSendEvent.server";
|
||||
import { env } from "~/env.server";
|
||||
import { MISSING_CONNECTION_NOTIFICATION } from "@/../../packages/internal/src";
|
||||
import { MISSING_CONNECTION_NOTIFICATION } from "@trigger.dev/internal";
|
||||
|
||||
export class MissingConnectionCreatedService {
|
||||
#prismaClient: PrismaClientOrTransaction;
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ import {
|
||||
} from "~/db.server";
|
||||
import { resolveRunConnections } from "~/models/runConnection.server";
|
||||
import { safeJsonZodParse } from "~/utils/json";
|
||||
import { EndpointApi } from "../endpointApi";
|
||||
import { EndpointApi } from "../endpointApi.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
import { formatError } from "~/utils/formatErrors.server";
|
||||
|
||||
@@ -3,7 +3,7 @@ import { $transaction, PrismaClientOrTransaction, prisma } from "~/db.server";
|
||||
import { NextScheduledEventService } from "./nextScheduledEvent.server";
|
||||
import { IngestSendEvent } from "../events/ingestSendEvent.server";
|
||||
import { InvokeDispatcherService } from "../events/invokeDispatcher.server";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
|
||||
export class DeliverScheduledEventService {
|
||||
#prismaClient: PrismaClientOrTransaction;
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
import { $transaction, PrismaClientOrTransaction, prisma } from "~/db.server";
|
||||
import { parseExpression } from "cron-parser";
|
||||
import { workerQueue } from "../worker.server";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
|
||||
export class NextScheduledEventService {
|
||||
#prismaClient: PrismaClientOrTransaction;
|
||||
|
||||
+1
-9
@@ -1,12 +1,4 @@
|
||||
import type { LogLevel, RedactString } from "@trigger.dev/internal";
|
||||
import { Logger } from "@trigger.dev/internal";
|
||||
|
||||
export const logger = new Logger(
|
||||
"webapp",
|
||||
(process.env.APP_LOG_LEVEL ?? "debug") as LogLevel,
|
||||
[],
|
||||
sensitiveDataReplacer
|
||||
);
|
||||
import type { RedactString } from "@trigger.dev/internal";
|
||||
|
||||
// Replaces redacted strings with "******".
|
||||
// For example, this object: {"Authorization":{"__redactedString":true,"strings":["Bearer ",""],"interpolations":["sk-1234"]}}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { z } from "zod";
|
||||
import type { PrismaClient } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import { EndpointApi } from "../endpointApi";
|
||||
import { EndpointApi } from "../endpointApi.server";
|
||||
import { IngestSendEvent } from "../events/ingestSendEvent.server";
|
||||
import { getSecretStore } from "../secrets/secretStore.server";
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import type { SourceMetadata } from "@trigger.dev/internal";
|
||||
import { $transaction, PrismaClientOrTransaction } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import type { AuthenticatedEnvironment } from "../apiAuth.server";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
import { workerQueue } from "../worker.server";
|
||||
import { generateSecret } from "./utils.server";
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import {
|
||||
calculateRetryAt,
|
||||
} from "@trigger.dev/internal";
|
||||
import { safeJsonFromResponse } from "~/utils/json";
|
||||
import { logger } from "../logger";
|
||||
import { logger } from "../logger.server";
|
||||
import { formatUnknownError } from "~/utils/formatErrors.server";
|
||||
|
||||
type FoundTask = Awaited<ReturnType<typeof findTask>>;
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
import type { PrismaClient } from "~/db.server";
|
||||
import { prisma } from "~/db.server";
|
||||
import { AuthenticatedEnvironment } from "../apiAuth.server";
|
||||
import { EndpointApi } from "../endpointApi";
|
||||
import { EndpointApi } from "../endpointApi.server";
|
||||
import { RegisterTriggerSourceService } from "./registerTriggerSource.server";
|
||||
import { IngestSendEvent } from "../events/ingestSendEvent.server";
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@ export const RunParamsSchema = JobParamsSchema.extend({
|
||||
runParam: z.string(),
|
||||
});
|
||||
|
||||
export const TaskParamsSchema = RunParamsSchema.extend({
|
||||
taskParam: z.string(),
|
||||
});
|
||||
|
||||
export const IntegrationClientParamSchema = ProjectParamSchema.extend({
|
||||
clientParam: z.string(),
|
||||
});
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"@trigger.dev/openai": "workspace:*",
|
||||
"@trigger.dev/sdk": "workspace:*",
|
||||
"@trigger.dev/slack": "workspace:*",
|
||||
"@trigger.dev/resend": "workspace:*",
|
||||
"@types/node": "18.15.13",
|
||||
"@types/react": "^18.0.21",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
@@ -31,4 +32,4 @@
|
||||
"msw": "^0.47.0",
|
||||
"ts-loader": "^9.4.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import { client } from "@/trigger";
|
||||
import { Resend } from "@trigger.dev/resend";
|
||||
import { Job, eventTrigger } from "@trigger.dev/sdk";
|
||||
import { z } from "zod";
|
||||
|
||||
const resend = new Resend({
|
||||
id: "resend-client",
|
||||
apiKey: process.env.RESEND_API_KEY!,
|
||||
});
|
||||
|
||||
new Job(client, {
|
||||
id: "send-resend-email",
|
||||
name: "Send Resend Email",
|
||||
version: "0.1.0",
|
||||
trigger: eventTrigger({
|
||||
name: "send.email",
|
||||
schema: z.object({
|
||||
to: z.union([z.string(), z.array(z.string())]),
|
||||
subject: z.string(),
|
||||
text: z.string(),
|
||||
}),
|
||||
}),
|
||||
integrations: {
|
||||
resend,
|
||||
},
|
||||
run: async (payload, io, ctx) => {
|
||||
await io.resend.sendEmail("📧", {
|
||||
to: payload.to,
|
||||
subject: payload.subject,
|
||||
text: payload.text,
|
||||
from: "Trigger.dev <hello@email.trigger.dev>",
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
import { client } from "@/trigger";
|
||||
import "@/jobs/github";
|
||||
import "@/jobs/openai";
|
||||
import "@/jobs/resend";
|
||||
import { createPagesRoute } from "@trigger.dev/nextjs";
|
||||
|
||||
const { handler, config } = createPagesRoute(client, { path: "/api/trigger" });
|
||||
|
||||
@@ -33,7 +33,9 @@
|
||||
"@trigger.dev/slack": ["../../integrations/slack/src/index"],
|
||||
"@trigger.dev/slack/*": ["../../integrations/slack/src/*"],
|
||||
"@trigger.dev/openai": ["../../integrations/openai/src/index"],
|
||||
"@trigger.dev/openai/*": ["../../integrations/openai/src/*"]
|
||||
"@trigger.dev/openai/*": ["../../integrations/openai/src/*"],
|
||||
"@trigger.dev/resend": ["../../integrations/resend/src/index"],
|
||||
"@trigger.dev/resend/*": ["../../integrations/resend/src/*"]
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
# @trigger.dev/resend
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "@trigger.dev/resend",
|
||||
"version": "1.0.0-next.1",
|
||||
"description": "The official Resend.com integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"files": [
|
||||
"dist/index.js",
|
||||
"dist/index.d.ts",
|
||||
"dist/index.js.map"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@trigger.dev/tsconfig": "workspace:*",
|
||||
"@types/node": "18",
|
||||
"rimraf": "^3.0.2",
|
||||
"tsup": "^6.5.0"
|
||||
},
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"build": "npm run clean && npm run build:tsup",
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^2.0.0-next",
|
||||
"@trigger.dev/sdk": "workspace:^2.0.0-next",
|
||||
"resend": "^0.9.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import type { IntegrationClient, TriggerIntegration } from "@trigger.dev/sdk";
|
||||
import { Resend as ResendClient } from "resend";
|
||||
|
||||
import type { AuthenticatedTask } from "@trigger.dev/sdk";
|
||||
|
||||
type SendEmailData = Parameters<
|
||||
InstanceType<typeof ResendClient>["sendEmail"]
|
||||
>[0];
|
||||
|
||||
type SendEmailResponse = { id: string };
|
||||
|
||||
export const sendEmail: AuthenticatedTask<
|
||||
InstanceType<typeof ResendClient>,
|
||||
SendEmailData,
|
||||
SendEmailResponse
|
||||
> = {
|
||||
run: async (params, client) => {
|
||||
return client.sendEmail(params) as Promise<SendEmailResponse>;
|
||||
},
|
||||
init: (params) => {
|
||||
const subjectProperty = params.subject
|
||||
? [{ label: "Subject", text: params.subject }]
|
||||
: [];
|
||||
|
||||
return {
|
||||
name: "Send Email",
|
||||
params,
|
||||
icon: "resend",
|
||||
properties: [
|
||||
{
|
||||
label: "From",
|
||||
text: params.from,
|
||||
},
|
||||
{
|
||||
label: "To",
|
||||
text: Array.isArray(params.to) ? params.to.join(", ") : params.to,
|
||||
},
|
||||
...subjectProperty,
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
const tasks = {
|
||||
sendEmail,
|
||||
};
|
||||
|
||||
export type ResendIntegrationOptions = {
|
||||
id: string;
|
||||
apiKey: string;
|
||||
};
|
||||
|
||||
export class Resend
|
||||
implements TriggerIntegration<IntegrationClient<ResendClient, typeof tasks>>
|
||||
{
|
||||
client: IntegrationClient<ResendClient, typeof tasks>;
|
||||
|
||||
constructor(private options: ResendIntegrationOptions) {
|
||||
this.client = {
|
||||
tasks,
|
||||
usesLocalAuth: true,
|
||||
client: new ResendClient(options.apiKey),
|
||||
auth: {
|
||||
apiKey: options.apiKey,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
get id() {
|
||||
return this.options.id;
|
||||
}
|
||||
|
||||
get metadata() {
|
||||
return { id: "resend", name: "Resend.com" };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"extends": "@trigger.dev/tsconfig/node18.json",
|
||||
"include": ["./src/**/*.ts", "tsup.config.ts"],
|
||||
"compilerOptions": {
|
||||
"lib": ["DOM", "DOM.Iterable", "ES2019"],
|
||||
"paths": {
|
||||
"@trigger.dev/sdk/*": ["../../packages/trigger-sdk/src/*"],
|
||||
"@trigger.dev/sdk": ["../../packages/trigger-sdk/src/index"],
|
||||
"@trigger.dev/integration-kit/*": [
|
||||
"../../packages/integration-kit/src/*"
|
||||
],
|
||||
"@trigger.dev/integration-kit": [
|
||||
"../../packages/integration-kit/src/index"
|
||||
]
|
||||
},
|
||||
"declaration": false,
|
||||
"declarationMap": false,
|
||||
"baseUrl": "."
|
||||
},
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import { defineConfig } from "tsup";
|
||||
|
||||
export default defineConfig([
|
||||
{
|
||||
name: "main",
|
||||
entry: ["./src/index.ts"],
|
||||
outDir: "./dist",
|
||||
platform: "node",
|
||||
format: ["cjs"],
|
||||
legacyOutput: true,
|
||||
sourcemap: true,
|
||||
clean: true,
|
||||
bundle: true,
|
||||
splitting: false,
|
||||
dts: true,
|
||||
treeshake: {
|
||||
preset: "smallest",
|
||||
},
|
||||
esbuildPlugins: [],
|
||||
external: ["http", "https", "util", "events", "tty", "os", "timers"],
|
||||
},
|
||||
]);
|
||||
Generated
+23
-2
@@ -459,6 +459,7 @@ importers:
|
||||
'@trigger.dev/github': workspace:*
|
||||
'@trigger.dev/nextjs': workspace:*
|
||||
'@trigger.dev/openai': workspace:*
|
||||
'@trigger.dev/resend': workspace:*
|
||||
'@trigger.dev/sdk': workspace:*
|
||||
'@trigger.dev/slack': workspace:*
|
||||
'@types/node': 18.15.13
|
||||
@@ -479,6 +480,7 @@ importers:
|
||||
'@trigger.dev/github': link:../../integrations/github
|
||||
'@trigger.dev/nextjs': link:../../packages/nextjs
|
||||
'@trigger.dev/openai': link:../../integrations/openai
|
||||
'@trigger.dev/resend': link:../../integrations/resend
|
||||
'@trigger.dev/sdk': link:../../packages/trigger-sdk
|
||||
'@trigger.dev/slack': link:../../integrations/slack
|
||||
'@types/node': 18.15.13
|
||||
@@ -549,6 +551,25 @@ importers:
|
||||
rimraf: 3.0.2
|
||||
tsup: 6.6.3
|
||||
|
||||
integrations/resend:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.0.0-next
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
resend: ^0.9.1
|
||||
rimraf: ^3.0.2
|
||||
tsup: ^6.5.0
|
||||
dependencies:
|
||||
'@trigger.dev/integration-kit': link:../../packages/integration-kit
|
||||
'@trigger.dev/sdk': link:../../packages/trigger-sdk
|
||||
resend: 0.9.1
|
||||
devDependencies:
|
||||
'@trigger.dev/tsconfig': link:../../config-packages/tsconfig
|
||||
'@types/node': 18.15.13
|
||||
rimraf: 3.0.2
|
||||
tsup: 6.6.3
|
||||
|
||||
integrations/slack:
|
||||
specifiers:
|
||||
'@slack/web-api': ^6.8.1
|
||||
@@ -23492,7 +23513,7 @@ packages:
|
||||
resolve-from: 5.0.0
|
||||
rollup: 3.10.0
|
||||
source-map: 0.8.0-beta.0
|
||||
sucrase: 3.29.0
|
||||
sucrase: 3.32.0
|
||||
tree-kill: 1.2.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@@ -23527,7 +23548,7 @@ packages:
|
||||
resolve-from: 5.0.0
|
||||
rollup: 3.10.0
|
||||
source-map: 0.8.0-beta.0
|
||||
sucrase: 3.29.0
|
||||
sucrase: 3.32.0
|
||||
tree-kill: 1.2.2
|
||||
typescript: 4.9.5
|
||||
transitivePeerDependencies:
|
||||
|
||||
Reference in New Issue
Block a user