diff --git a/packages/cli/package.json b/packages/cli/package.json index 25f14f1bb..63e8cbe72 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -55,6 +55,7 @@ "dependencies": { "@types/degit": "^2.8.3", "chalk": "^5.2.0", + "chokidar": "^3.5.3", "commander": "^9.4.1", "degit": "^2.8.4", "execa": "^7.0.0", diff --git a/packages/cli/src/commands/dev.ts b/packages/cli/src/commands/dev.ts index fb27c322e..8e2ceacd4 100644 --- a/packages/cli/src/commands/dev.ts +++ b/packages/cli/src/commands/dev.ts @@ -6,6 +6,7 @@ import { resolvePath } from "../utils/parseNameAndPath.js"; import ngrok from "ngrok"; import { z } from "zod"; import { TriggerApi } from "../utils/triggerApi.js"; +import chokidar from "chokidar"; export const DevCommandOptionsSchema = z.object({ port: z.coerce.number(), @@ -13,6 +14,18 @@ export const DevCommandOptionsSchema = z.object({ tunnel: z.union([z.literal("ngrok"), z.literal("localtunnel")]), }); +const compileTimeWaitMs = 300; +const throttleTimeMs = 1000; + +const formattedDate = new Intl.DateTimeFormat("en", { + year: "numeric", + month: "short", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", +}); + export async function devCommand(path: string, anyOptions: any) { const result = DevCommandOptionsSchema.safeParse(anyOptions); if (!result.success) { @@ -54,16 +67,28 @@ export async function devCommand(path: string, anyOptions: any) { const tunnelUrl = await createTunnel(options.port); logger.success(`🚇 Created tunnel: ${tunnelUrl}`); - logger.info(`Connecting to Trigger.dev...`); + logger.info(`🔌 Connecting to Trigger.dev...`); //wait 200ms // await wait(200); - //do initial refresh of the endpoint - //todo get path for API - await refreshEndpoint(apiClient, endpointId, tunnelUrl); - logger.success(`🔄 Updated your Jobs`); + //refresh function + const refresh = async () => { + //compiling takes a bit of time + await wait(compileTimeWaitMs); + const result = await refreshEndpoint(apiClient, endpointId, tunnelUrl); + if (result?.updatedAt) { + logger.success( + `🔄 Updated your Jobs ${formattedDate.format( + new Date(result.updatedAt) + )}` + ); + } + }; - // Watch for changes to .ts files and call triggerApi.indexEndpoint + // Watch for changes to .ts files and refresh endpoints + chokidar.watch(resolvedPath).on("all", (event, path) => { + throttle(refresh, throttleTimeMs); + }); } async function getEndpointIdFromPackageJson(path: string) { @@ -139,3 +164,19 @@ async function refreshEndpoint( return response.data; } + +//wait function +async function wait(ms: number) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} + +//throttle function +let throttleTimeout: NodeJS.Timeout | null = null; +function throttle(fn: () => any, delay: number) { + if (throttleTimeout) { + clearTimeout(throttleTimeout); + } + throttleTimeout = setTimeout(fn, delay); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98c8efc4e..1f2d38d70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -637,6 +637,7 @@ importers: '@types/node': '16' '@types/node-fetch': ^2.6.2 chalk: ^5.2.0 + chokidar: ^3.5.3 commander: ^9.4.1 degit: ^2.8.4 execa: ^7.0.0 @@ -658,6 +659,7 @@ importers: dependencies: '@types/degit': 2.8.3 chalk: 5.2.0 + chokidar: 3.5.3 commander: 9.5.0 degit: 2.8.4 execa: 7.0.0