Workflow runs, with a workflow step for output

This commit is contained in:
Eric Allam
2022-12-20 11:14:03 +00:00
parent de4c58fabe
commit d457085f7b
41 changed files with 804 additions and 88 deletions
+134 -7
View File
@@ -5,10 +5,13 @@ import {
ZodRPC,
} from "internal-bridge";
import {
coordinatorCatalog,
CoordinatorCatalog,
InternalApiClient,
platformCatalog,
PlatformCatalog,
TriggerMetadataSchema,
ZodPublisher,
ZodSubscriber,
} from "internal-platform";
import { v4 } from "uuid";
@@ -28,6 +31,7 @@ export class TriggerServer {
#organizationId?: string;
#isInitialized = false;
#triggerSubscriber?: ZodSubscriber<PlatformCatalog>;
#triggerPublisher?: ZodPublisher<CoordinatorCatalog>;
#apiClient: InternalApiClient;
#workflowId?: string;
#apiKey: string;
@@ -87,7 +91,39 @@ export class TriggerServer {
receiver: ServerRPCSchema,
handlers: {
SEND_LOG: async (data) => {
return true;
if (!this.#triggerPublisher) {
// TODO: need to recover from this issue by trying to reconnect
return false;
}
if (!this.#organizationId) {
// TODO: this should never really happen
throw new Error(
"Cannot complete workflow run without an organization ID"
);
}
if (!this.#workflowId) {
// TODO: this should never really happen
throw new Error("Cannot send log without a workflow ID");
}
const response = await this.#triggerPublisher.publish(
"LOG_MESSAGE",
{
id: data.id,
log: {
level: data.level,
message: data.message,
},
},
{
"x-api-key": this.#apiKey,
"x-workflow-id": this.#workflowId,
}
);
return !!response;
},
INITIALIZE_HOST: async (data) => {
// Initialize workflow
@@ -102,6 +138,54 @@ export class TriggerServer {
};
}
},
SEND_WORKFLOW_ERROR: async (data) => {
if (!this.#triggerPublisher) {
// TODO: need to recover from this issue by trying to reconnect
return false;
}
if (!this.#organizationId) {
// TODO: this should never really happen
throw new Error(
"Cannot complete workflow run without an organization ID"
);
}
const response = await this.#triggerPublisher.publish(
"FAIL_WORKFLOW_RUN",
data,
{
"x-api-key": this.#apiKey,
"x-workflow-id": data.workflowId,
}
);
return !!response;
},
COMPLETE_WORKFLOW_RUN: async (data) => {
if (!this.#triggerPublisher) {
// TODO: need to recover from this issue by trying to reconnect
return false;
}
if (!this.#organizationId) {
// TODO: this should never really happen
throw new Error(
"Cannot complete workflow run without an organization ID"
);
}
const response = await this.#triggerPublisher.publish(
"COMPLETE_WORKFLOW_RUN",
data,
{
"x-api-key": this.#apiKey,
"x-workflow-id": data.workflowId,
}
);
return !!response;
},
},
});
@@ -180,7 +264,7 @@ export class TriggerServer {
this.#workflowId = response.id;
this.#logger.debug("Initializing pub sub...");
this.#logger.debug("Initializing platform subscriber...");
this.#triggerSubscriber = new ZodSubscriber<PlatformCatalog>({
schema: platformCatalog,
@@ -206,13 +290,13 @@ export class TriggerServer {
return true;
}
this.#logger.info("Triggering workflow", id, data, properties);
this.#logger.info("Triggering workflow", data, properties);
// Send the trigger to the host machine
// TODO - call this TRIGGER_WORKFLOW and then have the host machine create a new run
this.#serverRPC?.send("TRIGGER_WORKFLOW", {
id,
id: data.id,
trigger: data,
meta: {
workflowId: properties["x-workflow-id"],
@@ -222,7 +306,26 @@ export class TriggerServer {
},
});
return true;
try {
const messageId = await this.#triggerPublisher?.publish(
"START_WORKFLOW_RUN",
{
id: data.id,
},
{
"x-workflow-id": properties["x-workflow-id"],
"x-api-key": properties["x-api-key"],
}
);
return !!messageId;
} catch (error) {
this.#logger.error(
"Failed to notify platform that workflow run started",
error
);
return false;
}
},
},
});
@@ -230,11 +333,31 @@ export class TriggerServer {
const result = await this.#triggerSubscriber.initialize();
if (!result) {
this.#logger.debug("Pub sub failed to initialize");
this.#logger.debug("Platform subscriber failed to initialize");
return false;
}
this.#logger.info("Pub sub initialized");
this.#logger.info("Platform subscriber initialized");
this.#logger.info("Initializing coordinator publisher...");
this.#triggerPublisher = new ZodPublisher<CoordinatorCatalog>({
schema: coordinatorCatalog,
client: pulsarClient,
config: {
topic: `persistent://public/default/coordinator-events`,
},
});
const result2 = await this.#triggerPublisher.initialize();
if (!result2) {
this.#logger.info("Coordinator publisher failed to initialize");
await this.#closePubSub();
return false;
}
this.#logger.info("Coordinator publisher initialized");
this.#isInitialized = true;
@@ -250,6 +373,10 @@ export class TriggerServer {
if (this.#triggerSubscriber) {
await this.#triggerSubscriber.close();
}
if (this.#triggerPublisher) {
await this.#triggerPublisher.close();
}
}
#closeConnection() {
@@ -0,0 +1,151 @@
import type { WorkflowRun, WorkflowRunStep } from ".prisma/client";
import type {
ErrorSchema,
LogMessageSchema,
WaitSchema,
} from "@trigger.dev/common-schemas";
import type { CustomEventSchema } from "internal-platform";
import type { z } from "zod";
import { prisma } from "~/db.server";
import { IngestEvent } from "~/services/events/ingest.server";
export type { WorkflowRun, WorkflowRunStep };
export async function startWorkflowRun(id: string, apiKey: string) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.workflowRun.update({
where: { id: workflowRun.id },
data: {
status: "RUNNING",
startedAt: new Date(),
},
});
}
export async function failWorkflowRun(
id: string,
error: z.infer<typeof ErrorSchema>,
apiKey: string
) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.workflowRun.update({
where: { id: workflowRun.id },
data: {
status: "ERROR",
error,
finishedAt: new Date(),
},
});
}
export async function completeWorkflowRun(
id: string,
output: string,
apiKey: string
) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.$transaction(async (tx) => {
await tx.workflowRun.update({
where: { id: workflowRun.id },
data: {
status: "SUCCESS",
finishedAt: new Date(),
},
});
await tx.workflowRunStep.create({
data: {
runId: id,
type: "OUTPUT",
output: JSON.parse(output),
context: {},
startedAt: new Date(),
finishedAt: new Date(),
},
});
});
}
export async function triggerEventInRun(
id: string,
event: z.infer<typeof CustomEventSchema>,
apiKey: string
) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.workflowRunStep.create({
data: {
runId: id,
type: "CUSTOM_EVENT",
input: event,
context: {},
startedAt: new Date(),
finishedAt: new Date(),
},
});
const ingestService = new IngestEvent();
await ingestService.call(
event,
workflowRun.environment.organization,
workflowRun.environment
);
}
export async function logMessageInRun(
id: string,
log: z.infer<typeof LogMessageSchema>,
apiKey: string
) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.workflowRunStep.create({
data: {
runId: workflowRun.id,
type: "LOG_MESSAGE",
input: log,
context: {},
startedAt: new Date(),
finishedAt: new Date(),
},
});
}
export async function initiateWaitInRun(
id: string,
wait: z.infer<typeof WaitSchema>,
apiKey: string
) {
const workflowRun = await findWorkflowRunScopedToApiKey(id, apiKey);
await prisma.workflowRunStep.create({
data: {
runId: workflowRun.id,
type: "DURABLE_DELAY",
input: wait,
context: {},
startedAt: new Date(),
},
});
}
async function findWorkflowRunScopedToApiKey(id: string, apiKey: string) {
const workflowRun = await prisma.workflowRun.findFirst({
where: { id },
include: {
environment: {
include: { organization: true },
},
},
});
if (!workflowRun || workflowRun.environment.apiKey !== apiKey) {
throw new Error("Invalid workflow run");
}
return workflowRun;
}
@@ -48,7 +48,6 @@ export class IngestEvent {
// Produce a message to the event bus
await internalPubSub.publish(
event.id,
"CUSTOM_EVENT_CREATED",
{
id: event.id,
@@ -1,18 +1,35 @@
import { JsonSchema, PlatformCatalog } from "internal-platform";
import { platformCatalog, ZodPublisher, ZodPubSub } from "internal-platform";
import { JsonSchema } from "@trigger.dev/common-schemas";
import type { CoordinatorCatalog, PlatformCatalog } from "internal-platform";
import {
coordinatorCatalog,
platformCatalog,
ZodPublisher,
ZodPubSub,
ZodSubscriber,
} from "internal-platform";
import type { Client as PulsarClient } from "pulsar-client";
import Pulsar from "pulsar-client";
import { z } from "zod";
import { prisma } from "~/db.server";
import { env } from "~/env.server";
import {
completeWorkflowRun,
failWorkflowRun,
initiateWaitInRun,
logMessageInRun,
startWorkflowRun,
triggerEventInRun,
} from "~/models/workflowRun.server";
let pulsarClient: PulsarClient;
let triggerPublisher: ZodPublisher<PlatformCatalog>;
let triggerSubscriber: ZodSubscriber<CoordinatorCatalog>;
let internalPubSub: ZodPubSub<typeof InternalCatalog>;
declare global {
var __pulsar_client__: typeof pulsarClient;
var __trigger_publisher__: typeof triggerPublisher;
var __trigger_subscriber__: typeof triggerSubscriber;
var __internal_pub_sub__: typeof internalPubSub;
}
@@ -44,6 +61,15 @@ export async function init() {
triggerPublisher = global.__trigger_publisher__;
}
if (env.NODE_ENV === "production") {
triggerSubscriber = await createTriggerSubscriber();
} else {
if (!global.__trigger_subscriber__) {
global.__trigger_subscriber__ = await createTriggerSubscriber();
}
triggerSubscriber = global.__trigger_subscriber__;
}
if (env.NODE_ENV === "production") {
internalPubSub = await createInternalPubSub();
} else {
@@ -78,6 +104,62 @@ async function createTriggerPublisher() {
return producer;
}
async function createTriggerSubscriber() {
const subscriber = new ZodSubscriber<CoordinatorCatalog>({
client: pulsarClient,
config: {
topic: "persistent://public/default/coordinator-events",
subscription: "webapp",
subscriptionType: "Shared",
subscriptionInitialPosition: "Earliest",
},
schema: coordinatorCatalog,
handlers: {
LOG_MESSAGE: async (id, data, properties) => {
await logMessageInRun(data.id, data.log, properties["x-api-key"]);
return true;
},
START_WORKFLOW_RUN: async (id, data, properties) => {
await startWorkflowRun(data.id, properties["x-api-key"]);
return true;
},
FAIL_WORKFLOW_RUN: async (id, data, properties) => {
await failWorkflowRun(data.id, data.error, properties["x-api-key"]);
return true;
},
INITIATE_INTEGRATION_REQUEST: async (id, data, properties) => {
return true;
},
COMPLETE_WORKFLOW_RUN: async (id, data, properties) => {
await completeWorkflowRun(
data.id,
data.output,
properties["x-api-key"]
);
return true;
},
TRIGGER_CUSTOM_EVENT: async (id, data, properties) => {
await triggerEventInRun(data.id, data.event, properties["x-api-key"]);
return true;
},
INITIATE_WAIT: async (id, data, properties) => {
await initiateWaitInRun(data.id, data.wait, properties["x-api-key"]);
return true;
},
},
});
await subscriber.initialize();
return subscriber;
}
const CustomEventCreatedEventSchema = z.object({
id: z.string(),
name: z.string(),
@@ -152,18 +234,15 @@ async function createInternalPubSub() {
},
input: data.payload ?? {},
context: data.context ?? undefined,
timestamp: data.timestamp,
},
});
await triggerPublisher.publish(
run.id,
"TRIGGER_WORKFLOW",
{
id: run.id,
input: data.payload,
context: data.context,
timestamp: data.timestamp,
},
{
"x-api-key": trigger.environment.apiKey,
+1
View File
@@ -79,6 +79,7 @@
"date-fns": "2.0.0-alpha.7 || >=2.0.0",
"express": "^4.18.1",
"internal-platform": "workspace:*",
"@trigger.dev/common-schemas": "workspace:*",
"javascript-time-ago": "^2.5.7",
"json-query": "^2.2.2",
"jsonata": "^1.8.6",
@@ -0,0 +1,19 @@
-- CreateEnum
CREATE TYPE "WorkflowRunStepType" AS ENUM ('LOG_MESSAGE', 'DURABLE_DELAY', 'CUSTOM_EVENT');
-- CreateTable
CREATE TABLE "WorkflowRunStep" (
"id" TEXT NOT NULL,
"runId" TEXT NOT NULL,
"type" "WorkflowRunStepType" NOT NULL,
"input" JSONB NOT NULL,
"output" JSONB,
"context" JSONB NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "WorkflowRunStep_pkey" PRIMARY KEY ("id")
);
-- AddForeignKey
ALTER TABLE "WorkflowRunStep" ADD CONSTRAINT "WorkflowRunStep_runId_fkey" FOREIGN KEY ("runId") REFERENCES "WorkflowRun"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,5 @@
-- AlterEnum
ALTER TYPE "WorkflowRunStepType" ADD VALUE 'OUTPUT';
-- AlterTable
ALTER TABLE "WorkflowRunStep" ALTER COLUMN "input" DROP NOT NULL;
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "WorkflowRun" ADD COLUMN "error" JSONB;
@@ -0,0 +1,14 @@
/*
Warnings:
- You are about to drop the column `timestamp` on the `WorkflowRun` table. All the data in the column will be lost.
*/
-- AlterTable
ALTER TABLE "WorkflowRun" DROP COLUMN "timestamp",
ADD COLUMN "finishedAt" TIMESTAMP(3),
ADD COLUMN "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
-- AlterTable
ALTER TABLE "WorkflowRunStep" ADD COLUMN "finishedAt" TIMESTAMP(3),
ADD COLUMN "startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
@@ -0,0 +1,7 @@
-- AlterTable
ALTER TABLE "WorkflowRun" ALTER COLUMN "startedAt" DROP NOT NULL,
ALTER COLUMN "startedAt" DROP DEFAULT;
-- AlterTable
ALTER TABLE "WorkflowRunStep" ALTER COLUMN "startedAt" DROP NOT NULL,
ALTER COLUMN "startedAt" DROP DEFAULT;
+34 -5
View File
@@ -177,14 +177,18 @@ model WorkflowRun {
environment RuntimeEnvironment @relation(fields: [environmentId], references: [id], onDelete: Cascade, onUpdate: Cascade)
environmentId String
input Json
context Json?
timestamp DateTime
tasks WorkflowRunStep[]
input Json
context Json?
error Json?
status WorkflowRunStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
startedAt DateTime?
finishedAt DateTime?
}
enum WorkflowRunStatus {
@@ -194,6 +198,31 @@ enum WorkflowRunStatus {
ERROR
}
model WorkflowRunStep {
id String @id @default(cuid())
run WorkflowRun @relation(fields: [runId], references: [id], onDelete: Cascade, onUpdate: Cascade)
runId String
type WorkflowRunStepType
input Json?
output Json?
context Json
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
startedAt DateTime?
finishedAt DateTime?
}
enum WorkflowRunStepType {
OUTPUT
LOG_MESSAGE
DURABLE_DELAY
CUSTOM_EVENT
}
//todo triggers are environment specific
//todo connections are shared between environments
//todo in the future, connections can be override per environment
+5 -1
View File
@@ -11,8 +11,12 @@ module.exports = {
"@nangohq/pizzly-node",
"axios",
"internal-platform",
"@trigger.dev/common-schemas",
],
watchPaths: async () => {
return ["../../packages/internal-platform/src/**/*"];
return [
"../../packages/internal-platform/src/**/*",
"../../packages/common-schemas/src/**/*",
];
},
};
+5 -1
View File
@@ -19,7 +19,11 @@
"paths": {
"~/*": ["./app/*"],
"internal-platform": ["../../packages/internal-platform/src/index"],
"internal-platform/*": ["../../packages/internal-platform/src/*"]
"internal-platform/*": ["../../packages/internal-platform/src/*"],
"@trigger.dev/common-schemas": [
"../../packages/common-schemas/src/index"
],
"@trigger.dev/common-schemas/*": ["../../packages/common-schemas/src/*"]
},
"noEmit": true
}
+2
View File
@@ -14,6 +14,8 @@ const trigger = new Trigger({
on: customEvent({ name: "user.created", schema: userCreatedEvent }),
run: async (event) => {
console.log("Inside the smoke test workflow, received event", event);
return { foo: "bar" };
},
});
+7
View File
@@ -0,0 +1,7 @@
import { z } from "zod";
export const ErrorSchema = z.object({
name: z.string(),
message: z.string(),
stackTrace: z.string().optional(),
});
+3
View File
@@ -1 +1,4 @@
export * from "./json";
export * from "./error";
export * from "./logs";
export * from "./waits";
+6
View File
@@ -0,0 +1,6 @@
import { z } from "zod";
export const LogMessageSchema = z.object({
level: z.enum(["DEBUG", "INFO", "WARN", "ERROR"]),
message: z.string(),
});
+16
View File
@@ -0,0 +1,16 @@
import { z } from "zod";
export const DelaySchema = z.object({
type: z.literal("DELAY"),
durationInMs: z.number(),
});
export const ScheduledForSchema = z.object({
type: z.literal("SCHEDULE_FOR"),
scheduledFor: z.string().datetime(),
});
export const WaitSchema = z.discriminatedUnion("type", [
DelaySchema,
ScheduledForSchema,
]);
@@ -1,22 +1,13 @@
import { z } from "zod";
import { TriggerEnvironmentSchema } from "./common";
import { JsonSchema } from "@trigger.dev/common-schemas";
export const HostRPCSchema = {
IO_RESPONSE: {
request: z.object({
value: z.string(),
transactionId: z.string(),
}),
response: z.void().nullable(),
},
TRIGGER_WORKFLOW: {
request: z.object({
id: z.string(),
trigger: z.object({
input: JsonSchema.default({}),
context: JsonSchema.default({}),
timestamp: z.string().datetime(),
}),
meta: z.object({
environment: z.string(),
+22 -3
View File
@@ -4,9 +4,8 @@ export const ServerRPCSchema = {
SEND_LOG: {
request: z.object({
id: z.string(),
data: z.string(),
index: z.number().optional(),
timestamp: z.number().optional(),
message: z.string(),
level: z.enum(["DEBUG", "INFO", "WARN", "ERROR"]),
}),
response: z.boolean(),
},
@@ -39,6 +38,26 @@ export const ServerRPCSchema = {
])
.nullable(),
},
COMPLETE_WORKFLOW_RUN: {
request: z.object({
id: z.string(),
workflowId: z.string(),
output: z.string(),
}),
response: z.boolean(),
},
SEND_WORKFLOW_ERROR: {
request: z.object({
id: z.string(),
workflowId: z.string(),
error: z.object({
name: z.string(),
message: z.string(),
stackTrace: z.string().optional(),
}),
}),
response: z.boolean(),
},
};
export type ServerRPC = typeof ServerRPCSchema;
+4 -2
View File
@@ -77,8 +77,10 @@ export class ZodRPC<
} catch (callError) {
if (callError instanceof ZodError) {
console.error(
`[ZodRPC] Received invalid call:\n${JSON.stringify(message)}: `,
callError.flatten()
`[ZodRPC][foobar] Received invalid call:\n${JSON.stringify(
message
)}: `,
callError.errors
);
} else {
console.error(
+2
View File
@@ -13,7 +13,9 @@
},
"scripts": {},
"dependencies": {
"@trigger.dev/common-schemas": "workspace:*",
"pulsar-client": "^1.7.0",
"ulid": "^2.3.0",
"zod": "^3.20.2"
}
}
+34 -4
View File
@@ -1,5 +1,5 @@
import { z } from "zod";
import { WorkflowMetadata } from "../schemas";
import { UpdateWorkflowRun, WorkflowMetadata } from "../schemas";
export class InternalApiClient {
#apiKey: string;
@@ -20,7 +20,7 @@ export class InternalApiClient {
error: z.string(),
});
const response = await fetch(this.#apiUrl("whoami"), {
const response = await fetch(this.#apiUrl("/whoami"), {
method: "GET",
headers: this.#headers(),
});
@@ -52,7 +52,7 @@ export class InternalApiClient {
error: z.string(),
});
const response = await fetch(this.#apiUrl(`workflows/${workflow.id}`), {
const response = await fetch(this.#apiUrl(`/workflows/${workflow.id}`), {
method: "PUT",
headers: this.#headers({ "Content-Type": "application/json" }),
body: JSON.stringify(workflow),
@@ -76,7 +76,37 @@ export class InternalApiClient {
);
}
#apiUrl = (path: string) => `${this.#baseUrl}/${path}`;
async startWorkflowRun(workflowId: string, runId: string) {
const validationResponseSchema = z.object({
error: z.string(),
});
const response = await fetch(
this.#apiUrl(`/workflows/${workflowId}/runs/${runId}`),
{
method: "PUT",
headers: this.#headers({ "Content-Type": "application/json" }),
body: JSON.stringify({ status: "RUNNING" }),
}
);
if (response.ok) {
return true;
}
if (response.status === 400) {
const rawBody = await response.json();
const body = validationResponseSchema.parse(rawBody);
throw new Error(body.error);
}
throw new Error(
`[${response.status}] Something went wrong: ${response.statusText}`
);
}
#apiUrl = (path: string) => `${this.#baseUrl}${path}`;
#headers = (additionalHeaders?: Record<string, string>) => ({
Accept: "application/json",
Authorization: `Bearer ${this.#apiKey}`,
@@ -1,7 +1,19 @@
import initiateIntegrationRequest from "../schemas/initiateIntegrationRequest";
import startWorklowRun from "../schemas/startWorkflowRun";
import failWorkflowRun from "../schemas/failWorkflowRun";
import completeWorkflowRun from "../schemas/completeWorkflowRun";
import logMessage from "../schemas/logMessage";
import triggerCustomEvent from "../schemas/triggerCustomEvent";
import awaits from "../schemas/awaits";
const Catalog = {
...initiateIntegrationRequest,
...startWorklowRun,
...failWorkflowRun,
...completeWorkflowRun,
...logMessage,
...triggerCustomEvent,
...awaits,
};
export default Catalog;
@@ -0,0 +1,17 @@
import { WaitSchema } from "@trigger.dev/common-schemas";
import { z } from "zod";
const Catalog = {
INITIATE_WAIT: {
data: z.object({
id: z.string(),
wait: WaitSchema,
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -0,0 +1,16 @@
import { z } from "zod";
const Catalog = {
COMPLETE_WORKFLOW_RUN: {
data: z.object({
id: z.string(),
output: z.string(),
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -0,0 +1,17 @@
import { z } from "zod";
import { ErrorSchema } from "@trigger.dev/common-schemas";
const Catalog = {
FAIL_WORKFLOW_RUN: {
data: z.object({
id: z.string(),
error: ErrorSchema,
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -1,5 +1,4 @@
import { z } from "zod";
import { MessageCatalogSchema } from "..";
import {
WorkflowEventPropertiesSchema,
RetryOptionsSchema,
@@ -0,0 +1,17 @@
import { LogMessageSchema } from "@trigger.dev/common-schemas";
import { z } from "zod";
const Catalog = {
LOG_MESSAGE: {
data: z.object({
id: z.string(),
log: LogMessageSchema,
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -0,0 +1,15 @@
import { z } from "zod";
const Catalog = {
START_WORKFLOW_RUN: {
data: z.object({
id: z.string(),
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -0,0 +1,17 @@
import { z } from "zod";
import { CustomEventSchema } from "../../schemas";
const Catalog = {
TRIGGER_CUSTOM_EVENT: {
data: z.object({
id: z.string(),
event: CustomEventSchema,
}),
properties: z.object({
"x-workflow-id": z.string(),
"x-api-key": z.string(),
}),
},
};
export default Catalog;
@@ -1,12 +1,11 @@
import { z } from "zod";
import { JsonSchema } from "../../schemas";
import { JsonSchema } from "@trigger.dev/common-schemas";
import { WorkflowEventPropertiesSchema } from "../sharedSchemas";
export const TriggerWorkflowMessageSchema = z.object({
id: z.string(),
input: JsonSchema.default({}),
context: JsonSchema.default({}),
timestamp: z.string().datetime(),
});
const Catalog = {
@@ -63,11 +63,10 @@ export class ZodPubSub<TPubSubSchema extends MessageCatalogSchema> {
}
public async publish<K extends keyof TPubSubSchema>(
id: string,
type: K,
data: z.infer<TPubSubSchema[K]["data"]>,
properties?: z.infer<TPubSubSchema[K]["properties"]>
): Promise<string | undefined> {
return this.#publisher.publish(id, type, data, properties);
return this.#publisher.publish(type, data, properties);
}
}
@@ -5,6 +5,7 @@ import {
} from "pulsar-client";
import { Logger } from "../logger";
import { MessageCatalogSchema } from "./messageCatalogSchema";
import { ulid } from "ulid";
import { z, ZodError } from "zod";
@@ -54,7 +55,6 @@ export class ZodPublisher<PublisherSchema extends MessageCatalogSchema> {
}
public async publish<K extends keyof PublisherSchema>(
id: string,
type: K,
data: z.infer<PublisherSchema[K]["data"]>,
properties?: z.infer<PublisherSchema[K]["properties"]>
@@ -64,7 +64,7 @@ export class ZodPublisher<PublisherSchema extends MessageCatalogSchema> {
}
try {
return this.#handlePublish(id, type, data, properties);
return this.#handlePublish(type, data, properties);
} catch (e) {
if (e instanceof ZodError) {
this.#logger.error(
@@ -79,7 +79,6 @@ export class ZodPublisher<PublisherSchema extends MessageCatalogSchema> {
}
async #handlePublish<K extends keyof PublisherSchema>(
id: string,
type: K,
data: z.infer<PublisherSchema[K]["data"]>,
properties?: z.infer<PublisherSchema[K]["properties"]>
@@ -90,6 +89,8 @@ export class ZodPublisher<PublisherSchema extends MessageCatalogSchema> {
throw new Error(`Unknown message type: ${String(type)}`);
}
const id = ulid();
const parsedData = messageSchema.data.parse(data);
const parsedProperties = messageSchema.properties.parse(properties);
@@ -1,3 +1,2 @@
export * from "./workflows";
export * from "./events";
export * from "./json";
@@ -1,10 +0,0 @@
import { z } from "zod";
const LiteralSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);
type Literal = z.infer<typeof LiteralSchema>;
type Json = Literal | { [key: string]: Json } | Json[];
export const JsonSchema: z.ZodType<Json> = z.lazy(() =>
z.union([LiteralSchema, z.array(JsonSchema), z.record(JsonSchema)])
);
@@ -58,3 +58,29 @@ export const WorkflowMetadataSchema = z.object({
});
export type WorkflowMetadata = z.infer<typeof WorkflowMetadataSchema>;
export const UpdateRunningWorkflowRunSchema = z.object({
status: z.literal("RUNNING"),
});
export const UpdateCompletedWorkflowRunSchema = z.object({
status: z.literal("COMPLETED"),
output: z.string(),
});
export const UpdateFailedWorkflowRunSchema = z.object({
status: z.literal("FAILED"),
error: z.object({
name: z.string(),
message: z.string(),
stackTrace: z.string().optional(),
}),
});
export const UpdateWorkflowRunSchema = z.discriminatedUnion("status", [
UpdateRunningWorkflowRunSchema,
UpdateCompletedWorkflowRunSchema,
UpdateFailedWorkflowRunSchema,
]);
export type UpdateWorkflowRun = z.infer<typeof UpdateWorkflowRunSchema>;
+1
View File
@@ -14,6 +14,7 @@
"@types/uuid": "^9.0.0",
"@types/ws": "^8.5.3",
"internal-bridge": "workspace:*",
"@trigger.dev/common-schemas": "workspace:*",
"rimraf": "^3.0.2",
"tsup": "^6.5.0",
"tsx": "^3.12.1"
+39 -4
View File
@@ -92,14 +92,49 @@ export class TriggerClient<TEventData = void> {
sender: ServerRPCSchema,
receiver: HostRPCSchema,
handlers: {
IO_RESPONSE: async (data) => {
console.log("IO_RESPONSE", data);
},
TRIGGER_WORKFLOW: async (data) => {
console.log("TRIGGER_WORKFLOW", data);
// TODO: handle this better
this.#trigger.options.run(data.trigger.input as TEventData);
this.#trigger.options
.run(data.trigger.input as TEventData)
.then((output) => {
return serverRPC.send("COMPLETE_WORKFLOW_RUN", {
id: data.id,
output: JSON.stringify(output),
workflowId: data.meta.workflowId,
});
})
.catch((anyError) => {
const parseAnyError = (
error: any
): {
name: string;
message: string;
stackTrace?: string;
} => {
if (error instanceof Error) {
return {
name: error.name,
message: error.message,
stackTrace: error.stack,
};
}
return {
name: "UnknownError",
message: "An unknown error occurred",
};
};
const error = parseAnyError(anyError);
return serverRPC.send("SEND_WORKFLOW_ERROR", {
id: data.id,
workflowId: data.meta.workflowId,
error,
});
});
},
},
});
+3 -1
View File
@@ -1,6 +1,8 @@
import { TriggerClient } from "../client";
import { LogLevel } from "internal-bridge";
import { TriggerEvent } from "../events";
import { z } from "zod";
import { JsonSchema } from "@trigger.dev/common-schemas";
export type TriggerOptions<TEventData = void> = {
id: string;
@@ -9,7 +11,7 @@ export type TriggerOptions<TEventData = void> = {
apiKey?: string;
endpoint?: string;
logLevel?: LogLevel;
run: (event: TEventData) => Promise<void>;
run: (event: TEventData) => Promise<any>;
};
export class Trigger<TEventData = void> {
+61 -26
View File
@@ -108,6 +108,7 @@ importers:
'@testing-library/jest-dom': ^5.16.5
'@testing-library/react': ^13.4.0
'@testing-library/user-event': ^14.4.3
'@trigger.dev/common-schemas': workspace:*
'@trigger.dev/tailwind-config': '*'
'@types/bcryptjs': ^2.4.2
'@types/compression': ^1.7.2
@@ -235,7 +236,8 @@ importers:
'@sentry/remix': 7.24.2_dfehptsum4bkg2mncqmjuvk644
'@tailwindcss/forms': 0.5.3_tailwindcss@3.1.8
'@tanstack/react-table': 8.7.0_biqbaboplfbrettd7655fr4n2y
'@uiw/react-codemirror': 4.17.1_4ysryuwswq2dahvwdlnde5nvpq
'@trigger.dev/common-schemas': link:../../packages/common-schemas
'@uiw/react-codemirror': 4.17.1_xtrn3tyimkzpilanhyvm2ls4eu
bcryptjs: 2.4.3
classnames: 2.3.2
clsx: 1.2.1
@@ -455,14 +457,18 @@ importers:
packages/internal-platform:
specifiers:
'@trigger.dev/common-schemas': workspace:*
'@trigger.dev/tsconfig': workspace:*
'@types/node': ^18.11.9
pulsar-client: ^1.7.0
typescript: ^4.9.4
ulid: ^2.3.0
undici: ^5.14.0
zod: ^3.20.2
dependencies:
'@trigger.dev/common-schemas': link:../common-schemas
pulsar-client: 1.7.0
ulid: 2.3.0
zod: 3.20.2
devDependencies:
'@trigger.dev/tsconfig': link:../../config-packages/tsconfig
@@ -487,6 +493,7 @@ importers:
packages/trigger-sdk:
specifiers:
'@trigger.dev/common-schemas': workspace:*
'@trigger.dev/tsconfig': workspace:*
'@types/debug': ^4.1.7
'@types/node': ^18.11.9
@@ -508,6 +515,7 @@ importers:
ws: 8.11.0
zod: 3.20.2
devDependencies:
'@trigger.dev/common-schemas': link:../common-schemas
'@trigger.dev/tsconfig': link:../../config-packages/tsconfig
'@types/debug': 4.1.7
'@types/node': 18.11.11
@@ -2873,13 +2881,12 @@ packages:
'@lezer/common': 0.16.1
dev: false
/@codemirror/autocomplete/6.3.4_jvia4rcxqiacrvood3734bhyuy:
/@codemirror/autocomplete/6.3.4_4npvozs3agsv66jx2b7pfvr53q:
resolution: {integrity: sha512-irxKsTSjS0OkfMWWt9YxtNK97++/E+XIHfKnRpSVfZyHzda/amYF0BR+T8mMkrGQWidx2zApxHx08GT13egyQA==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
dependencies:
'@codemirror/language': 6.3.1
'@codemirror/state': 6.1.4
@@ -2929,7 +2936,7 @@ packages:
/@codemirror/lang-javascript/6.1.1:
resolution: {integrity: sha512-F4+kiuC5d5dUSJmff96tJQwpEXs/tX/4bapMRnZWW6bHKK1Fx6MunTzopkCUWRa9bF87GPmb9m7Qtg7Yv8f3uQ==}
dependencies:
'@codemirror/autocomplete': 6.3.4_jvia4rcxqiacrvood3734bhyuy
'@codemirror/autocomplete': 6.3.4_4npvozs3agsv66jx2b7pfvr53q
'@codemirror/language': 6.3.1
'@codemirror/lint': 6.1.0
'@codemirror/state': 6.1.4
@@ -3092,6 +3099,7 @@ packages:
engines: {node: '>=12'}
dependencies:
'@jridgewell/trace-mapping': 0.3.9
dev: true
/@cush/relative/1.0.0:
resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==}
@@ -3323,6 +3331,7 @@ packages:
/@jridgewell/resolve-uri/3.1.0:
resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
engines: {node: '>=6.0.0'}
dev: true
/@jridgewell/set-array/1.1.2:
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
@@ -3331,6 +3340,7 @@ packages:
/@jridgewell/sourcemap-codec/1.4.14:
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
dev: true
/@jridgewell/trace-mapping/0.3.17:
resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
@@ -3344,6 +3354,7 @@ packages:
dependencies:
'@jridgewell/resolve-uri': 3.1.0
'@jridgewell/sourcemap-codec': 1.4.14
dev: true
/@jsonhero/codemirror-lang-inline-tokens/0.1.0:
resolution: {integrity: sha512-nbvaQBSJbLjckdA2HbkiiXXTpAMrjyzDzxymFfAmgSNHNo+GC6e0RjQDWKyDKFEQZCd3s02SQ17ipFA5FVnkfg==}
@@ -3734,7 +3745,7 @@ packages:
eslint: 8.29.0
eslint-import-resolver-node: 0.3.6
eslint-import-resolver-typescript: 3.5.2_lt3hqehuojhfcbzgzqfngbtmrq
eslint-plugin-import: 2.26.0_i656iqvetrvx3ajhg4t6psfrl4
eslint-plugin-import: 2.26.0_qfsg7upu5e4dqco5ntekgyqxwu
eslint-plugin-jest: 26.9.0_gtacs36c3cng3fu32eiajkw5qm
eslint-plugin-jest-dom: 4.0.3_eslint@8.29.0
eslint-plugin-jsx-a11y: 6.6.1_eslint@8.29.0
@@ -4085,6 +4096,7 @@ packages:
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@swc/core-darwin-x64/1.3.21:
@@ -4093,6 +4105,7 @@ packages:
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@swc/core-linux-arm-gnueabihf/1.3.21:
@@ -4101,6 +4114,7 @@ packages:
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@swc/core-linux-arm64-gnu/1.3.21:
@@ -4109,6 +4123,7 @@ packages:
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@swc/core-linux-arm64-musl/1.3.21:
@@ -4117,6 +4132,7 @@ packages:
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@swc/core-linux-x64-gnu/1.3.21:
@@ -4125,6 +4141,7 @@ packages:
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@swc/core-linux-x64-musl/1.3.21:
@@ -4133,6 +4150,7 @@ packages:
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@swc/core-win32-arm64-msvc/1.3.21:
@@ -4141,6 +4159,7 @@ packages:
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@swc/core-win32-ia32-msvc/1.3.21:
@@ -4149,6 +4168,7 @@ packages:
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@swc/core-win32-x64-msvc/1.3.21:
@@ -4157,6 +4177,7 @@ packages:
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@swc/core/1.3.21:
@@ -4175,6 +4196,7 @@ packages:
'@swc/core-win32-arm64-msvc': 1.3.21
'@swc/core-win32-ia32-msvc': 1.3.21
'@swc/core-win32-x64-msvc': 1.3.21
dev: true
/@swc/helpers/0.4.14:
resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
@@ -4202,7 +4224,7 @@ packages:
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
dependencies:
mini-svg-data-uri: 1.4.4
tailwindcss: 3.1.8_v776zzvn44o7tpgzieipaairwm
tailwindcss: 3.1.8_postcss@8.4.19
/@tailwindcss/typography/0.5.8_tailwindcss@3.1.8:
resolution: {integrity: sha512-xGQEp8KXN8Sd8m6R4xYmwxghmswrd0cPnNI2Lc6fmrC3OojysTBJJGSIVwPV56q4t6THFUK3HJ0EaWwpglSxWw==}
@@ -4213,7 +4235,7 @@ packages:
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
postcss-selector-parser: 6.0.10
tailwindcss: 3.1.8_v776zzvn44o7tpgzieipaairwm
tailwindcss: 3.1.8_postcss@8.4.19
dev: true
/@tanstack/react-table/8.7.0_biqbaboplfbrettd7655fr4n2y:
@@ -4303,15 +4325,19 @@ packages:
/@tsconfig/node10/1.0.9:
resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
dev: true
/@tsconfig/node12/1.0.11:
resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
dev: true
/@tsconfig/node14/1.0.3:
resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
dev: true
/@tsconfig/node16/1.0.3:
resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==}
dev: true
/@types/acorn/4.0.6:
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
@@ -4556,6 +4582,7 @@ packages:
/@types/node/18.11.15:
resolution: {integrity: sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==}
dev: true
/@types/node/8.10.66:
resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==}
@@ -4812,13 +4839,12 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
/@uiw/codemirror-extensions-basic-setup/4.17.1_ahlr5jha6gxy5y2f2whv3jw24q:
/@uiw/codemirror-extensions-basic-setup/4.17.1_wq4lmc3co73jmz4wylu22jt6hu:
resolution: {integrity: sha512-lFH3gFPcpKDckaioYL2KonTYeeoP7gGtaDtDai7DV5UVEyuVPlkGukKCmHz6u0ol/Krs/RTbF4ylt8cDlBT1uA==}
peerDependencies:
'@codemirror/autocomplete': '>=6.0.0'
'@codemirror/commands': '>=6.0.0'
'@codemirror/language': '>=6.0.0'
'@codemirror/lint': '>=6.0.0'
'@codemirror/search': '>=6.0.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
@@ -4832,14 +4858,11 @@ packages:
'@codemirror/view': 0.20.7
dev: false
/@uiw/react-codemirror/4.17.1_4ysryuwswq2dahvwdlnde5nvpq:
/@uiw/react-codemirror/4.17.1_xtrn3tyimkzpilanhyvm2ls4eu:
resolution: {integrity: sha512-ah7wFhvVW/uKbQR5D12AqDK51XGZaZI1WYO9/sraZzq32TGphL5BU3vcQd1P0YEZR6YLc23+KWNi2DCQ+EEAbA==}
peerDependencies:
'@babel/runtime': '>=7.11.0'
'@codemirror/state': '>=6.0.0'
'@codemirror/theme-one-dark': '>=6.0.0'
'@codemirror/view': '>=6.0.0'
codemirror: '>=6.0.0'
react: '>=16.8.0'
react-dom: '>=16.8.0'
dependencies:
@@ -4848,14 +4871,13 @@ packages:
'@codemirror/state': 0.20.1
'@codemirror/theme-one-dark': 6.1.0
'@codemirror/view': 0.20.7
'@uiw/codemirror-extensions-basic-setup': 4.17.1_ahlr5jha6gxy5y2f2whv3jw24q
codemirror: 6.0.1_@lezer+common@1.0.2
'@uiw/codemirror-extensions-basic-setup': 4.17.1_wq4lmc3co73jmz4wylu22jt6hu
codemirror: 6.0.1
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
transitivePeerDependencies:
- '@codemirror/autocomplete'
- '@codemirror/language'
- '@codemirror/lint'
- '@codemirror/search'
dev: false
@@ -4949,6 +4971,7 @@ packages:
/acorn-walk/8.2.0:
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
engines: {node: '>=0.4.0'}
dev: true
/acorn/7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
@@ -4959,6 +4982,7 @@ packages:
resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
/agent-base/4.2.1:
resolution: {integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==}
@@ -5087,6 +5111,7 @@ packages:
/arg/4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: true
/arg/5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
@@ -5981,18 +6006,16 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
/codemirror/6.0.1_@lezer+common@1.0.2:
/codemirror/6.0.1:
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
dependencies:
'@codemirror/autocomplete': 6.3.4_jvia4rcxqiacrvood3734bhyuy
'@codemirror/autocomplete': 6.3.4_4npvozs3agsv66jx2b7pfvr53q
'@codemirror/commands': 6.1.2
'@codemirror/language': 6.3.1
'@codemirror/lint': 6.1.0
'@codemirror/search': 6.2.3
'@codemirror/state': 6.1.4
'@codemirror/view': 6.6.0
transitivePeerDependencies:
- '@lezer/common'
dev: false
/collection-visit/1.0.0:
@@ -6158,6 +6181,7 @@ packages:
/create-require/1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
dev: true
/crelt/1.0.5:
resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==}
@@ -6592,6 +6616,7 @@ packages:
/diff/4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
dev: true
/diff/5.1.0:
resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
@@ -7294,7 +7319,7 @@ packages:
debug: 4.3.4
enhanced-resolve: 5.12.0
eslint: 8.29.0
eslint-plugin-import: 2.26.0_i656iqvetrvx3ajhg4t6psfrl4
eslint-plugin-import: 2.26.0_qfsg7upu5e4dqco5ntekgyqxwu
get-tsconfig: 4.2.0
globby: 13.1.2
is-core-module: 2.11.0
@@ -7334,7 +7359,7 @@ packages:
- supports-color
dev: true
/eslint-module-utils/2.7.4_jnakocfte2jywffz4vixv5kpsq:
/eslint-module-utils/2.7.4_wbv6cezew2qbikiravago3ef2u:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
@@ -7359,6 +7384,7 @@ packages:
debug: 3.2.7
eslint: 8.29.0
eslint-import-resolver-node: 0.3.6
eslint-import-resolver-typescript: 3.5.2_lt3hqehuojhfcbzgzqfngbtmrq
transitivePeerDependencies:
- supports-color
dev: true
@@ -7414,7 +7440,7 @@ packages:
- supports-color
dev: true
/eslint-plugin-import/2.26.0_i656iqvetrvx3ajhg4t6psfrl4:
/eslint-plugin-import/2.26.0_qfsg7upu5e4dqco5ntekgyqxwu:
resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
engines: {node: '>=4'}
peerDependencies:
@@ -7431,7 +7457,7 @@ packages:
doctrine: 2.1.0
eslint: 8.29.0
eslint-import-resolver-node: 0.3.6
eslint-module-utils: 2.7.4_jnakocfte2jywffz4vixv5kpsq
eslint-module-utils: 2.7.4_wbv6cezew2qbikiravago3ef2u
has: 1.0.3
is-core-module: 2.11.0
is-glob: 4.0.3
@@ -10042,6 +10068,7 @@ packages:
/make-error/1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: true
/map-cache/0.2.2:
resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
@@ -11470,7 +11497,6 @@ packages:
lilconfig: 2.0.6
postcss: 8.4.19
yaml: 1.10.2
dev: true
/postcss-load-config/3.1.4_v776zzvn44o7tpgzieipaairwm:
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
@@ -11488,6 +11514,7 @@ packages:
postcss: 8.4.19
ts-node: 10.9.1_fww2c4adio7pltl52sxaeea2ii
yaml: 1.10.2
dev: true
/postcss-nested/5.0.6_postcss@8.4.19:
resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
@@ -13149,7 +13176,6 @@ packages:
resolve: 1.22.1
transitivePeerDependencies:
- ts-node
dev: true
/tailwindcss/3.1.8_v776zzvn44o7tpgzieipaairwm:
resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==}
@@ -13182,6 +13208,7 @@ packages:
resolve: 1.22.1
transitivePeerDependencies:
- ts-node
dev: true
/tapable/2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
@@ -13449,6 +13476,7 @@ packages:
typescript: 4.9.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: true
/ts-toolbelt/9.6.0:
resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
@@ -13703,6 +13731,11 @@ packages:
hasBin: true
dev: true
/ulid/2.3.0:
resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==}
hasBin: true
dev: false
/unbox-primitive/1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
dependencies:
@@ -13940,6 +13973,7 @@ packages:
/v8-compile-cache-lib/3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
dev: true
/v8-to-istanbul/9.0.1:
resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==}
@@ -14393,6 +14427,7 @@ packages:
/yn/3.1.1:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
dev: true
/yocto-queue/0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}