From 8a7394e807d7936fbe13f4aea72883bc80ada613 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 15:59:27 +0100 Subject: [PATCH 1/4] Added pdf-to-image example --- docs/examples/intro.mdx | 1 + docs/examples/pdf-to-image.mdx | 84 ++++++++++++++++++++++++++++++++++ docs/mint.json | 1 + 3 files changed, 86 insertions(+) create mode 100644 docs/examples/pdf-to-image.mdx diff --git a/docs/examples/intro.mdx b/docs/examples/intro.mdx index e9881ebdf3..3097647b7b 100644 --- a/docs/examples/intro.mdx +++ b/docs/examples/intro.mdx @@ -9,6 +9,7 @@ description: "Learn how to use Trigger.dev with these practical task examples." | [DALL·E 3 image generation](/examples/dall-e3-generate-image) | Use OpenAI's GPT-4o and DALL·E 3 to generate an image and text. | | [FFmpeg video processing](/examples/ffmpeg-video-processing) | Use FFmpeg to process a video in various ways and save it to Cloudflare R2. | | [OpenAI with retrying](/examples/open-ai-with-retrying) | Create a reusable OpenAI task with custom retry options. | +| [PDF to image](/examples/pdf-to-image) | Use `MuPDF` to turn a PDF into an image and save it to Cloudflare R2. | | [React to PDF](/examples/react-pdf) | Use `react-pdf` to generate a PDF and save it to Cloudflare R2. | | [Resend email sequence](/examples/resend-email-sequence) | Send a sequence of emails over several days using Resend with Trigger.dev. | | [Sharp image processing](/examples/sharp-image-processing) | Use Sharp to process an image and save it to Cloudflare R2. | diff --git a/docs/examples/pdf-to-image.mdx b/docs/examples/pdf-to-image.mdx new file mode 100644 index 0000000000..c99aa40c53 --- /dev/null +++ b/docs/examples/pdf-to-image.mdx @@ -0,0 +1,84 @@ +--- +title: "Turn a PDF into an image using MuPDF" +sidebarTitle: "PDF to image" +description: "This example will show you how to turn a PDF into an image using MuPDF and Trigger.dev." +--- + +## Overview + +This example demonstrates how to use Trigger.dev to turn a PDF into an image using MuPDF. + +## Task code + +```ts trigger/pdfToImage.ts +import { logger, task } from "@trigger.dev/sdk/v3"; +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { execSync } from "child_process"; +import fs from "fs"; +import path from "path"; + +// Initialize S3 client +const s3Client = new S3Client({ + region: "auto", + endpoint: process.env.S3_ENDPOINT, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID ?? "", + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY ?? "", + }, +}); + +export const pdfToImage = task({ + id: "pdf-to-image", + run: async (payload: { pdfUrl: string; documentId: string }) => { + logger.log("Converting PDF to images", payload); + + const pdfPath = `/tmp/${payload.documentId}.pdf`; + const outputDir = `/tmp/${payload.documentId}`; + + // Download PDF and convert to images using MuPDF + execSync(`curl -s -o ${pdfPath} ${payload.pdfUrl}`); + fs.mkdirSync(outputDir, { recursive: true }); + execSync(`mutool convert -o ${outputDir}/page-%d.png ${pdfPath}`); + + // Upload images to R2 + const uploadedUrls = []; + for (const file of fs.readdirSync(outputDir)) { + const s3Key = `images/${payload.documentId}/${file}`; + const uploadParams = { + Bucket: process.env.S3_BUCKET, + Key: s3Key, + Body: fs.readFileSync(path.join(outputDir, file)), + ContentType: "image/png", + }; + + logger.log("Uploading to R2", uploadParams); + + await s3Client.send(new PutObjectCommand(uploadParams)); + const s3Url = `https://${process.env.S3_BUCKET}.r2.cloudflarestorage.com/${s3Key}`; + uploadedUrls.push(s3Url); + logger.log("Image uploaded to R2", { url: s3Url }); + } + + // Clean up + fs.rmSync(outputDir, { recursive: true, force: true }); + fs.unlinkSync(pdfPath); + + logger.log("All images uploaded to R2", { urls: uploadedUrls }); + + return { + imageUrls: uploadedUrls, + }; + }, +}); +``` + +## Testing your task + +To test this task in the dashboard, you can use the following payload: + +```json +{ + "pdfUrl": "https://pdfobject.com/pdf/sample.pdf", + "documentId": "unique-document-id" +} +``` diff --git a/docs/mint.json b/docs/mint.json index 2521f8ec97..1c7c35cb53 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -277,6 +277,7 @@ "examples/dall-e3-generate-image", "examples/ffmpeg-video-processing", "examples/open-ai-with-retrying", + "examples/pdf-to-image", "examples/sharp-image-processing", "examples/react-pdf", "examples/resend-email-sequence", From d20c3460602e495398cf74d95335dd1bdf53ecab Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 16:45:56 +0100 Subject: [PATCH 2/4] Copy tweak --- docs/examples/pdf-to-image.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/pdf-to-image.mdx b/docs/examples/pdf-to-image.mdx index c99aa40c53..62398c8d48 100644 --- a/docs/examples/pdf-to-image.mdx +++ b/docs/examples/pdf-to-image.mdx @@ -6,7 +6,7 @@ description: "This example will show you how to turn a PDF into an image using M ## Overview -This example demonstrates how to use Trigger.dev to turn a PDF into an image using MuPDF. +This example demonstrates how to use Trigger.dev to turn a PDF into a series of images using MuPDF and upload them to Cloudflare R2. ## Task code From 82e7b4ceab55874e3393a4c284918e83d6a47797 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 16:46:33 +0100 Subject: [PATCH 3/4] Squashed commit of the following: commit 64862db846a9fe6e233518b885816a67f95c8604 Author: Niels Date: Thu Sep 19 16:25:17 2024 +0200 Update dotEnv.ts to ignore OTEL_EXPORTER_OTLP_ENDPOINT as well (#1307) * Update dotEnv.ts * Create four-buttons-run.md --------- Co-authored-by: Eric Allam commit c65d4822b4f54409e66ee492ae9e5159d6dd3aa6 Author: Thibaut Cuchet Date: Thu Sep 19 16:22:57 2024 +0200 Feat: Extension puppeteer (#1323) * feat: add puppeteer extension * chore: update package and config * feat: add puppeteer task * Create little-donkeys-protect.md --------- Co-authored-by: Eric Allam commit b4be7365551629e04732c6ecaa49aa82a5f1874c Author: Eric Allam Date: Thu Sep 19 15:21:03 2024 +0100 prismaExtension fixes for #1325 and #1327 --- .changeset/four-buttons-run.md | 5 + .changeset/friendly-brooms-cry.md | 6 + .changeset/little-donkeys-protect.md | 5 + .vscode/launch.json | 8 + docs/config/config-file.mdx | 7 +- packages/build/package.json | 17 +- packages/build/src/extensions/prisma.ts | 31 +- packages/build/src/extensions/puppeteer.ts | 34 ++ packages/cli-v3/src/deploy/buildImage.ts | 4 +- packages/cli-v3/src/utilities/dotEnv.ts | 1 + pnpm-lock.yaml | 348 +++++++++++++++++- references/prisma-catalog/package.json | 18 + .../migration.sql | 20 + .../prisma/migrations/migration_lock.toml | 3 + .../prisma-catalog/prisma/schema.prisma | 26 ++ .../prisma/sql/getUsersWithPosts.sql | 10 + references/prisma-catalog/src/db.ts | 6 + .../prisma-catalog/src/trigger/dbTasks.ts | 21 ++ references/prisma-catalog/trigger.config.ts | 26 ++ references/prisma-catalog/tsconfig.json | 15 + references/v3-catalog/package.json | 5 +- .../v3-catalog/src/trigger/puppeteerTask.ts | 16 + references/v3-catalog/trigger.config.ts | 2 + 23 files changed, 608 insertions(+), 26 deletions(-) create mode 100644 .changeset/four-buttons-run.md create mode 100644 .changeset/friendly-brooms-cry.md create mode 100644 .changeset/little-donkeys-protect.md create mode 100644 packages/build/src/extensions/puppeteer.ts create mode 100644 references/prisma-catalog/package.json create mode 100644 references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql create mode 100644 references/prisma-catalog/prisma/migrations/migration_lock.toml create mode 100644 references/prisma-catalog/prisma/schema.prisma create mode 100644 references/prisma-catalog/prisma/sql/getUsersWithPosts.sql create mode 100644 references/prisma-catalog/src/db.ts create mode 100644 references/prisma-catalog/src/trigger/dbTasks.ts create mode 100644 references/prisma-catalog/trigger.config.ts create mode 100644 references/prisma-catalog/tsconfig.json create mode 100644 references/v3-catalog/src/trigger/puppeteerTask.ts diff --git a/.changeset/four-buttons-run.md b/.changeset/four-buttons-run.md new file mode 100644 index 0000000000..e89c4f7d8d --- /dev/null +++ b/.changeset/four-buttons-run.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +Ignore OTEL_EXPORTER_OTLP_ENDPOINT environment variable from `.env` files, to prevent the internal OTEL_EXPORTER_OTLP_ENDPOINT being overwritten with a user-supplied value. diff --git a/.changeset/friendly-brooms-cry.md b/.changeset/friendly-brooms-cry.md new file mode 100644 index 0000000000..aa7fff9a7b --- /dev/null +++ b/.changeset/friendly-brooms-cry.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/build": patch +--- + +prismaExtension fixes for #1325 and #1327 diff --git a/.changeset/little-donkeys-protect.md b/.changeset/little-donkeys-protect.md new file mode 100644 index 0000000000..479f7a0da1 --- /dev/null +++ b/.changeset/little-donkeys-protect.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/build": patch +--- + +Feat: puppeteer build extension diff --git a/.vscode/launch.json b/.vscode/launch.json index 1e7cf8eb0b..8fd69a9b45 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,6 +36,14 @@ "cwd": "${workspaceFolder}/references/v3-catalog", "sourceMaps": true }, + { + "type": "node-terminal", + "request": "launch", + "name": "Debug prisma-catalog deploy CLI", + "command": "pnpm exec trigger deploy --self-hosted --load-image", + "cwd": "${workspaceFolder}/references/prisma-catalog", + "sourceMaps": true + }, { "type": "node-terminal", "request": "launch", diff --git a/docs/config/config-file.mdx b/docs/config/config-file.mdx index 7c898e494b..6613314104 100644 --- a/docs/config/config-file.mdx +++ b/docs/config/config-file.mdx @@ -444,12 +444,9 @@ export default defineConfig({ ``` - The `prismaExtension` will inject the `DATABASE_URL` environment variable into the build process - when running the `deploy` command. This means the CLI needs to have `process.env.DATABASE_URL` set - at the time of calling the `deploy` command. You can do this via a `.env` file and passing the - `--env-file .env` option to the deploy command or via shell environment variables. This goes for direct database URLs as well. + The `prismaExtension` will inject the `DATABASE_URL` environment variable into the build process. Learn more about setting environment variables for deploying in our [Environment Variables](/deploy-environment-variables) guide. -These environment variables are only used during the build process and are not embedded in the final image. +These environment variables are only used during the build process and are not embedded in the final container image. diff --git a/packages/build/package.json b/packages/build/package.json index 0698fb1db3..bef0f199f0 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -27,7 +27,8 @@ "./extensions/core": "./src/extensions/core.ts", "./extensions/prisma": "./src/extensions/prisma.ts", "./extensions/audioWaveform": "./src/extensions/audioWaveform.ts", - "./extensions/typescript": "./src/extensions/typescript.ts" + "./extensions/typescript": "./src/extensions/typescript.ts", + "./extensions/puppeteer": "./src/extensions/puppeteer.ts" }, "sourceDialects": [ "@triggerdotdev/source" @@ -49,6 +50,9 @@ ], "extensions/typescript": [ "dist/commonjs/extensions/typescript.d.ts" + ], + "extensions/puppeteer": [ + "dist/commonjs/extensions/puppeteer.d.ts" ] } }, @@ -145,6 +149,17 @@ "types": "./dist/commonjs/extensions/typescript.d.ts", "default": "./dist/commonjs/extensions/typescript.js" } + }, + "./extensions/puppeteer": { + "import": { + "@triggerdotdev/source": "./src/extensions/puppeteer.ts", + "types": "./dist/esm/extensions/puppeteer.d.ts", + "default": "./dist/esm/extensions/puppeteer.js" + }, + "require": { + "types": "./dist/commonjs/extensions/puppeteer.d.ts", + "default": "./dist/commonjs/extensions/puppeteer.js" + } } }, "main": "./dist/commonjs/index.js", diff --git a/packages/build/src/extensions/prisma.ts b/packages/build/src/extensions/prisma.ts index 26d5253d62..b67adc7efc 100644 --- a/packages/build/src/extensions/prisma.ts +++ b/packages/build/src/extensions/prisma.ts @@ -127,8 +127,9 @@ export class PrismaExtension implements BuildExtension { if (this.options.typedSql) { generatorFlags.push(`--sql`); - const schemaDir = dirname(this._resolvedSchemaPath); - const prismaDir = dirname(schemaDir); + const prismaDir = usingSchemaFolder + ? dirname(dirname(this._resolvedSchemaPath)) + : dirname(this._resolvedSchemaPath); context.logger.debug(`Using typedSql`); @@ -226,15 +227,29 @@ export class PrismaExtension implements BuildExtension { commands.push( `${binaryForRuntime(manifest.runtime)} node_modules/prisma/build/index.js migrate deploy` ); + } - env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL; + env.DATABASE_URL = manifest.deploy.env?.DATABASE_URL; - if (this.options.directUrlEnvVarName) { - env[this.options.directUrlEnvVarName] = - manifest.deploy.env?.[this.options.directUrlEnvVarName]; - } else { - env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL; + if (this.options.directUrlEnvVarName) { + env[this.options.directUrlEnvVarName] = + manifest.deploy.env?.[this.options.directUrlEnvVarName] ?? + process.env[this.options.directUrlEnvVarName]; + + if (!env[this.options.directUrlEnvVarName]) { + context.logger.warn( + `prismaExtension could not resolve the ${this.options.directUrlEnvVarName} environment variable. Make sure you add it to your environment variables or provide it as an environment variable to the deploy CLI command. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables` + ); } + } else { + env.DIRECT_URL = manifest.deploy.env?.DIRECT_URL; + env.DIRECT_DATABASE_URL = manifest.deploy.env?.DIRECT_DATABASE_URL; + } + + if (!env.DATABASE_URL) { + context.logger.warn( + `prismaExtension could not resolve the DATABASE_URL environment variable. Make sure you add it to your environment variables. See our docs for more info: https://trigger.dev/docs/deploy-environment-variables` + ); } context.logger.debug(`Adding the prisma layer with the following commands`, { diff --git a/packages/build/src/extensions/puppeteer.ts b/packages/build/src/extensions/puppeteer.ts new file mode 100644 index 0000000000..5a327424cb --- /dev/null +++ b/packages/build/src/extensions/puppeteer.ts @@ -0,0 +1,34 @@ +import { BuildManifest } from "@trigger.dev/core/v3"; +import { BuildContext, BuildExtension } from "@trigger.dev/core/v3/build"; + +export function puppeteer() { + return new PuppeteerExtension(); +} + +class PuppeteerExtension implements BuildExtension { + public readonly name = "PuppeteerExtension"; + + async onBuildComplete(context: BuildContext, manifest: BuildManifest) { + if (context.target === "dev") { + return; + } + + context.logger.debug(`Adding ${this.name} to the build`); + + const instructions = [ + `RUN apt-get update && apt-get install curl gnupg -y \ + && curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ + && apt-get update \ + && apt-get install google-chrome-stable -y --no-install-recommends \ + && rm -rf /var/lib/apt/lists/*`, + ]; + + context.addLayer({ + id: "puppeteer", + image: { + instructions, + }, + }); + } +} diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index a5fed62b68..db933fa5b2 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -492,7 +492,7 @@ COPY --chown=bun:bun . . ${postInstallCommands} -from build as indexer +FROM build AS indexer USER bun WORKDIR /app @@ -601,7 +601,7 @@ COPY --chown=node:node . . ${postInstallCommands} -from build as indexer +FROM build AS indexer USER node WORKDIR /app diff --git a/packages/cli-v3/src/utilities/dotEnv.ts b/packages/cli-v3/src/utilities/dotEnv.ts index 717aa88c59..7b5bfbcf6d 100644 --- a/packages/cli-v3/src/utilities/dotEnv.ts +++ b/packages/cli-v3/src/utilities/dotEnv.ts @@ -21,6 +21,7 @@ export function resolveDotEnvVars(cwd?: string, envFile?: string) { // remove TRIGGER_API_URL and TRIGGER_SECRET_KEY, since those should be coming from the worker delete result.TRIGGER_API_URL; delete result.TRIGGER_SECRET_KEY; + delete result.OTEL_EXPORTER_OTLP_ENDPOINT; return result; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f1c6e2b36..ca0e051fa7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1360,6 +1360,28 @@ importers: specifier: workspace:* version: link:../../packages/cli-v3 + references/prisma-catalog: + dependencies: + '@prisma/client': + specifier: 5.19.0 + version: 5.19.0(prisma@5.19.0) + '@trigger.dev/sdk': + specifier: workspace:* + version: link:../../packages/trigger-sdk + devDependencies: + '@trigger.dev/build': + specifier: workspace:* + version: link:../../packages/build + prisma: + specifier: 5.19.0 + version: 5.19.0 + trigger.dev: + specifier: workspace:* + version: link:../../packages/cli-v3 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + references/v3-catalog: dependencies: '@infisical/sdk': @@ -1425,6 +1447,9 @@ importers: pg: specifier: ^8.11.5 version: 8.11.5 + puppeteer: + specifier: ^23.4.0 + version: 23.4.0(typescript@5.5.4) react: specifier: 19.0.0-rc.0 version: 19.0.0-rc.0 @@ -6851,9 +6876,9 @@ packages: resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 lru-cache: 10.0.1 socks-proxy-agent: 8.0.4 transitivePeerDependencies: @@ -8052,6 +8077,23 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + /@puppeteer/browsers@2.4.0: + resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==} + engines: {node: '>=18'} + hasBin: true + dependencies: + debug: 4.3.6 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.4.0 + semver: 7.6.3 + tar-fs: 3.0.6 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + /@radix-ui/colors@1.0.1: resolution: {integrity: sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==} dev: false @@ -14790,6 +14832,14 @@ packages: '@types/node': 18.19.20 dev: true + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.19.20 + dev: false + optional: true + /@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6)(eslint@8.31.0)(typescript@5.2.2): resolution: {integrity: sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -16094,6 +16144,10 @@ packages: engines: {node: '>= 0.4'} dev: false + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + dev: false + /babel-loader@9.1.3(@babel/core@7.24.5)(webpack@5.88.2): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} @@ -16230,6 +16284,45 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + requiresBuild: true + dev: false + optional: true + + /bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + requiresBuild: true + dependencies: + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.3.0 + dev: false + optional: true + + /bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + requiresBuild: true + dev: false + optional: true + + /bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + requiresBuild: true + dependencies: + bare-os: 2.4.4 + dev: false + optional: true + + /bare-stream@2.3.0: + resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} + requiresBuild: true + dependencies: + b4a: 1.6.6 + streamx: 2.20.1 + dev: false + optional: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -16358,7 +16451,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -16733,6 +16825,17 @@ packages: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} + /chromium-bidi@0.6.5(devtools-protocol@0.0.1342118): + resolution: {integrity: sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1342118 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + dev: false + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} @@ -17156,6 +17259,22 @@ packages: typescript: 5.2.2 dev: true + /cosmiconfig@9.0.0(typescript@5.5.4): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.5.4 + dev: false + /cp-file@10.0.0: resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} engines: {node: '>=14.16'} @@ -17550,6 +17669,18 @@ packages: dependencies: ms: 2.1.2 + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -17744,6 +17875,10 @@ packages: minimist: 1.2.7 dev: false + /devtools-protocol@0.0.1342118: + resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} + dev: false + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -17937,7 +18072,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true /engine.io-client@6.5.3: resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} @@ -19354,6 +19488,20 @@ packages: tmp: 0.0.33 dev: false + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.6 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: false + /extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} @@ -19375,6 +19523,10 @@ packages: engines: {node: '>=6.0.0'} dev: false + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -19437,6 +19589,12 @@ packages: format: 0.2.2 dev: true + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + /fdir@6.2.0(picomatch@4.0.2): resolution: {integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==} peerDependencies: @@ -19882,7 +20040,6 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.0 - dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -20401,6 +20558,16 @@ packages: transitivePeerDependencies: - supports-color + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + dev: false + /http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -20438,7 +20605,16 @@ packages: debug: 4.3.6 transitivePeerDependencies: - supports-color - dev: true + + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + dev: false /https@1.0.0: resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} @@ -22404,6 +22580,10 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + /mixme@0.5.4: resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} engines: {node: '>= 8.0.0'} @@ -23399,6 +23579,22 @@ packages: - supports-color dev: false + /pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.6 + get-uri: 6.0.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /pac-resolver@7.0.0: resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} engines: {node: '>= 14'} @@ -23408,6 +23604,14 @@ packages: netmask: 2.0.2 dev: false + /pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + dev: false + /package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} dev: true @@ -23467,7 +23671,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -23602,6 +23806,10 @@ packages: through2: 2.0.5 dev: true + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: false @@ -24518,6 +24726,22 @@ packages: - supports-color dev: false + /proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.2 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -24541,7 +24765,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -24559,6 +24782,41 @@ packages: resolution: {integrity: sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==} engines: {node: '>=6'} + /puppeteer-core@23.4.0: + resolution: {integrity: sha512-fqkIP5FOcb38jfBj/OcBz1wFaI9nk40uQKSORvnXws6wCbep2dg8yxZ3ddJxBIfQsxoiEOvnrykFinUScrB/ew==} + engines: {node: '>=18'} + dependencies: + '@puppeteer/browsers': 2.4.0 + chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) + debug: 4.3.7 + devtools-protocol: 0.0.1342118 + typed-query-selector: 2.12.0 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /puppeteer@23.4.0(typescript@5.5.4): + resolution: {integrity: sha512-FxgFFJI7NAsX8uebiEDSjS86vufz9TaqERQHShQT0lCbSRI3jUPEcz/0HdwLiYvfYNsc1zGjqY3NsGZya4PvUA==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + dependencies: + '@puppeteer/browsers': 2.4.0 + chromium-bidi: 0.6.5(devtools-protocol@0.0.1342118) + cosmiconfig: 9.0.0(typescript@5.5.4) + devtools-protocol: 0.0.1342118 + puppeteer-core: 23.4.0 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + dev: false + /purgecss@2.3.0: resolution: {integrity: sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==} hasBin: true @@ -24587,6 +24845,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -25987,6 +26249,12 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -26555,6 +26823,16 @@ packages: engines: {node: '>=10.0.0'} dev: false + /streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.0 + optionalDependencies: + bare-events: 2.4.2 + dev: false + /strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} dev: false @@ -27048,6 +27326,16 @@ packages: tar-stream: 2.2.0 dev: true + /tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.5 + bare-path: 2.1.3 + dev: false + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -27059,6 +27347,14 @@ packages: readable-stream: 3.6.0 dev: true + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.20.1 + dev: false + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} @@ -27187,6 +27483,12 @@ packages: commander: 2.20.3 source-map-support: 0.5.21 + /text-decoder@1.2.0: + resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} + dependencies: + b4a: 1.6.6 + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -27213,6 +27515,10 @@ packages: xtend: 4.0.2 dev: true + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: false + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -27816,6 +28122,10 @@ packages: rxjs: 7.8.1 dev: true + /typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + dev: false + /typeorm@0.3.20(pg@8.11.5)(ts-node@10.9.2): resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} engines: {node: '>=16.13.0'} @@ -27950,6 +28260,13 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: false + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -28156,6 +28473,10 @@ packages: requires-port: 1.0.0 dev: false + /urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + dev: false + /urlpattern-polyfill@9.0.0: resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} dev: false @@ -29486,6 +29807,13 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -29545,6 +29873,10 @@ packages: /zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + dev: false + /zustand@4.5.5(@types/react@18.2.69)(react@18.2.0): resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==} engines: {node: '>=12.7.0'} diff --git a/references/prisma-catalog/package.json b/references/prisma-catalog/package.json new file mode 100644 index 0000000000..74f9f3943c --- /dev/null +++ b/references/prisma-catalog/package.json @@ -0,0 +1,18 @@ +{ + "name": "references-prisma-catalog", + "private": true, + "type": "module", + "devDependencies": { + "trigger.dev": "workspace:*", + "@trigger.dev/build": "workspace:*", + "typescript": "^5.5.4", + "prisma": "5.19.0" + }, + "dependencies": { + "@trigger.dev/sdk": "workspace:*", + "@prisma/client": "5.19.0" + }, + "scripts": { + "generate:prisma": "prisma generate --sql" + } +} \ No newline at end of file diff --git a/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql b/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql new file mode 100644 index 0000000000..4af85373f9 --- /dev/null +++ b/references/prisma-catalog/prisma/migrations/20240919122925_add_initial_schema/migration.sql @@ -0,0 +1,20 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Post" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "authorId" INTEGER NOT NULL, + + CONSTRAINT "Post_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/references/prisma-catalog/prisma/migrations/migration_lock.toml b/references/prisma-catalog/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000000..fbffa92c2b --- /dev/null +++ b/references/prisma-catalog/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/references/prisma-catalog/prisma/schema.prisma b/references/prisma-catalog/prisma/schema.prisma new file mode 100644 index 0000000000..b05278b729 --- /dev/null +++ b/references/prisma-catalog/prisma/schema.prisma @@ -0,0 +1,26 @@ +generator client { + provider = "prisma-client-js" + previewFeatures = ["typedSql"] +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + directUrl = env("DIRECT_DATABASE_URL") +} + +// user.prisma +model User { + id Int @id @default(autoincrement()) + name String + posts Post[] +} + +// post.prisma +model Post { + id Int @id @default(autoincrement()) + title String + content String + authorId Int + author User @relation(fields: [authorId], references: [id]) +} diff --git a/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql b/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql new file mode 100644 index 0000000000..8f0cb3576d --- /dev/null +++ b/references/prisma-catalog/prisma/sql/getUsersWithPosts.sql @@ -0,0 +1,10 @@ +SELECT + u.id, + u.name, + COUNT(p.id) as "postCount" +FROM + "User" u + LEFT JOIN "Post" p ON u.id = p."authorId" +GROUP BY + u.id, + u.name; \ No newline at end of file diff --git a/references/prisma-catalog/src/db.ts b/references/prisma-catalog/src/db.ts new file mode 100644 index 0000000000..5e029ca062 --- /dev/null +++ b/references/prisma-catalog/src/db.ts @@ -0,0 +1,6 @@ +import { PrismaClient } from "@prisma/client"; +import { getUsersWithPosts } from "@prisma/client/sql"; + +export const prisma = new PrismaClient(); + +export { getUsersWithPosts }; diff --git a/references/prisma-catalog/src/trigger/dbTasks.ts b/references/prisma-catalog/src/trigger/dbTasks.ts new file mode 100644 index 0000000000..7edb466019 --- /dev/null +++ b/references/prisma-catalog/src/trigger/dbTasks.ts @@ -0,0 +1,21 @@ +import { getUsersWithPosts, prisma } from "../db.js"; +import { logger, task } from "@trigger.dev/sdk/v3"; + +export const prismaTask = task({ + id: "prisma-task", + run: async () => { + const users = await prisma.user.findMany(); + + await prisma.user.create({ + data: { + name: "Alice", + }, + }); + + const usersWithPosts = await prisma.$queryRawTyped(getUsersWithPosts()); + + logger.info("Users with posts", { usersWithPosts }); + + return users; + }, +}); diff --git a/references/prisma-catalog/trigger.config.ts b/references/prisma-catalog/trigger.config.ts new file mode 100644 index 0000000000..1bbf0eb2cd --- /dev/null +++ b/references/prisma-catalog/trigger.config.ts @@ -0,0 +1,26 @@ +import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + runtime: "node", + project: "proj_mpzmrzygzbvmfjnnpcsk", + retries: { + enabledInDev: false, + default: { + maxAttempts: 3, + minTimeoutInMs: 5_000, + maxTimeoutInMs: 30_000, + factor: 2, + randomize: true, + }, + }, + build: { + extensions: [ + prismaExtension({ + schema: "prisma/schema.prisma", + directUrlEnvVarName: "DIRECT_DATABASE_URL", + typedSql: true, + }), + ], + }, +}); diff --git a/references/prisma-catalog/tsconfig.json b/references/prisma-catalog/tsconfig.json new file mode 100644 index 0000000000..9a5ee0b9d6 --- /dev/null +++ b/references/prisma-catalog/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2023", + "module": "Node16", + "moduleResolution": "Node16", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "customConditions": ["@triggerdotdev/source"], + "jsx": "preserve", + "lib": ["DOM", "DOM.Iterable"], + "noEmit": true + }, + "include": ["./src/**/*.ts", "trigger.config.ts"] +} diff --git a/references/v3-catalog/package.json b/references/v3-catalog/package.json index 26f9872829..fdbf5c09db 100644 --- a/references/v3-catalog/package.json +++ b/references/v3-catalog/package.json @@ -16,7 +16,6 @@ "generate:prisma": "prisma generate --sql" }, "dependencies": { - "fluent-ffmpeg": "^2.1.3", "@infisical/sdk": "^2.1.9", "@opentelemetry/api": "1.4.1", "@prisma/client": "5.19.0", @@ -32,11 +31,13 @@ "dotenv": "^16.4.5", "email-reply-parser": "^1.8.0", "execa": "^8.0.1", + "fluent-ffmpeg": "^2.1.3", "header-generator": "^2.1.55", "kysely": "^0.27.4", "msw": "^2.2.1", "openai": "^4.47.0", "pg": "^8.11.5", + "puppeteer": "^23.4.0", "react": "19.0.0-rc.0", "react-email": "^3.0.1", "reflect-metadata": "^0.1.13", @@ -65,9 +66,9 @@ "@opentelemetry/semantic-conventions": "^1.22.0", "@trigger.dev/build": "workspace:*", "@types/email-reply-parser": "^1.4.2", + "@types/fluent-ffmpeg": "^2.1.26", "@types/node": "20.4.2", "@types/react": "^18.3.1", - "@types/fluent-ffmpeg": "^2.1.26", "esbuild": "^0.19.11", "prisma": "5.19.0", "prisma-kysely": "^1.8.0", diff --git a/references/v3-catalog/src/trigger/puppeteerTask.ts b/references/v3-catalog/src/trigger/puppeteerTask.ts new file mode 100644 index 0000000000..362179898d --- /dev/null +++ b/references/v3-catalog/src/trigger/puppeteerTask.ts @@ -0,0 +1,16 @@ +import { task } from "@trigger.dev/sdk/v3"; +import puppeteer from "puppeteer"; + +export const puppeteerTask = task({ + id: "puppeteer-task", + machine: { + preset: "large-1x" + }, + run: async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + await page.goto("https://google.com"); + await page.screenshot({ path: "screenshot.png" }); + await browser.close(); + }, +}); diff --git a/references/v3-catalog/trigger.config.ts b/references/v3-catalog/trigger.config.ts index 9f9b3554cb..36d5f7bab9 100644 --- a/references/v3-catalog/trigger.config.ts +++ b/references/v3-catalog/trigger.config.ts @@ -4,6 +4,7 @@ import { OpenAIInstrumentation } from "@traceloop/instrumentation-openai"; import { esbuildPlugin } from "@trigger.dev/build"; import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; import { ffmpeg, syncEnvVars } from "@trigger.dev/build/extensions/core"; +import { puppeteer } from "@trigger.dev/build/extensions/puppeteer"; import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; import { defineConfig } from "@trigger.dev/sdk/v3"; @@ -79,6 +80,7 @@ export default defineConfig({ value: secret.secretValue, })); }), + puppeteer(), ], external: ["re2"], }, From 34eae9a4a7c3fcdd996dece603c42d0bd950bfc1 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Thu, 19 Sep 2024 16:47:35 +0100 Subject: [PATCH 4/4] Copy tweak --- docs/examples/intro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/intro.mdx b/docs/examples/intro.mdx index 3097647b7b..7de0967a27 100644 --- a/docs/examples/intro.mdx +++ b/docs/examples/intro.mdx @@ -9,7 +9,7 @@ description: "Learn how to use Trigger.dev with these practical task examples." | [DALL·E 3 image generation](/examples/dall-e3-generate-image) | Use OpenAI's GPT-4o and DALL·E 3 to generate an image and text. | | [FFmpeg video processing](/examples/ffmpeg-video-processing) | Use FFmpeg to process a video in various ways and save it to Cloudflare R2. | | [OpenAI with retrying](/examples/open-ai-with-retrying) | Create a reusable OpenAI task with custom retry options. | -| [PDF to image](/examples/pdf-to-image) | Use `MuPDF` to turn a PDF into an image and save it to Cloudflare R2. | +| [PDF to image](/examples/pdf-to-image) | Use `MuPDF` to turn a PDF into images and save them to Cloudflare R2. | | [React to PDF](/examples/react-pdf) | Use `react-pdf` to generate a PDF and save it to Cloudflare R2. | | [Resend email sequence](/examples/resend-email-sequence) | Send a sequence of emails over several days using Resend with Trigger.dev. | | [Sharp image processing](/examples/sharp-image-processing) | Use Sharp to process an image and save it to Cloudflare R2. |