From fc631f49466b7335b038040e7c802df6c18f84e3 Mon Sep 17 00:00:00 2001 From: Guy Kedem Date: Wed, 4 Oct 2023 12:35:52 +0300 Subject: [PATCH 1/4] adding deno reference project and JSRuntime file --- .vscode/extensions.json | 9 + .vscode/settings.json | 3 + packages/cli/src/utils/jsRuntime.ts | 116 +++ .../deno-reference/.vscode/settings.json | 3 + references/deno-reference/deno.json | 8 + references/deno-reference/deno.lock | 684 ++++++++++++++++++ references/deno-reference/main.ts | 40 + 7 files changed, 863 insertions(+) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 packages/cli/src/utils/jsRuntime.ts create mode 100644 references/deno-reference/.vscode/settings.json create mode 100644 references/deno-reference/deno.json create mode 100644 references/deno-reference/deno.lock create mode 100644 references/deno-reference/main.ts diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..312d6bbd49 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "astro-build.astro-vscode", + "denoland.vscode-deno" + ], + "unwantedRecommendations": [ + + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..5f52390320 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "deno.enablePaths": ["references/deno-reference"] +} diff --git a/packages/cli/src/utils/jsRuntime.ts b/packages/cli/src/utils/jsRuntime.ts new file mode 100644 index 0000000000..6d5011f36c --- /dev/null +++ b/packages/cli/src/utils/jsRuntime.ts @@ -0,0 +1,116 @@ +import { Framework, getFramework } from "../frameworks"; +import { PackageManager, getUserPackageManager } from "./getUserPkgManager"; +import { Logger } from "./logger"; +import { run as ncuRun } from "npm-check-updates"; +import chalk from "chalk"; +import fs from "fs/promises"; +import pathModule from "path"; + +type SupportedRuntimeId = "node" | "deno"; + +abstract class JsRuntime { + logger: Logger; + projectRootPath: string; + constructor(projectRootPath: string, logger: Logger) { + this.logger = logger; + this.projectRootPath = projectRootPath; + } + abstract checkForOutdatedPackages(): Promise; + abstract getUserPackageManager(): Promise; + abstract getFramework(): Promise; + abstract getEndpointId(): Promise; + static async getJsRuntime(projectRootPath: string, logger: Logger) { + if (await NodeJsRuntime.isNodeJsRuntime(projectRootPath)) { + return new NodeJsRuntime(projectRootPath, logger); + } else if (await DenoRuntime.isDenoJsRuntime(projectRootPath)) { + return new DenoRuntime(projectRootPath, logger); + } + throw new Error("Unsupported runtime"); + } +} + +class NodeJsRuntime extends JsRuntime { + static async isNodeJsRuntime(projectRootPath: string): Promise { + try { + await fs.stat(pathModule.join(projectRootPath, "package.json")); + return true; + } catch { + return false; + } + } + + get packageJsonPath(): string { + return pathModule.join(this.projectRootPath, "package.json"); + } + + async checkForOutdatedPackages(): Promise { + const updates = (await ncuRun({ + packageFile: `${this.packageJsonPath}`, + filter: "/trigger.dev/.+$/", + upgrade: false, + })) as { + [key: string]: string; + }; + + if (typeof updates === "undefined" || Object.keys(updates).length === 0) { + return; + } + + const packageFile = await fs.readFile(this.packageJsonPath); + const data = JSON.parse(Buffer.from(packageFile).toString("utf8")); + const dependencies = data.dependencies; + console.log(chalk.bgYellow("Updates available for trigger.dev packages")); + console.log(chalk.bgBlue("Run npx @trigger.dev/cli@latest update")); + + for (let dep in updates) { + console.log(`${dep} ${dependencies[dep]} → ${updates[dep]}`); + } + } + + async getUserPackageManager() { + return getUserPackageManager(this.projectRootPath); + } + + async getFramework() { + const userPackageManager = await this.getUserPackageManager(); + return getFramework(this.projectRootPath, userPackageManager); + } + async getEndpointId() { + const pkgJsonPath = pathModule.join(this.projectRootPath, "package.json"); + const pkgBuffer = await fs.readFile(pkgJsonPath); + const pkgJson = JSON.parse(pkgBuffer.toString()); + return pkgJson["trigger.dev"]?.endpointId; + } +} + +class DenoRuntime extends JsRuntime { + static async isDenoJsRuntime(projectRootPath: string): Promise { + try { + try { + await fs.stat(pathModule.join(projectRootPath, "deno.json")); + } catch (e) { + await fs.stat(pathModule.join(projectRootPath, "deno.jsonc")); + } + return true; + } catch { + return false; + } + } + + async checkForOutdatedPackages() { + // not implemented currently + } + async getUserPackageManager() { + return undefined; + } + async getFramework() { + // not implemented currently + return undefined; + } + async getEndpointId() { + const pkgJsonPath = pathModule.join(this.projectRootPath, "deno.json"); + const pkgBuffer = await fs.readFile(pkgJsonPath); + const pkgJson = JSON.parse(pkgBuffer.toString()); + return pkgJson["trigger.dev"]?.endpointId; + } +} diff --git a/references/deno-reference/.vscode/settings.json b/references/deno-reference/.vscode/settings.json new file mode 100644 index 0000000000..b943dbc7a3 --- /dev/null +++ b/references/deno-reference/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "deno.enable": true +} \ No newline at end of file diff --git a/references/deno-reference/deno.json b/references/deno-reference/deno.json new file mode 100644 index 0000000000..26c4ebaee4 --- /dev/null +++ b/references/deno-reference/deno.json @@ -0,0 +1,8 @@ +{ + "trigger.dev": { + "endpointId": "borderless" + }, + "tasks": { + "dev": "deno run --watch main.ts" + } +} diff --git a/references/deno-reference/deno.lock b/references/deno-reference/deno.lock new file mode 100644 index 0000000000..0d0405f0d1 --- /dev/null +++ b/references/deno-reference/deno.lock @@ -0,0 +1,684 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "npm:@trigger.dev/express": "npm:@trigger.dev/express@2.1.7_@trigger.dev+sdk@2.1.7", + "npm:@trigger.dev/sdk": "npm:@trigger.dev/sdk@2.1.7" + }, + "npm": { + "@remix-run/web-blob@3.1.0": { + "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==", + "dependencies": { + "@remix-run/web-stream": "@remix-run/web-stream@1.1.0", + "web-encoding": "web-encoding@1.1.5" + } + }, + "@remix-run/web-fetch@4.4.1": { + "integrity": "sha512-xMceEGn2kvfeWS91nHSOhEQHPGgjFnmDVpWFZrbWPVdiTByMZIn421/tdSF6Kd1RsNsY+5Iwt3JFEKZHAcMQHw==", + "dependencies": { + "@remix-run/web-blob": "@remix-run/web-blob@3.1.0", + "@remix-run/web-file": "@remix-run/web-file@3.1.0", + "@remix-run/web-form-data": "@remix-run/web-form-data@3.1.0", + "@remix-run/web-stream": "@remix-run/web-stream@1.1.0", + "@web3-storage/multipart-parser": "@web3-storage/multipart-parser@1.0.0", + "abort-controller": "abort-controller@3.0.0", + "data-uri-to-buffer": "data-uri-to-buffer@3.0.1", + "mrmime": "mrmime@1.0.1" + } + }, + "@remix-run/web-file@3.1.0": { + "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==", + "dependencies": { + "@remix-run/web-blob": "@remix-run/web-blob@3.1.0" + } + }, + "@remix-run/web-form-data@3.1.0": { + "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==", + "dependencies": { + "web-encoding": "web-encoding@1.1.5" + } + }, + "@remix-run/web-stream@1.1.0": { + "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==", + "dependencies": { + "web-streams-polyfill": "web-streams-polyfill@3.2.1" + } + }, + "@trigger.dev/core@2.1.7": { + "integrity": "sha512-Ts0xMFiWi4ph4da6BIbuegz2mMSVYJxWEh5S2mhM5vc+S6cl+MEbTdh+neUVa/0N4qq3Io07e9yDTXnTfiifzg==", + "dependencies": { + "ulid": "ulid@2.3.0", + "zod": "zod@3.21.4", + "zod-error": "zod-error@1.5.0" + } + }, + "@trigger.dev/express@2.1.7_@trigger.dev+sdk@2.1.7": { + "integrity": "sha512-uMoSDpOZJdYs+UXwEkhWYCYm8T6e+cu33LXmXhoF2tpm7m8PritFgR7LPX4H9UdIddRATdsmWgOqPMOQneEtDg==", + "dependencies": { + "@remix-run/web-fetch": "@remix-run/web-fetch@4.4.1", + "@trigger.dev/sdk": "@trigger.dev/sdk@2.1.7", + "debug": "debug@4.3.4", + "express": "express@4.18.2" + } + }, + "@trigger.dev/sdk@2.1.7": { + "integrity": "sha512-t3pbXj6+I38a5LNGJg9Ed09NCt0AWnw7hJtUCZyuEfBQulRnVSekNLsxCyGlgiTPiyRvbyefzPrX1GhXh0MY1w==", + "dependencies": { + "@trigger.dev/core": "@trigger.dev/core@2.1.7", + "chalk": "chalk@5.3.0", + "cronstrue": "cronstrue@2.32.0", + "debug": "debug@4.3.4", + "evt": "evt@2.5.3", + "get-caller-file": "get-caller-file@2.0.5", + "git-remote-origin-url": "git-remote-origin-url@4.0.0", + "git-repo-info": "git-repo-info@2.1.1", + "node-fetch": "node-fetch@2.6.13", + "slug": "slug@6.1.0", + "terminal-link": "terminal-link@3.0.0", + "ulid": "ulid@2.3.0", + "uuid": "uuid@9.0.1", + "ws": "ws@8.13.0", + "zod": "zod@3.21.4" + } + }, + "@web3-storage/multipart-parser@1.0.0": { + "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==", + "dependencies": {} + }, + "@zxing/text-encoding@0.9.0": { + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "dependencies": {} + }, + "abort-controller@3.0.0": { + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "event-target-shim@5.0.1" + } + }, + "accepts@1.3.8": { + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "mime-types@2.1.35", + "negotiator": "negotiator@0.6.3" + } + }, + "ansi-escapes@5.0.0": { + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "type-fest@1.4.0" + } + }, + "array-flatten@1.1.1": { + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dependencies": {} + }, + "available-typed-arrays@1.0.5": { + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dependencies": {} + }, + "body-parser@1.20.1": { + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "bytes@3.1.2", + "content-type": "content-type@1.0.5", + "debug": "debug@2.6.9", + "depd": "depd@2.0.0", + "destroy": "destroy@1.2.0", + "http-errors": "http-errors@2.0.0", + "iconv-lite": "iconv-lite@0.4.24", + "on-finished": "on-finished@2.4.1", + "qs": "qs@6.11.0", + "raw-body": "raw-body@2.5.1", + "type-is": "type-is@1.6.18", + "unpipe": "unpipe@1.0.0" + } + }, + "bytes@3.1.2": { + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dependencies": {} + }, + "call-bind@1.0.2": { + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "function-bind@1.1.1", + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "chalk@5.3.0": { + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dependencies": {} + }, + "content-disposition@0.5.4": { + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "content-type@1.0.5": { + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dependencies": {} + }, + "cookie-signature@1.0.6": { + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dependencies": {} + }, + "cookie@0.5.0": { + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dependencies": {} + }, + "cronstrue@2.32.0": { + "integrity": "sha512-dmNflOCNJL6lZEj0dp2YhGIPY83VTjFue6d9feFhnNtrER6mAjBrUvSgK95j3IB/xNGpLjaZDIDG6ACKTZr9Yw==", + "dependencies": {} + }, + "data-uri-to-buffer@3.0.1": { + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dependencies": {} + }, + "debug@2.6.9": { + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "ms@2.0.0" + } + }, + "debug@4.3.4": { + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "depd@2.0.0": { + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dependencies": {} + }, + "destroy@1.2.0": { + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dependencies": {} + }, + "ee-first@1.1.1": { + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dependencies": {} + }, + "encodeurl@1.0.2": { + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dependencies": {} + }, + "escape-html@1.0.3": { + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dependencies": {} + }, + "etag@1.8.1": { + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dependencies": {} + }, + "event-target-shim@5.0.1": { + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dependencies": {} + }, + "evt@2.5.3": { + "integrity": "sha512-wZKx0JgXaTOVOXI2saNVxINU6VToOHDowMwb3NRcU6l+C59eW3w9dZgNxjokiM8rvMgc7/11yFG0cSDxn4qxgA==", + "dependencies": { + "minimal-polyfills": "minimal-polyfills@2.2.3", + "run-exclusive": "run-exclusive@2.2.19", + "tsafe": "tsafe@1.6.5" + } + }, + "express@4.18.2": { + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "accepts@1.3.8", + "array-flatten": "array-flatten@1.1.1", + "body-parser": "body-parser@1.20.1", + "content-disposition": "content-disposition@0.5.4", + "content-type": "content-type@1.0.5", + "cookie": "cookie@0.5.0", + "cookie-signature": "cookie-signature@1.0.6", + "debug": "debug@2.6.9", + "depd": "depd@2.0.0", + "encodeurl": "encodeurl@1.0.2", + "escape-html": "escape-html@1.0.3", + "etag": "etag@1.8.1", + "finalhandler": "finalhandler@1.2.0", + "fresh": "fresh@0.5.2", + "http-errors": "http-errors@2.0.0", + "merge-descriptors": "merge-descriptors@1.0.1", + "methods": "methods@1.1.2", + "on-finished": "on-finished@2.4.1", + "parseurl": "parseurl@1.3.3", + "path-to-regexp": "path-to-regexp@0.1.7", + "proxy-addr": "proxy-addr@2.0.7", + "qs": "qs@6.11.0", + "range-parser": "range-parser@1.2.1", + "safe-buffer": "safe-buffer@5.2.1", + "send": "send@0.18.0", + "serve-static": "serve-static@1.15.0", + "setprototypeof": "setprototypeof@1.2.0", + "statuses": "statuses@2.0.1", + "type-is": "type-is@1.6.18", + "utils-merge": "utils-merge@1.0.1", + "vary": "vary@1.1.2" + } + }, + "finalhandler@1.2.0": { + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "debug@2.6.9", + "encodeurl": "encodeurl@1.0.2", + "escape-html": "escape-html@1.0.3", + "on-finished": "on-finished@2.4.1", + "parseurl": "parseurl@1.3.3", + "statuses": "statuses@2.0.1", + "unpipe": "unpipe@1.0.0" + } + }, + "for-each@0.3.3": { + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "is-callable@1.2.7" + } + }, + "forwarded@0.2.0": { + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dependencies": {} + }, + "fresh@0.5.2": { + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dependencies": {} + }, + "function-bind@1.1.1": { + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dependencies": {} + }, + "get-caller-file@2.0.5": { + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dependencies": {} + }, + "get-intrinsic@1.2.1": { + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "function-bind@1.1.1", + "has": "has@1.0.3", + "has-proto": "has-proto@1.0.1", + "has-symbols": "has-symbols@1.0.3" + } + }, + "git-remote-origin-url@4.0.0": { + "integrity": "sha512-EAxDksNdjuWgmVW9pVvA9jQDi/dmTaiDONktIy7qiRRhBZUI4FQK1YvBvteuTSX24aNKg9lfgxNYJEeeSXe6DA==", + "dependencies": { + "gitconfiglocal": "gitconfiglocal@2.1.0" + } + }, + "git-repo-info@2.1.1": { + "integrity": "sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==", + "dependencies": {} + }, + "gitconfiglocal@2.1.0": { + "integrity": "sha512-qoerOEliJn3z+Zyn1HW2F6eoYJqKwS6MgC9cztTLUB/xLWX8gD/6T60pKn4+t/d6tP7JlybI7Z3z+I572CR/Vg==", + "dependencies": { + "ini": "ini@1.3.8" + } + }, + "gopd@1.0.1": { + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dependencies": {} + }, + "has-proto@1.0.1": { + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dependencies": {} + }, + "has-symbols@1.0.3": { + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dependencies": {} + }, + "has-tostringtag@1.0.0": { + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "has-symbols@1.0.3" + } + }, + "has@1.0.3": { + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "function-bind@1.1.1" + } + }, + "http-errors@2.0.0": { + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "depd@2.0.0", + "inherits": "inherits@2.0.4", + "setprototypeof": "setprototypeof@1.2.0", + "statuses": "statuses@2.0.1", + "toidentifier": "toidentifier@1.0.1" + } + }, + "iconv-lite@0.4.24": { + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": "safer-buffer@2.1.2" + } + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dependencies": {} + }, + "ini@1.3.8": { + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dependencies": {} + }, + "ipaddr.js@1.9.1": { + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dependencies": {} + }, + "is-arguments@1.1.1": { + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dependencies": {} + }, + "is-generator-function@1.0.10": { + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-typed-array@1.1.12": { + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "which-typed-array@1.1.11" + } + }, + "media-typer@0.3.0": { + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dependencies": {} + }, + "merge-descriptors@1.0.1": { + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dependencies": {} + }, + "methods@1.1.2": { + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dependencies": {} + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dependencies": {} + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "mime-db@1.52.0" + } + }, + "mime@1.6.0": { + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dependencies": {} + }, + "minimal-polyfills@2.2.3": { + "integrity": "sha512-oxdmJ9cL+xV72h0xYxp4tP2d5/fTBpP45H8DIOn9pASuF8a3IYTf+25fMGDYGiWW+MFsuog6KD6nfmhZJQ+uUw==", + "dependencies": {} + }, + "mrmime@1.0.1": { + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dependencies": {} + }, + "ms@2.0.0": { + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dependencies": {} + }, + "ms@2.1.2": { + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dependencies": {} + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dependencies": {} + }, + "negotiator@0.6.3": { + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dependencies": {} + }, + "node-fetch@2.6.13": { + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dependencies": { + "whatwg-url": "whatwg-url@5.0.0" + } + }, + "object-inspect@1.12.3": { + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dependencies": {} + }, + "on-finished@2.4.1": { + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "ee-first@1.1.1" + } + }, + "parseurl@1.3.3": { + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dependencies": {} + }, + "path-to-regexp@0.1.7": { + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dependencies": {} + }, + "proxy-addr@2.0.7": { + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "forwarded@0.2.0", + "ipaddr.js": "ipaddr.js@1.9.1" + } + }, + "qs@6.11.0": { + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "side-channel@1.0.4" + } + }, + "range-parser@1.2.1": { + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dependencies": {} + }, + "raw-body@2.5.1": { + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "bytes@3.1.2", + "http-errors": "http-errors@2.0.0", + "iconv-lite": "iconv-lite@0.4.24", + "unpipe": "unpipe@1.0.0" + } + }, + "run-exclusive@2.2.19": { + "integrity": "sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA==", + "dependencies": { + "minimal-polyfills": "minimal-polyfills@2.2.3" + } + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dependencies": {} + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dependencies": {} + }, + "send@0.18.0": { + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "debug@2.6.9", + "depd": "depd@2.0.0", + "destroy": "destroy@1.2.0", + "encodeurl": "encodeurl@1.0.2", + "escape-html": "escape-html@1.0.3", + "etag": "etag@1.8.1", + "fresh": "fresh@0.5.2", + "http-errors": "http-errors@2.0.0", + "mime": "mime@1.6.0", + "ms": "ms@2.1.3", + "on-finished": "on-finished@2.4.1", + "range-parser": "range-parser@1.2.1", + "statuses": "statuses@2.0.1" + } + }, + "serve-static@1.15.0": { + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "encodeurl@1.0.2", + "escape-html": "escape-html@1.0.3", + "parseurl": "parseurl@1.3.3", + "send": "send@0.18.0" + } + }, + "setprototypeof@1.2.0": { + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dependencies": {} + }, + "side-channel@1.0.4": { + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "get-intrinsic": "get-intrinsic@1.2.1", + "object-inspect": "object-inspect@1.12.3" + } + }, + "slug@6.1.0": { + "integrity": "sha512-x6vLHCMasg4DR2LPiyFGI0gJJhywY6DTiGhCrOMzb3SOk/0JVLIaL4UhyFSHu04SD3uAavrKY/K3zZ3i6iRcgA==", + "dependencies": {} + }, + "statuses@2.0.1": { + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dependencies": {} + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "has-flag@4.0.0" + } + }, + "supports-hyperlinks@2.3.0": { + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "has-flag@4.0.0", + "supports-color": "supports-color@7.2.0" + } + }, + "terminal-link@3.0.0": { + "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "dependencies": { + "ansi-escapes": "ansi-escapes@5.0.0", + "supports-hyperlinks": "supports-hyperlinks@2.3.0" + } + }, + "toidentifier@1.0.1": { + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dependencies": {} + }, + "tr46@0.0.3": { + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dependencies": {} + }, + "tsafe@1.6.5": { + "integrity": "sha512-895zss8xqqHKTc28sHGIfZKnt3C5jrstB1DyPr/h3/flK0zojsZUMQL1/W4ytdDW6KI4Oth62nb9rrxmA3s3Iw==", + "dependencies": {} + }, + "type-fest@1.4.0": { + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dependencies": {} + }, + "type-is@1.6.18": { + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "media-typer@0.3.0", + "mime-types": "mime-types@2.1.35" + } + }, + "ulid@2.3.0": { + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", + "dependencies": {} + }, + "unpipe@1.0.0": { + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dependencies": {} + }, + "util@0.12.5": { + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "inherits@2.0.4", + "is-arguments": "is-arguments@1.1.1", + "is-generator-function": "is-generator-function@1.0.10", + "is-typed-array": "is-typed-array@1.1.12", + "which-typed-array": "which-typed-array@1.1.11" + } + }, + "utils-merge@1.0.1": { + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dependencies": {} + }, + "uuid@9.0.1": { + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dependencies": {} + }, + "vary@1.1.2": { + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dependencies": {} + }, + "web-encoding@1.1.5": { + "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", + "dependencies": { + "@zxing/text-encoding": "@zxing/text-encoding@0.9.0", + "util": "util@0.12.5" + } + }, + "web-streams-polyfill@3.2.1": { + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dependencies": {} + }, + "webidl-conversions@3.0.1": { + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dependencies": {} + }, + "whatwg-url@5.0.0": { + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "tr46@0.0.3", + "webidl-conversions": "webidl-conversions@3.0.1" + } + }, + "which-typed-array@1.1.11": { + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "available-typed-arrays@1.0.5", + "call-bind": "call-bind@1.0.2", + "for-each": "for-each@0.3.3", + "gopd": "gopd@1.0.1", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "ws@8.13.0": { + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dependencies": {} + }, + "zod-error@1.5.0": { + "integrity": "sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==", + "dependencies": { + "zod": "zod@3.21.4" + } + }, + "zod@3.21.4": { + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "dependencies": {} + } + } + }, + "remote": {} +} diff --git a/references/deno-reference/main.ts b/references/deno-reference/main.ts new file mode 100644 index 0000000000..2f8168b94d --- /dev/null +++ b/references/deno-reference/main.ts @@ -0,0 +1,40 @@ +import { TriggerClient } from "npm:@trigger.dev/sdk"; +import { eventTrigger } from "npm:@trigger.dev/sdk"; + +export const triggerClient = new TriggerClient({ + id: "borderless", + apiKey: "...", +}); + + +// your first job +triggerClient.defineJob({ + id: "example-job", + name: "Example Job", + version: "0.0.1", + trigger: eventTrigger({ + name: "example.event", + }), + run: async (payload, io, ctx) => { + await io.logger.info("Hello world!", { payload }); + + return { + message: "Hello world!", + }; + }, +}); + + +Deno.serve(async (req) => { + const response = await triggerClient.handleRequest(req); + if (!response) { + return Response.json({ error: "Not found" }, { + status: 404, + }) + } + + return Response.json(response.body, { + status: response.status, + headers: response.headers + }); +}); From aec4aea9fe64179f82ddf0e78b3a91fc194781e2 Mon Sep 17 00:00:00 2001 From: Guy Kedem Date: Wed, 4 Oct 2023 12:51:00 +0300 Subject: [PATCH 2/4] accessing runtime specific functions through JsRuntime --- packages/cli/src/commands/dev.ts | 53 ++++++----------------------- packages/cli/src/commands/whoami.ts | 4 +-- packages/cli/src/utils/jsRuntime.ts | 20 ++++++----- packages/cli/src/utils/logger.ts | 1 + 4 files changed, 25 insertions(+), 53 deletions(-) diff --git a/packages/cli/src/commands/dev.ts b/packages/cli/src/commands/dev.ts index 1984bb15fc..1fea669868 100644 --- a/packages/cli/src/commands/dev.ts +++ b/packages/cli/src/commands/dev.ts @@ -3,7 +3,7 @@ import childProcess from "child_process"; import chokidar from "chokidar"; import fs from "fs/promises"; import ngrok from "ngrok"; -import { run as ncuRun } from "npm-check-updates"; +import run, { run as ncuRun } from "npm-check-updates"; import ora, { Ora } from "ora"; import pathModule from "path"; import util from "util"; @@ -19,6 +19,7 @@ import { resolvePath } from "../utils/parseNameAndPath"; import { RequireKeys } from "../utils/requiredKeys"; import { TriggerApi } from "../utils/triggerApi"; import { standardWatchIgnoreRegex, standardWatchFilePaths } from "../frameworks/watchConfig"; +import { JsRuntime, getJsRuntime } from "../utils/jsRuntime"; const asyncExecFile = util.promisify(childProcess.execFile); @@ -41,6 +42,7 @@ const formattedDate = new Intl.DateTimeFormat("en", { second: "numeric", }); +let runtime: JsRuntime; export async function devCommand(path: string, anyOptions: any) { telemetryClient.dev.started(path, anyOptions); @@ -53,12 +55,12 @@ export async function devCommand(path: string, anyOptions: any) { const options = result.data; const resolvedPath = resolvePath(path); - + runtime = await getJsRuntime(resolvedPath, logger); //check for outdated packages, don't await this - checkForOutdatedPackages(resolvedPath); + runtime.checkForOutdatedPackages(); // Read from package.json to get the endpointId - const endpointId = await getEndpointIdFromPackageJson(resolvedPath, options); + const endpointId = await getEndpointId(runtime, options); if (!endpointId) { logger.error( "You must run the `init` command first to setup the project – you are missing \n'trigger.dev': { 'endpointId': 'your-client-id' } from your package.json file, or pass in the --client-id option to this command" @@ -69,8 +71,8 @@ export async function devCommand(path: string, anyOptions: any) { logger.success(`✔️ [trigger.dev] Detected TriggerClient id: ${endpointId}`); //resolve the options using the detected framework (use default if there isn't a matching framework) - const packageManager = await getUserPackageManager(resolvedPath); - const framework = await getFramework(resolvedPath, packageManager); + const packageManager = await runtime.getUserPackageManager(); + const framework = await runtime.getFramework(); const resolvedOptions = await resolveOptions(framework, resolvedPath, options); // Read from .env.local or .env to get the TRIGGER_API_KEY and TRIGGER_API_URL @@ -115,7 +117,7 @@ export async function devCommand(path: string, anyOptions: any) { const refresh = async () => { connectingSpinner.start(); - const refreshedEndpointId = await getEndpointIdFromPackageJson(resolvedPath, resolvedOptions); + const refreshedEndpointId = await getEndpointId(runtime, resolvedOptions); // Read from env file to get the TRIGGER_API_KEY and TRIGGER_API_URL const apiDetails = await getTriggerApiDetails(resolvedPath, envFile); @@ -304,43 +306,10 @@ async function verifyEndpoint( return; } -export async function checkForOutdatedPackages(path: string) { - const updates = (await ncuRun({ - packageFile: `${path}/package.json`, - filter: "/trigger.dev/.+$/", - upgrade: false, - })) as { - [key: string]: string; - }; - - if (typeof updates === "undefined" || Object.keys(updates).length === 0) { - return; - } - - const packageFile = await fs.readFile(`${path}/package.json`); - const data = JSON.parse(Buffer.from(packageFile).toString("utf8")); - const dependencies = data.dependencies; - console.log(chalk.bgYellow("Updates available for trigger.dev packages")); - console.log(chalk.bgBlue("Run npx @trigger.dev/cli@latest update")); - - for (let dep in updates) { - console.log(`${dep} ${dependencies[dep]} → ${updates[dep]}`); - } -} - -export async function getEndpointIdFromPackageJson(path: string, options: DevCommandOptions) { +export function getEndpointId(runtime: JsRuntime, options: DevCommandOptions) { if (options.clientId) { return options.clientId; - } - - const pkgJsonPath = pathModule.join(path, "package.json"); - const pkgBuffer = await fs.readFile(pkgJsonPath); - const pkgJson = JSON.parse(pkgBuffer.toString()); - - const value = pkgJson["trigger.dev"]?.endpointId; - if (!value || typeof value !== "string") return; - - return value as string; + } else return runtime.getEndpointId(); } async function resolveEndpointUrl(apiUrl: string, port: number, hostname: string) { diff --git a/packages/cli/src/commands/whoami.ts b/packages/cli/src/commands/whoami.ts index afe71cbad1..1521d5f764 100644 --- a/packages/cli/src/commands/whoami.ts +++ b/packages/cli/src/commands/whoami.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { logger } from "../utils/logger"; import { resolvePath } from "../utils/parseNameAndPath"; import { TriggerApi } from "../utils/triggerApi"; -import { DevCommandOptions, getEndpointIdFromPackageJson } from "./dev"; +import { DevCommandOptions, getEndpointId } from "./dev"; import ora from "ora"; import { getTriggerApiDetails } from "../utils/getTriggerApiDetails"; @@ -26,7 +26,7 @@ export async function whoamiCommand(path: string, anyOptions: any) { const resolvedPath = resolvePath(path); // Read from package.json to get the endpointId - const endpointId = await getEndpointIdFromPackageJson(resolvedPath, options as DevCommandOptions); + const endpointId = await getEndpointId(resolvedPath, options as DevCommandOptions); if (!endpointId) { logger.error( "You must run the `init` command first to setup the project – you are missing \n'trigger.dev': { 'endpointId': 'your-client-id' } from your package.json file, or pass in the --client-id option to this command" diff --git a/packages/cli/src/utils/jsRuntime.ts b/packages/cli/src/utils/jsRuntime.ts index 6d5011f36c..42cd1dc3b8 100644 --- a/packages/cli/src/utils/jsRuntime.ts +++ b/packages/cli/src/utils/jsRuntime.ts @@ -8,7 +8,7 @@ import pathModule from "path"; type SupportedRuntimeId = "node" | "deno"; -abstract class JsRuntime { +export abstract class JsRuntime { logger: Logger; projectRootPath: string; constructor(projectRootPath: string, logger: Logger) { @@ -19,14 +19,15 @@ abstract class JsRuntime { abstract getUserPackageManager(): Promise; abstract getFramework(): Promise; abstract getEndpointId(): Promise; - static async getJsRuntime(projectRootPath: string, logger: Logger) { - if (await NodeJsRuntime.isNodeJsRuntime(projectRootPath)) { - return new NodeJsRuntime(projectRootPath, logger); - } else if (await DenoRuntime.isDenoJsRuntime(projectRootPath)) { - return new DenoRuntime(projectRootPath, logger); - } - throw new Error("Unsupported runtime"); +} + +export async function getJsRuntime(projectRootPath: string, logger: Logger): Promise { + if (await NodeJsRuntime.isNodeJsRuntime(projectRootPath)) { + return new NodeJsRuntime(projectRootPath, logger); + } else if (await DenoRuntime.isDenoJsRuntime(projectRootPath)) { + return new DenoRuntime(projectRootPath, logger); } + throw new Error("Unsupported runtime"); } class NodeJsRuntime extends JsRuntime { @@ -79,7 +80,8 @@ class NodeJsRuntime extends JsRuntime { const pkgJsonPath = pathModule.join(this.projectRootPath, "package.json"); const pkgBuffer = await fs.readFile(pkgJsonPath); const pkgJson = JSON.parse(pkgBuffer.toString()); - return pkgJson["trigger.dev"]?.endpointId; + const value = pkgJson["trigger.dev"]?.endpointId; + if (!value || typeof value !== "string") return undefined; } } diff --git a/packages/cli/src/utils/logger.ts b/packages/cli/src/utils/logger.ts index e971b8b95d..a4d90e200b 100644 --- a/packages/cli/src/utils/logger.ts +++ b/packages/cli/src/utils/logger.ts @@ -1,5 +1,6 @@ import chalk from "chalk"; +export type Logger = typeof logger; export const logger = { error(...args: unknown[]) { console.log(chalk.red(...args)); From 2ad0f21d1f98a7e152edd45292a0f13b3677464f Mon Sep 17 00:00:00 2001 From: Guy Kedem Date: Wed, 4 Oct 2023 13:27:54 +0300 Subject: [PATCH 3/4] adding support for both deno.json and deno.jsonc --- packages/cli/src/utils/jsRuntime.ts | 16 +++++++-- references/deno-reference/main.ts | 53 +++++++++++++++-------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/packages/cli/src/utils/jsRuntime.ts b/packages/cli/src/utils/jsRuntime.ts index 42cd1dc3b8..f466696042 100644 --- a/packages/cli/src/utils/jsRuntime.ts +++ b/packages/cli/src/utils/jsRuntime.ts @@ -6,8 +6,6 @@ import chalk from "chalk"; import fs from "fs/promises"; import pathModule from "path"; -type SupportedRuntimeId = "node" | "deno"; - export abstract class JsRuntime { logger: Logger; projectRootPath: string; @@ -86,6 +84,18 @@ class NodeJsRuntime extends JsRuntime { } class DenoRuntime extends JsRuntime { + getDenoJsonPath(): Promise { + try { + return fs + .stat(pathModule.join(this.projectRootPath, "deno.json")) + .then(() => pathModule.join(this.projectRootPath, "deno.json")); + } catch { + return fs + .stat(pathModule.join(this.projectRootPath, "deno.jsonc")) + .then(() => pathModule.join(this.projectRootPath, "deno.jsonc")); + } + } + static async isDenoJsRuntime(projectRootPath: string): Promise { try { try { @@ -110,7 +120,7 @@ class DenoRuntime extends JsRuntime { return undefined; } async getEndpointId() { - const pkgJsonPath = pathModule.join(this.projectRootPath, "deno.json"); + const pkgJsonPath = await this.getDenoJsonPath(); const pkgBuffer = await fs.readFile(pkgJsonPath); const pkgJson = JSON.parse(pkgBuffer.toString()); return pkgJson["trigger.dev"]?.endpointId; diff --git a/references/deno-reference/main.ts b/references/deno-reference/main.ts index 2f8168b94d..de9336dea7 100644 --- a/references/deno-reference/main.ts +++ b/references/deno-reference/main.ts @@ -2,39 +2,40 @@ import { TriggerClient } from "npm:@trigger.dev/sdk"; import { eventTrigger } from "npm:@trigger.dev/sdk"; export const triggerClient = new TriggerClient({ - id: "borderless", - apiKey: "...", + id: "borderless", + apiKey: "...", }); - // your first job triggerClient.defineJob({ - id: "example-job", - name: "Example Job", - version: "0.0.1", - trigger: eventTrigger({ - name: "example.event", - }), - run: async (payload, io, ctx) => { - await io.logger.info("Hello world!", { payload }); + id: "example-job", + name: "Example Job", + version: "0.0.1", + trigger: eventTrigger({ + name: "example.event", + }), + run: async (payload, io, ctx) => { + await io.logger.info("Hello world!", { payload }); - return { - message: "Hello world!", - }; - }, + return { + message: "Hello world!", + }; + }, }); - Deno.serve(async (req) => { - const response = await triggerClient.handleRequest(req); - if (!response) { - return Response.json({ error: "Not found" }, { - status: 404, - }) - } + const response = await triggerClient.handleRequest(req); + if (!response) { + return Response.json( + { error: "Not found" }, + { + status: 404, + } + ); + } - return Response.json(response.body, { - status: response.status, - headers: response.headers - }); + return Response.json(response.body, { + status: response.status, + headers: response.headers, + }); }); From e395fb9cdfddde4f2441ec20fd244d19b20a9a33 Mon Sep 17 00:00:00 2001 From: Guy Kedem Date: Wed, 4 Oct 2023 13:58:55 +0300 Subject: [PATCH 4/4] no automatic setup for deno projects currently --- packages/cli/src/commands/init.ts | 12 ++++++++++++ packages/cli/src/utils/jsRuntime.ts | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index bf934eed12..0819a1a123 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -22,6 +22,7 @@ import { resolvePath } from "../utils/parseNameAndPath"; import { readPackageJson } from "../utils/readPackageJson"; import { renderTitle } from "../utils/renderTitle"; import { TriggerApi, WhoamiResponse } from "../utils/triggerApi"; +import { getJsRuntime } from "../utils/jsRuntime"; export type InitCommandOptions = { projectPath: string; @@ -38,6 +39,17 @@ export const initCommand = async (options: InitCommandOptions) => { const resolvedPath = resolvePath(options.projectPath); + // assuming nodejs by default + let runtimeId: string = "nodejs"; + try { + runtimeId = (await getJsRuntime(resolvedPath, logger)).id; + } catch {} + if (runtimeId !== "nodejs") { + logger.error(`We currently only support automatic setup for NodeJS projects.`); + telemetryClient.init.failed("not_supported_runtime", options); + return; + } + await renderTitle(resolvedPath); if (options.triggerUrl === CLOUD_TRIGGER_URL) { diff --git a/packages/cli/src/utils/jsRuntime.ts b/packages/cli/src/utils/jsRuntime.ts index f466696042..3fc3223f0b 100644 --- a/packages/cli/src/utils/jsRuntime.ts +++ b/packages/cli/src/utils/jsRuntime.ts @@ -13,6 +13,7 @@ export abstract class JsRuntime { this.logger = logger; this.projectRootPath = projectRootPath; } + abstract get id(): string; abstract checkForOutdatedPackages(): Promise; abstract getUserPackageManager(): Promise; abstract getFramework(): Promise; @@ -38,6 +39,9 @@ class NodeJsRuntime extends JsRuntime { } } + get id() { + return "nodejs"; + } get packageJsonPath(): string { return pathModule.join(this.projectRootPath, "package.json"); } @@ -96,6 +100,10 @@ class DenoRuntime extends JsRuntime { } } + get id() { + return "deno"; + } + static async isDenoJsRuntime(projectRootPath: string): Promise { try { try {