Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a8db8ce4e4 | |||
| a7ca1222d7 | |||
| c9733f357f | |||
| ba61bfe3b9 | |||
| 89eaef495f | |||
| 6a379e4e91 | |||
| c0b815c363 | |||
| 598906fc4c | |||
| b77ece1567 | |||
| a73dc80177 | |||
| 2496917a7a | |||
| dc53f0f432 | |||
| 87788f29c9 | |||
| 6ede68648a | |||
| f24b5b770d | |||
| cb81d6c835 | |||
| 72748603ab | |||
| f96f1e91a2 | |||
| 21c8b847e5 | |||
| b39f79f0ab |
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"trigger.dev": patch
|
||||
---
|
||||
|
||||
Better handle issues with resolving dependency versions during deploy
|
||||
@@ -61,6 +61,7 @@
|
||||
"dull-mangos-press",
|
||||
"eight-pumas-float",
|
||||
"eleven-paws-join",
|
||||
"famous-boats-tease",
|
||||
"few-students-share",
|
||||
"funny-swans-destroy",
|
||||
"gorgeous-gorillas-compete",
|
||||
@@ -117,8 +118,10 @@
|
||||
"tender-moose-tell",
|
||||
"tender-oranges-rhyme",
|
||||
"thin-parents-heal",
|
||||
"thirty-islands-kiss",
|
||||
"tidy-balloons-suffer",
|
||||
"tidy-dryers-sleep",
|
||||
"tidy-tomatoes-explain",
|
||||
"tiny-doors-type",
|
||||
"tiny-elephants-scream",
|
||||
"tricky-bulldogs-heal",
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"trigger.dev": patch
|
||||
---
|
||||
|
||||
Fix for typo in v3 CLI login command
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@trigger.dev/core": patch
|
||||
---
|
||||
|
||||
Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace
|
||||
@@ -115,14 +115,7 @@ export function Feedback({ button, defaultValue = "bug" }: FeedbackProps) {
|
||||
Docs
|
||||
</LinkButton>
|
||||
<LinkButton
|
||||
to={docsPath("v3/introduction")}
|
||||
variant="tertiary/medium"
|
||||
LeadingIcon={BookOpenIcon}
|
||||
>
|
||||
v3 Docs (Developer preview)
|
||||
</LinkButton>
|
||||
<LinkButton
|
||||
to={"https://trigger.openstatus.dev/"}
|
||||
to={"https://status.trigger.dev/"}
|
||||
variant="tertiary/medium"
|
||||
LeadingIcon={ActivityIcon}
|
||||
>
|
||||
|
||||
@@ -20,9 +20,11 @@ export function AdminDebugTooltip({ children }: { children: React.ReactNode }) {
|
||||
<TooltipProvider>
|
||||
<Tooltip>
|
||||
<TooltipTrigger>
|
||||
<ShieldCheckIcon className="h-5 w-5" />
|
||||
<ShieldCheckIcon className="size-5" />
|
||||
</TooltipTrigger>
|
||||
<TooltipContent className="flex items-center gap-1">{children}</TooltipContent>
|
||||
<TooltipContent className="flex max-h-[90vh] items-center gap-1 overflow-y-auto">
|
||||
{children}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
</TooltipProvider>
|
||||
);
|
||||
|
||||
@@ -233,31 +233,22 @@ export function SideMenu({ user, project, organization, organizations }: SideMen
|
||||
</div>
|
||||
<hr className="border-charcoal-800" />
|
||||
<div>
|
||||
<StepNumber stepNumber="1" title="Create a new Slack channel" />
|
||||
<StepNumber stepNumber="1" title="Email us" />
|
||||
<StepContentContainer>
|
||||
<Paragraph>
|
||||
In your Slack app, create a new channel from the main menu by going to File{" "}
|
||||
<ArrowRightIcon className="inline h-4 w-4 text-text-dimmed" /> New Channel
|
||||
</Paragraph>
|
||||
</StepContentContainer>
|
||||
<StepNumber stepNumber="2" title="Setup your channel" />
|
||||
<StepContentContainer>
|
||||
<Paragraph>
|
||||
Name your channel, set its visibility and click 'Create'.
|
||||
</Paragraph>
|
||||
</StepContentContainer>
|
||||
<StepNumber stepNumber="3" title="Invite Trigger.dev" />
|
||||
<StepContentContainer>
|
||||
<Paragraph>
|
||||
Invite this email address to your channel:{" "}
|
||||
Send us an email to this address from your Trigger.dev account email
|
||||
address:
|
||||
<ClipboardField
|
||||
variant="primary/medium"
|
||||
value="james@trigger.dev"
|
||||
value="priority-support@trigger.dev"
|
||||
className="my-2"
|
||||
/>
|
||||
</Paragraph>
|
||||
</StepContentContainer>
|
||||
<StepNumber stepNumber="2" title="Look out for an invite from Slack" />
|
||||
<StepContentContainer>
|
||||
<Paragraph>
|
||||
As soon as we can, we'll accept your invitation and say hello!
|
||||
As soon as we can, we'll setup a Slack Connect channel and say hello!
|
||||
</Paragraph>
|
||||
</StepContentContainer>
|
||||
</div>
|
||||
@@ -551,6 +542,8 @@ function V3ProjectSideMenu({
|
||||
project: SideMenuProject;
|
||||
organization: MatchedOrganization;
|
||||
}) {
|
||||
const { alertsEnabled } = useFeatures();
|
||||
|
||||
return (
|
||||
<>
|
||||
<SideMenuHeader title={"Project (v3)"} />
|
||||
@@ -603,13 +596,15 @@ function V3ProjectSideMenu({
|
||||
to={v3DeploymentsPath(organization, project)}
|
||||
data-action="deployments"
|
||||
/>
|
||||
<SideMenuItem
|
||||
name="Alerts"
|
||||
icon={BellAlertIcon}
|
||||
iconColor="text-red-500"
|
||||
to={v3ProjectAlertsPath(organization, project)}
|
||||
data-action="alerts"
|
||||
/>
|
||||
{alertsEnabled && (
|
||||
<SideMenuItem
|
||||
name="Alerts"
|
||||
icon={BellAlertIcon}
|
||||
iconColor="text-red-500"
|
||||
to={v3ProjectAlertsPath(organization, project)}
|
||||
data-action="alerts"
|
||||
/>
|
||||
)}
|
||||
<SideMenuItem
|
||||
name="Project settings"
|
||||
icon="settings"
|
||||
|
||||
@@ -47,6 +47,8 @@ const EnvironmentSchema = z.object({
|
||||
WORKER_SCHEMA: z.string().default("graphile_worker"),
|
||||
WORKER_CONCURRENCY: z.coerce.number().int().default(10),
|
||||
WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
|
||||
/** The number of days a failed Graphile task should stay before getting cleaned up */
|
||||
WORKER_CLEANUP_TTL_DAYS: z.coerce.number().int().default(3),
|
||||
EXECUTION_WORKER_CONCURRENCY: z.coerce.number().int().default(10),
|
||||
EXECUTION_WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
|
||||
WORKER_ENABLED: z.string().default("true"),
|
||||
@@ -156,6 +158,12 @@ const EnvironmentSchema = z.object({
|
||||
|
||||
ORG_SLACK_INTEGRATION_CLIENT_ID: z.string().optional(),
|
||||
ORG_SLACK_INTEGRATION_CLIENT_SECRET: z.string().optional(),
|
||||
|
||||
/** These enable the alerts feature in v3 */
|
||||
ALERT_FROM_EMAIL: z.string().optional(),
|
||||
ALERT_RESEND_API_KEY: z.string().optional(),
|
||||
|
||||
MAX_SEQUENTIAL_INDEX_FAILURE_COUNT: z.coerce.number().default(96),
|
||||
});
|
||||
|
||||
export type Environment = z.infer<typeof EnvironmentSchema>;
|
||||
|
||||
@@ -4,6 +4,7 @@ import { requestUrl } from "./utils/requestUrl.server";
|
||||
export type TriggerFeatures = {
|
||||
isManagedCloud: boolean;
|
||||
v3Enabled: boolean;
|
||||
alertsEnabled: boolean;
|
||||
};
|
||||
|
||||
// If the request host is cloud.trigger.dev then we are on the managed cloud
|
||||
@@ -20,5 +21,6 @@ export function featuresForRequest(request: Request): TriggerFeatures {
|
||||
return {
|
||||
isManagedCloud,
|
||||
v3Enabled: env.V3_ENABLED === "true",
|
||||
alertsEnabled: env.ALERT_FROM_EMAIL !== undefined && env.ALERT_RESEND_API_KEY !== undefined,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@ import type { TriggerFeatures } from "~/features.server";
|
||||
export function useFeatures(): TriggerFeatures {
|
||||
const routeMatch = useTypedRouteLoaderData<typeof loader>("root");
|
||||
|
||||
return routeMatch?.features ?? { isManagedCloud: false, v3Enabled: false };
|
||||
return routeMatch?.features ?? { isManagedCloud: false, v3Enabled: false, alertsEnabled: false };
|
||||
}
|
||||
|
||||
@@ -577,6 +577,17 @@ export class ZodWorker<TMessageCatalog extends MessageCatalogSchema> {
|
||||
span.recordException(new Error(String(error)));
|
||||
}
|
||||
|
||||
if (job.attempts >= job.max_attempts) {
|
||||
logger.debug("Job failed after max attempts", {
|
||||
job,
|
||||
attempts: job.attempts,
|
||||
max_attempts: job.max_attempts,
|
||||
error: error instanceof Error ? error.message : error,
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
throw error;
|
||||
} finally {
|
||||
span.end();
|
||||
|
||||
+47
-13
@@ -1,6 +1,7 @@
|
||||
import { useForm } from "@conform-to/react";
|
||||
import { parse } from "@conform-to/zod";
|
||||
import {
|
||||
ArrowUpRightIcon,
|
||||
BoltIcon,
|
||||
BoltSlashIcon,
|
||||
BookOpenIcon,
|
||||
@@ -15,12 +16,14 @@ import { ActionFunctionArgs, LoaderFunctionArgs, json } from "@remix-run/server-
|
||||
import { SlackIcon } from "@trigger.dev/companyicons";
|
||||
import { ProjectAlertChannelType, ProjectAlertType } from "@trigger.dev/database";
|
||||
import assertNever from "assert-never";
|
||||
import { ExternalLinkIcon } from "lucide-react";
|
||||
import { typedjson, useTypedLoaderData } from "remix-typedjson";
|
||||
import { z } from "zod";
|
||||
import { PageBody, PageContainer } from "~/components/layout/AppLayout";
|
||||
import { Button, LinkButton } from "~/components/primitives/Buttons";
|
||||
import { ClipboardField } from "~/components/primitives/ClipboardField";
|
||||
import { DetailCell } from "~/components/primitives/DetailCell";
|
||||
import { Header2 } from "~/components/primitives/Headers";
|
||||
import { NavBar, PageAccessories, PageTitle } from "~/components/primitives/PageHeader";
|
||||
import { Paragraph } from "~/components/primitives/Paragraph";
|
||||
import {
|
||||
@@ -155,7 +158,7 @@ export default function Page() {
|
||||
<PageAccessories>
|
||||
<LinkButton
|
||||
LeadingIcon={BookOpenIcon}
|
||||
to={docsPath("v3/project-alerts")}
|
||||
to={docsPath("v3/troubleshooting-alerts")}
|
||||
variant="minimal/small"
|
||||
>
|
||||
Alerts docs
|
||||
@@ -164,16 +167,19 @@ export default function Page() {
|
||||
</NavBar>
|
||||
<PageBody>
|
||||
<div className={cn("flex h-full flex-col gap-3")}>
|
||||
<div className="flex items-center justify-end gap-2">
|
||||
<LinkButton
|
||||
to={v3NewProjectAlertPath(organization, project)}
|
||||
variant="primary/small"
|
||||
LeadingIcon={PlusIcon}
|
||||
shortcut={{ key: "n" }}
|
||||
>
|
||||
New alert
|
||||
</LinkButton>
|
||||
</div>
|
||||
{alertChannels.length > 0 && alertChannels.length < 10 && (
|
||||
<div className="flex items-end justify-between">
|
||||
<Header2 className="">Project alerts</Header2>
|
||||
<LinkButton
|
||||
to={v3NewProjectAlertPath(organization, project)}
|
||||
variant="primary/small"
|
||||
LeadingIcon={PlusIcon}
|
||||
shortcut={{ key: "n" }}
|
||||
>
|
||||
New alert
|
||||
</LinkButton>
|
||||
</div>
|
||||
)}
|
||||
<Table>
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
@@ -214,14 +220,42 @@ export default function Page() {
|
||||
) : (
|
||||
<TableRow>
|
||||
<TableCell colSpan={5}>
|
||||
<div className="flex items-center justify-center">
|
||||
<Paragraph>No alerts have been created</Paragraph>
|
||||
<div className="flex flex-col items-center justify-center py-6">
|
||||
<Header2 spacing className="text-text-bright">
|
||||
You haven't created any project alerts yet
|
||||
</Header2>
|
||||
<Paragraph variant="small" className="mb-4">
|
||||
Get alerted when runs or deployments fail, or when deployments succeed.
|
||||
</Paragraph>
|
||||
<LinkButton
|
||||
to={v3NewProjectAlertPath(organization, project)}
|
||||
variant="primary/medium"
|
||||
LeadingIcon={PlusIcon}
|
||||
shortcut={{ key: "n" }}
|
||||
>
|
||||
New alert
|
||||
</LinkButton>
|
||||
</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
)}
|
||||
</TableBody>
|
||||
</Table>
|
||||
<div className="mt-4">
|
||||
<Header2 className="mb-1">Platform alerts</Header2>
|
||||
<Paragraph variant="small" className="mb-4">
|
||||
Get email notifications when Trigger.dev creates, updates or resolves a platform
|
||||
incident.
|
||||
</Paragraph>
|
||||
<LinkButton
|
||||
variant="tertiary/medium"
|
||||
TrailingIcon={ArrowUpRightIcon}
|
||||
to="https://status.trigger.dev/"
|
||||
target="_blank"
|
||||
>
|
||||
Subscribe
|
||||
</LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
<Outlet />
|
||||
</PageBody>
|
||||
|
||||
+1
-1
@@ -106,7 +106,7 @@ export class TriggerEndpointIndexHookService {
|
||||
},
|
||||
});
|
||||
|
||||
if (!endpoint) {
|
||||
if (!endpoint || !endpoint.url) {
|
||||
throw new Error("Endpoint not found");
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,10 @@ const ParamsSchema = z.object({
|
||||
});
|
||||
|
||||
export const HeadersSchema = z.object({
|
||||
"idempotency-key": z.string().optional().nullable(),
|
||||
"trigger-version": z.string().optional().nullable(),
|
||||
"x-trigger-span-parent-as-link": z.coerce.number().optional().nullable(),
|
||||
"idempotency-key": z.string().nullish(),
|
||||
"trigger-version": z.string().nullish(),
|
||||
"x-trigger-span-parent-as-link": z.coerce.number().nullish(),
|
||||
"x-trigger-worker": z.string().nullish(),
|
||||
traceparent: z.string().optional(),
|
||||
tracestate: z.string().optional(),
|
||||
});
|
||||
@@ -45,6 +46,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
|
||||
"x-trigger-span-parent-as-link": spanParentAsLink,
|
||||
traceparent,
|
||||
tracestate,
|
||||
"x-trigger-worker": isFromWorker,
|
||||
} = headers.data;
|
||||
|
||||
const { taskId } = ParamsSchema.parse(params);
|
||||
@@ -58,20 +60,31 @@ export async function action({ request, params }: ActionFunctionArgs) {
|
||||
return json({ error: "Invalid request body" }, { status: 400 });
|
||||
}
|
||||
|
||||
logger.debug("Triggering task", {
|
||||
taskId,
|
||||
idempotencyKey,
|
||||
triggerVersion,
|
||||
body: body.data,
|
||||
});
|
||||
|
||||
const service = new TriggerTaskService();
|
||||
|
||||
try {
|
||||
const traceContext = traceparent
|
||||
? !triggerVersion // If the trigger version is NOT set, we are in an older version of the SDK
|
||||
? { traceparent, tracestate }
|
||||
: isFromWorker // If the trigger version is set, and the request is from a worker, we should pass the trace context
|
||||
? { traceparent, tracestate }
|
||||
: undefined
|
||||
: undefined;
|
||||
|
||||
logger.debug("Triggering task", {
|
||||
taskId,
|
||||
idempotencyKey,
|
||||
triggerVersion,
|
||||
headers: Object.fromEntries(request.headers),
|
||||
body: body.data,
|
||||
isFromWorker,
|
||||
traceContext,
|
||||
});
|
||||
|
||||
const run = await service.call(taskId, authenticationResult.environment, body.data, {
|
||||
idempotencyKey: idempotencyKey ?? undefined,
|
||||
triggerVersion: triggerVersion ?? undefined,
|
||||
traceContext: traceparent ? { traceparent, tracestate } : undefined,
|
||||
traceContext,
|
||||
spanParentAsLink: spanParentAsLink === 1,
|
||||
});
|
||||
|
||||
|
||||
@@ -191,6 +191,7 @@ export const apiRateLimiter = authorizationRateLimitMiddleware({
|
||||
pathMatchers: [/^\/api/],
|
||||
// Allow /api/v1/tasks/:id/callback/:secret
|
||||
pathWhiteList: [
|
||||
"/api/internal/stripe_webhooks",
|
||||
"/api/v1/authorization-code",
|
||||
"/api/v1/token",
|
||||
/^\/api\/v1\/tasks\/[^\/]+\/callback\/[^\/]+$/, // /api/v1/tasks/$id/callback/$secret
|
||||
|
||||
@@ -20,6 +20,17 @@ const client = singleton(
|
||||
})
|
||||
);
|
||||
|
||||
const alertsClient = singleton(
|
||||
"alerts-email-client",
|
||||
() =>
|
||||
new EmailClient({
|
||||
apikey: env.ALERT_RESEND_API_KEY,
|
||||
imagesBaseUrl: env.APP_ORIGIN,
|
||||
from: env.ALERT_FROM_EMAIL ?? "noreply@alerts.trigger.dev",
|
||||
replyTo: env.REPLY_TO_EMAIL ?? "help@email.trigger.dev",
|
||||
})
|
||||
);
|
||||
|
||||
export async function sendMagicLinkEmail(options: SendEmailOptions<AuthUser>): Promise<void> {
|
||||
// Auto redirect when in development mode
|
||||
if (env.NODE_ENV === "development") {
|
||||
@@ -67,3 +78,7 @@ export async function scheduleEmail(data: DeliverEmail, delay?: { seconds: numbe
|
||||
export async function sendEmail(data: DeliverEmail) {
|
||||
return client.send(data);
|
||||
}
|
||||
|
||||
export async function sendAlertEmail(data: DeliverEmail) {
|
||||
return alertsClient.send(data);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,9 @@ import { IndexEndpointStats } from "@trigger.dev/core";
|
||||
import { RegisterHttpEndpointService } from "../triggers/registerHttpEndpoint.server";
|
||||
import { RegisterWebhookService } from "../triggers/registerWebhook.server";
|
||||
import { EndpointIndex } from "@trigger.dev/database";
|
||||
import { env } from "~/env.server";
|
||||
|
||||
const MAX_SEQUENTIAL_FAILURE_COUNT = env.MAX_SEQUENTIAL_INDEX_FAILURE_COUNT;
|
||||
|
||||
export class PerformEndpointIndexService {
|
||||
#prismaClient: PrismaClient;
|
||||
@@ -56,9 +59,16 @@ export class PerformEndpointIndexService {
|
||||
|
||||
if (!endpointIndex.endpoint.url) {
|
||||
logger.debug("Endpoint URL is not set", endpointIndex);
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: "Endpoint URL is not set",
|
||||
});
|
||||
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: "Endpoint URL is not set",
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
// Make a request to the endpoint to fetch a list of jobs
|
||||
@@ -69,9 +79,15 @@ export class PerformEndpointIndexService {
|
||||
const { response, parser, headerParser, errorParser } = await client.indexEndpoint();
|
||||
|
||||
if (!response) {
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}`,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}`,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
if (isRedirect(response.status)) {
|
||||
@@ -83,15 +99,27 @@ export class PerformEndpointIndexService {
|
||||
const location = response.headers.get("location");
|
||||
|
||||
if (!location) {
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting but no location header is present`,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting but no location header is present`,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
if (redirectCount > 5) {
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting too many times`,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting too many times`,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
await this.#prismaClient.endpoint.update({
|
||||
@@ -111,20 +139,38 @@ export class PerformEndpointIndexService {
|
||||
const body = await safeBodyFromResponse(response, errorParser);
|
||||
|
||||
if (body) {
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: body.message,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: body.message,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: "Trigger API key is invalid",
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: "Trigger API key is invalid",
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
if (!response.ok) {
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}. Status code: ${response.status}`,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}. Status code: ${response.status}`,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
const anyBody = await response.json();
|
||||
@@ -152,10 +198,16 @@ export class PerformEndpointIndexService {
|
||||
}).message;
|
||||
}
|
||||
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: friendlyError,
|
||||
raw: fromZodError(bodyResult.error).message,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: friendlyError,
|
||||
raw: fromZodError(bodyResult.error).message,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
const headerResult = headerParser.safeParse(Object.fromEntries(response.headers.entries()));
|
||||
@@ -163,10 +215,16 @@ export class PerformEndpointIndexService {
|
||||
const friendlyError = fromZodError(headerResult.error, {
|
||||
prefix: "Your headers are invalid",
|
||||
});
|
||||
return updateEndpointIndexWithError(this.#prismaClient, id, {
|
||||
message: friendlyError.message,
|
||||
raw: headerResult.error.issues,
|
||||
});
|
||||
return updateEndpointIndexWithError(
|
||||
this.#prismaClient,
|
||||
id,
|
||||
endpointIndex.endpoint.id,
|
||||
{
|
||||
message: friendlyError.message,
|
||||
raw: headerResult.error.issues,
|
||||
},
|
||||
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
|
||||
);
|
||||
}
|
||||
|
||||
const { jobs, sources, dynamicTriggers, dynamicSchedules, httpEndpoints, webhooks } =
|
||||
@@ -407,8 +465,49 @@ export class PerformEndpointIndexService {
|
||||
async function updateEndpointIndexWithError(
|
||||
prismaClient: PrismaClient,
|
||||
id: string,
|
||||
error: EndpointIndexError
|
||||
endpointId: string,
|
||||
error: EndpointIndexError,
|
||||
checkDisabling = true
|
||||
) {
|
||||
// Check here to see if this endpoint has only failed for the last 50 times
|
||||
// And if so, we disable the endpoint by setting the url to null
|
||||
if (checkDisabling) {
|
||||
const recentIndexes = await prismaClient.endpointIndex.findMany({
|
||||
where: {
|
||||
endpointId,
|
||||
id: {
|
||||
not: id,
|
||||
},
|
||||
},
|
||||
orderBy: {
|
||||
createdAt: "desc",
|
||||
},
|
||||
take: MAX_SEQUENTIAL_FAILURE_COUNT - 1,
|
||||
select: {
|
||||
status: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (
|
||||
recentIndexes.length === MAX_SEQUENTIAL_FAILURE_COUNT - 1 &&
|
||||
recentIndexes.every((index) => index.status === "FAILURE")
|
||||
) {
|
||||
logger.debug("Disabling endpoint", {
|
||||
endpointId,
|
||||
error,
|
||||
});
|
||||
|
||||
await prismaClient.endpoint.update({
|
||||
where: {
|
||||
id: endpointId,
|
||||
},
|
||||
data: {
|
||||
url: null,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return await prismaClient.endpointIndex.update({
|
||||
where: {
|
||||
id,
|
||||
|
||||
@@ -32,10 +32,11 @@ export class HandleHttpSourceService {
|
||||
return { status: 200 };
|
||||
}
|
||||
|
||||
if (!triggerSource.endpoint.url) {
|
||||
return { status: 404 };
|
||||
}
|
||||
|
||||
if (!triggerSource.organization.runsEnabled) {
|
||||
logger.debug("HandleHttpSourceService: Runs are disabled for this organization", {
|
||||
organizationId: triggerSource.organization.id,
|
||||
});
|
||||
return { status: 404 };
|
||||
}
|
||||
|
||||
|
||||
@@ -232,11 +232,6 @@ function getWorkerQueue() {
|
||||
return new ZodWorker({
|
||||
name: "workerQueue",
|
||||
prisma,
|
||||
cleanup: {
|
||||
frequencyExpression: "13,27,43 * * * *",
|
||||
ttl: 7 * 24 * 60 * 60 * 1000, // 7 days
|
||||
maxCount: 1000,
|
||||
},
|
||||
runnerOptions: {
|
||||
connectionString: env.DATABASE_URL,
|
||||
concurrency: env.WORKER_CONCURRENCY,
|
||||
|
||||
@@ -12,7 +12,7 @@ import { prisma } from "~/db.server";
|
||||
import { createNewSession, disconnectSession } from "~/models/runtimeEnvironment.server";
|
||||
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { marqs } from "~/v3/marqs/index.server";
|
||||
import { marqs, sanitizeQueueName } from "~/v3/marqs/index.server";
|
||||
import { EnvironmentVariablesRepository } from "../environmentVariables/environmentVariablesRepository.server";
|
||||
import { generateFriendlyId } from "../friendlyIdentifiers";
|
||||
import { CancelAttemptService } from "../services/cancelAttempt.server";
|
||||
@@ -90,6 +90,10 @@ export class DevQueueConsumer {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._backgroundWorkers.has(backgroundWorker.id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._backgroundWorkers.set(backgroundWorker.id, backgroundWorker);
|
||||
|
||||
logger.debug("Registered background worker", { backgroundWorker: backgroundWorker.id });
|
||||
@@ -271,10 +275,10 @@ export class DevQueueConsumer {
|
||||
return;
|
||||
}
|
||||
|
||||
this._enabled = true;
|
||||
// Create the session
|
||||
await createNewSession(this.env, this._options.ipAddress ?? "unknown");
|
||||
|
||||
this._enabled = true;
|
||||
this._perTraceCountdown = this._options.maximumItemsPerTrace;
|
||||
this._lastNewTrace = new Date();
|
||||
this._taskFailures = 0;
|
||||
@@ -448,11 +452,21 @@ export class DevQueueConsumer {
|
||||
|
||||
const queue = await prisma.taskQueue.findUnique({
|
||||
where: {
|
||||
runtimeEnvironmentId_name: { runtimeEnvironmentId: this.env.id, name: lockedTaskRun.queue },
|
||||
runtimeEnvironmentId_name: {
|
||||
runtimeEnvironmentId: this.env.id,
|
||||
name: sanitizeQueueName(lockedTaskRun.queue),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!queue) {
|
||||
logger.debug("[DevQueueConsumer] Failed to find queue", {
|
||||
queueName: lockedTaskRun.queue,
|
||||
sanitizedName: sanitizeQueueName(lockedTaskRun.queue),
|
||||
taskRun: lockedTaskRun.id,
|
||||
messageId: message.messageId,
|
||||
});
|
||||
|
||||
await marqs?.nackMessage(message.messageId);
|
||||
setTimeout(() => this.#doWork(), 1000);
|
||||
return;
|
||||
|
||||
@@ -21,7 +21,7 @@ import { z } from "zod";
|
||||
import { prisma } from "~/db.server";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { singleton } from "~/utils/singleton";
|
||||
import { marqs } from "~/v3/marqs/index.server";
|
||||
import { marqs, sanitizeQueueName } from "~/v3/marqs/index.server";
|
||||
import { EnvironmentVariablesRepository } from "../environmentVariables/environmentVariablesRepository.server";
|
||||
import { generateFriendlyId } from "../friendlyIdentifiers";
|
||||
import { socketIo } from "../handleSocketIo.server";
|
||||
@@ -408,7 +408,7 @@ export class SharedQueueConsumer {
|
||||
where: {
|
||||
runtimeEnvironmentId_name: {
|
||||
runtimeEnvironmentId: lockedTaskRun.runtimeEnvironmentId,
|
||||
name: lockedTaskRun.queue,
|
||||
name: sanitizeQueueName(lockedTaskRun.queue),
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -635,12 +635,17 @@ export class SharedQueueConsumer {
|
||||
where: {
|
||||
runtimeEnvironmentId_name: {
|
||||
runtimeEnvironmentId: resumableAttempt.runtimeEnvironmentId,
|
||||
name: resumableRun.queue,
|
||||
name: sanitizeQueueName(resumableRun.queue),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!queue) {
|
||||
logger.debug("SharedQueueConsumer queue not found, so nacking message", {
|
||||
queueName: sanitizeQueueName(resumableRun.queue),
|
||||
attempt: resumableAttempt,
|
||||
});
|
||||
|
||||
await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
ProjectAlertWebhookProperties,
|
||||
} from "~/models/projectAlert.server";
|
||||
import { DeploymentPresenter } from "~/presenters/v3/DeploymentPresenter.server";
|
||||
import { sendEmail } from "~/services/email.server";
|
||||
import { sendAlertEmail, sendEmail } from "~/services/email.server";
|
||||
import { logger } from "~/services/logger.server";
|
||||
import { decryptSecret } from "~/services/secrets/secretStore.server";
|
||||
import { workerQueue } from "~/services/worker.server";
|
||||
@@ -144,7 +144,7 @@ export class DeliverAlertService extends BaseService {
|
||||
return;
|
||||
}
|
||||
|
||||
await sendEmail({
|
||||
await sendAlertEmail({
|
||||
email: "alert-attempt",
|
||||
to: emailProperties.data.email,
|
||||
taskIdentifier: alert.taskRunAttempt.taskRun.taskIdentifier,
|
||||
@@ -177,7 +177,7 @@ export class DeliverAlertService extends BaseService {
|
||||
return;
|
||||
}
|
||||
|
||||
await sendEmail({
|
||||
await sendAlertEmail({
|
||||
email: "alert-deployment-failure",
|
||||
to: emailProperties.data.email,
|
||||
version: alert.workerDeployment.version,
|
||||
@@ -197,7 +197,7 @@ export class DeliverAlertService extends BaseService {
|
||||
}
|
||||
case "DEPLOYMENT_SUCCESS": {
|
||||
if (alert.workerDeployment) {
|
||||
await sendEmail({
|
||||
await sendAlertEmail({
|
||||
email: "alert-deployment-success",
|
||||
to: emailProperties.data.email,
|
||||
version: alert.workerDeployment.version,
|
||||
|
||||
@@ -81,6 +81,22 @@ export class RestoreCheckpointService extends BaseService {
|
||||
return;
|
||||
}
|
||||
|
||||
const restoreEvent = await this._prisma.checkpointRestoreEvent.findFirst({
|
||||
where: {
|
||||
checkpointId: checkpoint.id,
|
||||
type: "RESTORE",
|
||||
},
|
||||
});
|
||||
|
||||
if (restoreEvent) {
|
||||
logger.error("Restore event already exists", {
|
||||
checkpointId: checkpoint.id,
|
||||
restoreEventId: restoreEvent.id,
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const eventService = new CreateCheckpointRestoreEventService(this._prisma);
|
||||
await eventService.restore({ checkpointId: checkpoint.id });
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ function getTracer() {
|
||||
if (env.INTERNAL_OTEL_TRACE_EXPORTER_URL) {
|
||||
const exporter = new OTLPTraceExporter({
|
||||
url: env.INTERNAL_OTEL_TRACE_EXPORTER_URL,
|
||||
timeoutMillis: 1000,
|
||||
timeoutMillis: 10_000,
|
||||
headers:
|
||||
env.INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_NAME &&
|
||||
env.INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_VALUE
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 89 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
+13
-72
@@ -95,13 +95,7 @@
|
||||
{
|
||||
"group": "Getting Started",
|
||||
"version": "v3 (Developer Preview)",
|
||||
"pages": [
|
||||
"v3/quick-start",
|
||||
"v3/upgrading-from-v2",
|
||||
"v3/changelog",
|
||||
"v3/feature-matrix",
|
||||
"v3/limits-performance"
|
||||
]
|
||||
"pages": ["v3/quick-start", "v3/upgrading-from-v2", "v3/changelog", "v3/feature-matrix"]
|
||||
},
|
||||
{
|
||||
"group": "Fundamentals",
|
||||
@@ -113,7 +107,7 @@
|
||||
"v3/apikeys",
|
||||
{
|
||||
"group": "Task types",
|
||||
"pages": ["v3/tasks-regular", "v3/tasks-scheduled", "v3/tasks-zod", "v3/tasks-webhooks"]
|
||||
"pages": ["v3/tasks-regular", "v3/tasks-scheduled"]
|
||||
},
|
||||
"v3/trigger-config"
|
||||
]
|
||||
@@ -158,12 +152,7 @@
|
||||
"v3/machines",
|
||||
"v3/idempotency",
|
||||
"v3/reattempting-replaying",
|
||||
"v3/trigger-filters",
|
||||
"v3/notifications",
|
||||
"v3/rollbacks",
|
||||
"v3/using-apis",
|
||||
"v3/middleware",
|
||||
"v3/automated-tests"
|
||||
"v3/notifications"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -189,77 +178,29 @@
|
||||
"v3/management-deactivate-schedule",
|
||||
"v3/management-activate-schedule"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Functions",
|
||||
"pages": [
|
||||
"v3/reference-task",
|
||||
"v3/reference-cron-task",
|
||||
"v3/reference-cron-dynamic",
|
||||
"v3/reference-interval-task",
|
||||
"v3/reference-interval-dynamic",
|
||||
"v3/reference-zod-task",
|
||||
"v3/reference-zod-catalog",
|
||||
"v3/reference-task-trigger",
|
||||
"v3/reference-task-trigger-and-wait",
|
||||
"v3/reference-task-batch-trigger",
|
||||
"v3/reference-task-batch-trigger-and-wait",
|
||||
"v3/reference-wait-for",
|
||||
"v3/reference-wait-until",
|
||||
"v3/reference-wait-for-event",
|
||||
"v3/reference-wait-for-request",
|
||||
"v3/reference-retry-on-throw",
|
||||
"v3/reference-retry-fetch",
|
||||
"v3/reference-retry-intercept-fetch",
|
||||
"v3/reference-notification-catalog",
|
||||
"v3/reference-notify",
|
||||
"v3/reference-queue"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Objects",
|
||||
"pages": ["v3/reference-context"]
|
||||
},
|
||||
{
|
||||
"group": "CLI",
|
||||
"pages": [
|
||||
"v3/reference-cli-init",
|
||||
"v3/reference-cli-dev",
|
||||
"v3/reference-cli-deploy",
|
||||
"v3/reference-cli-login",
|
||||
"v3/reference-cli-logout",
|
||||
"v3/reference-cli-update",
|
||||
"v3/reference-cli-build",
|
||||
"v3/reference-cli-who-am-i"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Architecture",
|
||||
"version": "v3 (Developer Preview)",
|
||||
"pages": [
|
||||
"v3/architecture-how-it-works",
|
||||
"v3/architecture-multi-tenant-queue",
|
||||
"v3/architecture-reliability"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Open source",
|
||||
"version": "v3 (Developer Preview)",
|
||||
"pages": ["v3/github-repo", "v3/open-source-self-hosting", "v3/open-source-contributing"]
|
||||
},
|
||||
{
|
||||
"group": "Help",
|
||||
"group": "Troubleshooting",
|
||||
"version": "v3 (Developer Preview)",
|
||||
"pages": [
|
||||
"v3/help-faqs",
|
||||
"v3/community",
|
||||
"v3/help-email",
|
||||
"v3/help-slack",
|
||||
"v3/help-uptime-status"
|
||||
"v3/troubleshooting-alerts",
|
||||
"v3/troubleshooting-uptime-status",
|
||||
"v3/troubleshooting-github-issues",
|
||||
"v3/troubleshooting-github-discussions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Help",
|
||||
"version": "v3 (Developer Preview)",
|
||||
"pages": ["v3/community", "v3/help-slack", "v3/help-email"]
|
||||
},
|
||||
{
|
||||
"group": "Getting Started",
|
||||
"version": "v2",
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "Architecture: How it works"
|
||||
sidebarTitle: "How it works"
|
||||
description: "An overview of how Trigger.dev v3 works under the hood."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "Architecture: Multi-tenant queue"
|
||||
sidebarTitle: "Multi-tenant queue"
|
||||
description: "We built a reliable and fair multi-tenant queue that controls triggering all tasks."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "Architecture: Reliability"
|
||||
sidebarTitle: "Reliability"
|
||||
description: "How reliability is achieved with Trigger.dev."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Automated tests"
|
||||
description: "Write automated tests of your tasks."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: "Community"
|
||||
title: "Discord Community"
|
||||
url: "https://trigger.dev/discord"
|
||||
---
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ description: "What features are currently available in the Developer Preview"
|
||||
| Alerts | Add alerts in the UI for errors and deploys | ✅ |
|
||||
| [Scheduled tasks](/v3/tasks-scheduled) | A task that can be triggered on a schedule | ✅ |
|
||||
| [Zod tasks](/v3/tasks-zod) | Define tasks using Zod schemas | ⏳ |
|
||||
| [Webhook tasks](/v3/tasks-webhooks) | A task that can be triggered by a webhook | ⏳ |
|
||||
| Full text search of runs | Find a run by searching the payload and output | ⏳ |
|
||||
| Logs view with search | All logs view with filtering and full text search | ⏳ |
|
||||
| Notifications | Send data to your web app from a run | ⏳ |
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Frequently Asked Questions"
|
||||
sidebarTitle: "FAQs"
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: "Slack"
|
||||
title: "Slack support"
|
||||
---
|
||||
|
||||
If you have a paid Trigger.dev account, you can request a private Slack Connect channel.
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Uptime status"
|
||||
url: "https://trigger.openstatus.dev/"
|
||||
---
|
||||
|
||||
View the [current Trigger.dev Cloud system status](https://trigger.openstatus.dev/).
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: "Limits & Performance"
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Middleware"
|
||||
description: "This function is called before the `run` function, it allows you to wrap the run function with custom code."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev build"
|
||||
sidebarTitle: "build"
|
||||
description: "This command will build your tasks."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev deploy"
|
||||
sidebarTitle: "deploy"
|
||||
description: "This command will deploy your tasks."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev dev"
|
||||
sidebarTitle: "dev"
|
||||
description: "This command runs your tasks locally."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev init"
|
||||
sidebarTitle: "init"
|
||||
description: "This command will setup your v3 project."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev login"
|
||||
sidebarTitle: "login"
|
||||
description: "This command will log you in to the CLI. Required to run any other command."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev logout"
|
||||
sidebarTitle: "logout"
|
||||
description: "This command will log you out of the CLI."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev update"
|
||||
sidebarTitle: "update"
|
||||
description: "This command can be used to update all of your trigger.dev packages to the latest versions."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: "trigger.dev whoami"
|
||||
sidebarTitle: "whoami"
|
||||
description: "This command will return information about you, the logged in user."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Context"
|
||||
description: "The Context object is part of the `run` function parameter and provides information about the current run."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "cron.dynamic()"
|
||||
description: "Trigger a task with many different CRON schedules. For example you can use this to let your users select when they want a reminder."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "cron.task()"
|
||||
description: "Trigger a task on a recurring schedule using a CRON expression."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "interval.dynamic()"
|
||||
description: "Trigger a task with many different interval schedules. For example you can use this to let your users select how often they want a reminder."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "interval.task()"
|
||||
description: "Trigger a task on a recurring schedule using the time interval you want between runs."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "notification.catalog()"
|
||||
description: "Create a set of events that can be emitted from your tasks. These can be subscribed to from your application to provide real-time updates to your users."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "notify()"
|
||||
description: "Send a notification from your tasks. These can be subscribed to from your application to provide real-time updates to your users."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "queue()"
|
||||
description: "Create queue settings that can be used when triggering a task."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "retry.fetch()"
|
||||
description: "Inside a task, do a fetch request that will retry (you can specify the retry conditions)."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "retry.interceptFetch()"
|
||||
description: "Useful when writing automated tests – it will intercept matching HTTP requests and respond with what you provide."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "retry.onThrow()"
|
||||
description: "Inside a task, retry the wrapped code if it throws an error."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "task.batchTriggerAndWait()"
|
||||
description: "Trigger a task many times at once from inside another task, and wait for all the results."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "task.batchTrigger()"
|
||||
description: "Trigger a task many times at once from your code."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "task.triggerAndWait()"
|
||||
description: "Trigger a task from inside another task, and wait for the result."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "task.trigger()"
|
||||
description: "Trigger a task from your code."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "task()"
|
||||
description: "The task() function is the simplest way to create a long-running task."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "wait.forEvent()"
|
||||
description: "Inside a task, wait until a specific event is received before continuing."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "wait.forRequest()"
|
||||
description: "Inside a task, wait until a specific request is received before continuing."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "wait.for()"
|
||||
description: "Inside a task, wait for a period of time before continuing."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "wait.until()"
|
||||
description: "Inside a task, wait until the specified date before continuing."
|
||||
---
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "zod.catalog()"
|
||||
description: "Create a set of events with names and payloads that are parsed using Zod schemas."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "zod.task()"
|
||||
description: "A task where the payload is parsed using a zod schema."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Rollbacks"
|
||||
description: "You can rollback changes when errors happen, to give transactional guarantees to your operations."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -59,7 +59,7 @@ This is used to identify your task so it can be triggered, managed, and you can
|
||||
Your custom code inside `run()` will be executed when your task is triggered. It’s an async function that has two arguments:
|
||||
|
||||
1. The run payload - the data that you pass to the task when you trigger it.
|
||||
2. An object with `ctx` about the run ([Context](/v3/reference-context)), and any output from the optional `init` function that runs before every run attempt.
|
||||
2. An object with `ctx` about the run (Context), and any output from the optional `init` function that runs before every run attempt.
|
||||
|
||||
Anything you return from the `run` function will be the result of the task. Data you return must be JSON serializable: strings, numbers, booleans, arrays, objects, and null.
|
||||
|
||||
@@ -85,7 +85,7 @@ export const taskWithRetries = task({
|
||||
});
|
||||
```
|
||||
|
||||
For more information read [the retrying guide](/v3/retrying), or see the [SDK reference](/v3/reference-task).
|
||||
For more information read [the retrying guide](/v3/retrying).
|
||||
|
||||
It's also worth mentioning that you can [retry a block of code](/v3/retrying) inside your tasks as well.
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Sometimes OpenAI calls can take a long time to complete, or they can fail. This
|
||||
|
||||
This example uses Resend to send a sequence of emails over several days.
|
||||
|
||||
Each email is wrapped in [retry.onThrow](/v3/reference-retry-on-throw). This will retry the block of code if an error is thrown. This is useful when you don't want to retry the whole task, but just a part of it. The entire task will use the default retrying, so can also retry.
|
||||
Each email is wrapped in `retry.onThrow`. This will retry the block of code if an error is thrown. This is useful when you don't want to retry the whole task, but just a part of it. The entire task will use the default retrying, so can also retry.
|
||||
|
||||
Additionally this task uses `wait.for` to wait for a certain amount of time before sending the next email. During the waiting time, the task will be paused and will not consume any resources.
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
title: "Webhook tasks"
|
||||
description: "A task that is triggered when a webhook is received from an API."
|
||||
---
|
||||
|
||||
## Built-in webhooks triggers
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
|
||||
## How to manually use Trigger.dev with webhooks
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Zod tasks"
|
||||
description: "You can use Zod to define a catalog of events and then attach those events to your tasks."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Trigger filters"
|
||||
description: "You can add filters to your tasks so they're only triggered when certain conditions are met."
|
||||
---
|
||||
|
||||
<Snippet file="coming-soon.mdx" />
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: "Alerts"
|
||||
description: "Get alerted when runs or deployments fail, or when deployments succeed."
|
||||
---
|
||||
|
||||
<Steps>
|
||||
|
||||
<Step title="Create a new alert">
|
||||
Click on "Alerts" in the left hand side menu, then click on "New alert" to open the new alert modal.
|
||||

|
||||
</Step>
|
||||
|
||||
<Step title="Choose your alert method">
|
||||
Choose to be notified by email, Slack notification or webhook whenever:
|
||||
|
||||
- a run fails
|
||||
- a deployment fails
|
||||
- a deployment succeeds
|
||||
|
||||

|
||||
</Step>
|
||||
|
||||
<Step title="Delete or disable alerts">
|
||||
Click on the triple dot menu on the right side of the table row and select "Disable" or "Delete".
|
||||
|
||||

|
||||
</Step>
|
||||
|
||||
</Steps>
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "GitHub Discussions"
|
||||
url: "https://github.com/triggerdotdev/trigger.dev/discussions"
|
||||
---
|
||||
|
||||
Please [join our community on Discord](https://github.com/triggerdotdev/trigger.dev/discussions) to ask questions, share your projects, and get help from other developers.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "GitHub Issues"
|
||||
url: "https://github.com/triggerdotdev/trigger.dev/issues"
|
||||
---
|
||||
|
||||
Please [join our community on Discord](https://github.com/triggerdotdev/trigger.dev/issues) to ask questions, share your projects, and get help from other developers.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "Uptime Status"
|
||||
---
|
||||
|
||||
Get email notifications when Trigger.dev creates, updates or resolves a platform incident.
|
||||
[Subscribe](https://status.trigger.dev/)
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
title: "Using APIs"
|
||||
description: "You can use any Node.js library inside the run function, or do HTTP requests."
|
||||
---
|
||||
|
||||
## Using Node.js SDKs
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
|
||||
## Using fetch or axios
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
|
||||
## Using webhooks
|
||||
|
||||
<Snippet file="incomplete-docs.mdx" />
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/airtable
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/airtable",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "Trigger.dev integration for airtable",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -25,8 +25,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"airtable": "^0.12.1",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/github
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/github",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "The official GitHub integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -30,8 +30,8 @@
|
||||
"@octokit/request-error": "^5.0.1",
|
||||
"@octokit/webhooks": "^12.0.10",
|
||||
"octokit": "^3.1.2",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/linear
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/linear",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "Trigger.dev integration for @linear/sdk",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@linear/sdk": "^8.0.0",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/slack
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/openai",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "The official OpenAI integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -42,8 +42,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"openai": "^4.16.1",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31"
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/plain
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/plain",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "The official Plain.com integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -24,8 +24,8 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"@team-plain/typescript-sdk": "^2.7.0"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/replicate
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/replicate",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "Trigger.dev integration for replicate",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -25,8 +25,8 @@
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"replicate": "^0.18.1",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/resend
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/resend",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "The official Resend.com integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -24,8 +24,8 @@
|
||||
"build:tsup": "tsup"
|
||||
},
|
||||
"dependencies": {
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"resend": "^2.1.0"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/sendgrid
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/sendgrid",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "Trigger.dev integration for @sendgrid/mail",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@sendgrid/mail": "^7.7.0",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31"
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.8.0"
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @trigger.dev/shopify
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.33
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/integration-kit@3.0.0-beta.32
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/shopify",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "Trigger.dev integration for @shopify/shopify-api",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -26,8 +26,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@shopify/shopify-api": "^8.0.2",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
# @trigger.dev/slack
|
||||
|
||||
## 3.0.0-beta.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@3.0.0-beta.33
|
||||
|
||||
## 3.0.0-beta.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @trigger.dev/sdk@3.0.0-beta.32
|
||||
|
||||
## 3.0.0-beta.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@trigger.dev/slack",
|
||||
"version": "3.0.0-beta.31",
|
||||
"version": "3.0.0-beta.33",
|
||||
"description": "The official Slack integration for Trigger.dev",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@slack/web-api": "^6.8.1",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
|
||||
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
|
||||
"zod": "3.22.3"
|
||||
},
|
||||
"engines": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user