From f8078467152ca7e9dee1b6ef2a1aff169b032951 Mon Sep 17 00:00:00 2001 From: Luiz Gustavo Abou Hatem de Liz Date: Thu, 28 May 2026 10:50:43 -0300 Subject: [PATCH 1/2] feat: replace deployment shell scripts with TypeScript/Node alternatives (COW-977) Replace manage.sh, deploy-remotely.sh, and static/start-db.sh with tsx scripts and inline compose config. Adds deploy:up/down/remote pnpm scripts. Co-Authored-By: Claude Sonnet 4.6 --- deployment/deploy-remotely.sh | 53 ------ deployment/deploy-remotely.ts | 124 ++++++++++++++ deployment/docker-compose.yml | 20 ++- deployment/manage.sh | 93 ----------- deployment/manage.ts | 209 ++++++++++++++++++++++++ deployment/static/start-db.sh | 36 ----- package.json | 6 +- pnpm-lock.yaml | 294 +++++++++++++++++++++++++++++++++- 8 files changed, 644 insertions(+), 191 deletions(-) delete mode 100755 deployment/deploy-remotely.sh create mode 100644 deployment/deploy-remotely.ts delete mode 100755 deployment/manage.sh create mode 100644 deployment/manage.ts delete mode 100755 deployment/static/start-db.sh diff --git a/deployment/deploy-remotely.sh b/deployment/deploy-remotely.sh deleted file mode 100755 index e06d0f7..0000000 --- a/deployment/deploy-remotely.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash -set -exo pipefail - -REPO_ROOT_DIR=$(git rev-parse --show-toplevel) -APP_REVISION=$(git rev-parse --short HEAD) - -DEPLOY_TARGET="${1:-}" -ENV_FILE_PATH="${2:-.env}" - -if [[ -z "$DEPLOY_TARGET" ]]; then - echo "Usage: $0 [env_file_path]" - exit 1 -fi - -if [[ "$DEPLOY_TARGET" == "-" ]]; then - # Local deployment - TARGET_DEPLOY_DIR="$REPO_ROOT_DIR" - APP_DEPLOY_DIR="$TARGET_DEPLOY_DIR/deployment" - - bash "$APP_DEPLOY_DIR/manage.sh" ${MANAGE_CMD_OVERRIDE:-up} \ - --env-file "$ENV_FILE_PATH" \ - --revision "$APP_REVISION" -elif [[ "$DEPLOY_TARGET" =~ ^[^:]+:.+ ]]; then - # Remote deployment via SSH - SSH_HOST=$(echo "$DEPLOY_TARGET" | cut -d':' -f1) - REMOTE_PATH=$(echo "$DEPLOY_TARGET" | cut -d':' -f2-) - - # Sync repository to remote - # .env is excluded — copied separately via scp to preserve server secrets - rsync -avz --delete \ - --mkpath \ - --exclude='.git' \ - --exclude='node_modules' \ - --exclude='.env' \ - --exclude='.env.local' \ - --exclude='.vite' \ - --exclude='*.log' \ - --exclude='tmp/' \ - "$REPO_ROOT_DIR/" "$SSH_HOST:$REMOTE_PATH/" - - # Copy .env to deployment directory on remote (separate from rsync) - REMOTE_ENV_PATH="$REMOTE_PATH/deployment/.env" - scp "$ENV_FILE_PATH" "$SSH_HOST:$REMOTE_ENV_PATH" - - APP_DEPLOY_DIR="$REMOTE_PATH/deployment" - MANAGE_CMD="${MANAGE_CMD_OVERRIDE:-up}" - - # Run manage.sh on remote - ssh "$SSH_HOST" "cd $APP_DEPLOY_DIR && bash manage.sh $MANAGE_CMD --env-file .env --revision $APP_REVISION" -else - echo "Error: must be '-' or SSH_HOST:PATH" - exit 1 -fi diff --git a/deployment/deploy-remotely.ts b/deployment/deploy-remotely.ts new file mode 100644 index 0000000..1d315b8 --- /dev/null +++ b/deployment/deploy-remotely.ts @@ -0,0 +1,124 @@ +#!/usr/bin/env tsx +/** + * deploy-remotely.ts — rsync + SSH deploy or local deploy. + * Replaces deploy-remotely.sh. + * + * Usage: + * npx tsx deployment/deploy-remotely.ts [env_file_path] + * + * deploy_target: + * - Local deployment (runs manage.ts in this repo) + * host:path Remote deployment via SSH (rsync + scp + ssh) + * + * Note: Remote deployment requires Node 18+ and pnpm installed on the remote host. + * Run `pnpm install` on the remote after the first deploy to install tsx. + */ + +import { spawnSync } from "node:child_process"; +import { resolve } from "node:path"; + +function run( + cmd: string, + args: string[], + opts: { cwd?: string; ignoreError?: boolean } = {} +): void { + console.log(`+ ${cmd} ${args.join(" ")}`); + const result = spawnSync(cmd, args, { + stdio: "inherit", + cwd: opts.cwd, + }); + if (!opts.ignoreError && result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +function runCapture(cmd: string, args: string[]): string { + const result = spawnSync(cmd, args, { encoding: "utf-8" }); + if (result.status !== 0) { + console.error(`Command failed: ${cmd} ${args.join(" ")}`); + console.error(result.stderr); + process.exit(result.status ?? 1); + } + return result.stdout.trim(); +} + +function usage(): never { + console.error( + `Usage: tsx deployment/deploy-remotely.ts [env_file_path] + + deploy_target: + - Local deployment + host:path Remote deployment via SSH + + env_file_path: path to .env file (default: .env) +` + ); + process.exit(1); +} + +const [deployTarget, envFilePath = ".env"] = process.argv.slice(2); + +if (!deployTarget) { + usage(); +} + +const appRevision = runCapture("git", ["rev-parse", "--short", "HEAD"]); +const repoRootDir = runCapture("git", ["rev-parse", "--show-toplevel"]); +const manageCmd = process.env["MANAGE_CMD_OVERRIDE"] ?? "up"; + +if (deployTarget === "-") { + // Local deployment + const absoluteEnvFile = resolve(envFilePath); + run( + "npx", + [ + "tsx", + "deployment/manage.ts", + manageCmd, + "--env-file", + absoluteEnvFile, + "--revision", + appRevision, + ], + { cwd: repoRootDir } + ); +} else if (/^[^:]+:.+/.test(deployTarget)) { + // Remote deployment via SSH + const colonIdx = deployTarget.indexOf(":"); + const sshHost = deployTarget.slice(0, colonIdx); + const remotePath = deployTarget.slice(colonIdx + 1); + + // rsync repo to remote host + run("rsync", [ + "-avz", + "--delete", + "--mkpath", + "--exclude=.git", + "--exclude=node_modules", + "--exclude=.env", + "--exclude=.env.local", + "--exclude=.vite", + "--exclude=*.log", + "--exclude=tmp/", + `${repoRootDir}/`, + `${sshHost}:${remotePath}/`, + ]); + + // Copy env file to remote deployment directory + const remoteEnvPath = `${remotePath}/deployment/.env`; + run("scp", [envFilePath, `${sshHost}:${remoteEnvPath}`]); + + // Run manage.ts on the remote host + // Note: The remote host must have Node 18+ and pnpm installed. + // After the first deploy, run `pnpm install` on the remote to install tsx. + const remoteDeployDir = `${remotePath}/deployment`; + run("ssh", [ + sshHost, + `cd ${remoteDeployDir} && npx tsx manage.ts ${manageCmd} --env-file .env --revision ${appRevision}`, + ]); +} else { + console.error( + "Error: must be '-' (local) or SSH_HOST:PATH (remote)" + ); + usage(); +} diff --git a/deployment/docker-compose.yml b/deployment/docker-compose.yml index 3eea2fc..4ae9389 100644 --- a/deployment/docker-compose.yml +++ b/deployment/docker-compose.yml @@ -2,18 +2,32 @@ services: postgres: image: postgres:16 restart: unless-stopped - command: ["bash", "/start-db.sh"] + # Memory tuning values are computed for the default POSTGRES_MEMORY_LIMIT=1G (1024 MB): + # shared_buffers = 20% of 1024 MB = 204 MB + # maintenance_work_mem = 5% of 1024 MB = 51 MB + # effective_cache_size = 50% of 1024 MB = 512 MB + # work_mem = 25% of 1024 MB / 100 connections = 2 MB + # To adjust for a different memory limit, change the -c flags proportionally. + command: >- + postgres + -c max_connections=100 + -c shared_buffers=204MB + -c work_mem=2MB + -c maintenance_work_mem=51MB + -c effective_cache_size=512MB + -c max_wal_size=1GB + -c min_wal_size=256MB + -c checkpoint_completion_target=0.9 + -c wal_buffers=8MB environment: POSTGRES_DB: ${POSTGRES_DB:?error} POSTGRES_USER: ${POSTGRES_USER:?error} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?error} - POSTGRES_MEMORY_LIMIT: ${POSTGRES_MEMORY_LIMIT:-1G} POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=en_US.UTF-8" shm_size: 256m ports: - "${POSTGRES_PORT:-5433}:5432" volumes: - - ./static/start-db.sh:/start-db.sh:ro - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] diff --git a/deployment/manage.sh b/deployment/manage.sh deleted file mode 100755 index 99d24c6..0000000 --- a/deployment/manage.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -usage() { - cat < [options] - -Commands: - up Deploy the stack - down Tear down the stack - -Options: - -e, --env-file Path to .env file (required) - -r, --revision Application revision (required for 'up') - -h, --help Show this help message -EOF - exit 1 -} - -COMMAND="${1:-}" -shift || true - -ENV_FILE_PATH="" -APP_REVISION="" - -while [[ $# -gt 0 ]]; do - case "$1" in - -e|--env-file) ENV_FILE_PATH="$2"; shift 2 ;; - -r|--revision) APP_REVISION="$2"; shift 2 ;; - -h|--help) usage ;; - *) echo "Unknown option: $1"; usage ;; - esac -done - -if [[ -z "$COMMAND" ]]; then echo "Error: command required (up|down)"; usage; fi -if [[ -z "$ENV_FILE_PATH" ]]; then echo "Error: --env-file required"; usage; fi - -APP_DEPLOY_DIR="$(dirname "$(realpath "$0")")" -cd "$APP_DEPLOY_DIR" - -set -a -source "$ENV_FILE_PATH" -set +a - -if [[ -z "${PROJECT_PREFIX:-}" ]]; then - echo "Error: PROJECT_PREFIX must be set in the env file" - exit 1 -fi - -export PROJECT_PREFIX -export APP_REVISION="${APP_REVISION:-latest}" -export DATABASE_SCHEMA="programmatic_orders" - -cmd_up() { - if [[ -z "${APP_REVISION:-}" || "$APP_REVISION" == "latest" ]]; then - echo "Error: --revision is required for 'up'" - exit 1 - fi - - echo ">>> Building ponder image..." - docker compose \ - -p "${PROJECT_PREFIX}" -f docker-compose.yml \ - build --no-cache - - echo ">>> Deploying (DATABASE_SCHEMA=${DATABASE_SCHEMA})..." - docker compose \ - -p "${PROJECT_PREFIX}" -f docker-compose.yml \ - up -d --remove-orphans - - echo ">>> Cleaning up old ponder images..." - IMAGE_NAME="${PROJECT_PREFIX}-ponder" - OLD_IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}" "$IMAGE_NAME" | grep -v ":${APP_REVISION}$" || true) - if [[ -n "$OLD_IMAGES" ]]; then - echo "$OLD_IMAGES" | xargs -r docker rmi 2>/dev/null || true - fi - docker image prune -f 2>/dev/null || true - docker container prune -f 2>/dev/null || true - - echo ">>> Deploy complete." -} - -cmd_down() { - echo ">>> Stopping stack..." - docker compose \ - -p "${PROJECT_PREFIX}" -f docker-compose.yml \ - down -v --remove-orphans || true -} - -case "$COMMAND" in - up) cmd_up ;; - down) cmd_down ;; - *) echo "Unknown command: $COMMAND"; usage ;; -esac diff --git a/deployment/manage.ts b/deployment/manage.ts new file mode 100644 index 0000000..7db65f4 --- /dev/null +++ b/deployment/manage.ts @@ -0,0 +1,209 @@ +#!/usr/bin/env tsx +/** + * manage.ts — orchestrates `docker compose` up/down for the deploy stack. + * Replaces manage.sh. + * + * Usage: + * npx tsx deployment/manage.ts --env-file [--revision ] + */ + +import { readFileSync } from "node:fs"; +import { resolve, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawnSync } from "node:child_process"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +function usage(): never { + console.error(`Usage: tsx deployment/manage.ts [options] + +Commands: + up Deploy the stack + down Tear down the stack + +Options: + -e, --env-file Path to .env file (required) + -r, --revision Application revision (required for 'up') + -h, --help Show this help message +`); + process.exit(1); +} + +function parseArgs(args: string[]): { + command: string; + envFile: string; + revision: string; +} { + const [command, ...rest] = args; + + if (!command || command === "--help" || command === "-h") { + usage(); + } + + let envFile = ""; + let revision = "latest"; + + for (let i = 0; i < rest.length; i++) { + const arg = rest[i]; + if (arg === "-e" || arg === "--env-file") { + envFile = rest[++i] ?? ""; + } else if (arg === "-r" || arg === "--revision") { + revision = rest[++i] ?? "latest"; + } else if (arg === "-h" || arg === "--help") { + usage(); + } else { + console.error(`Unknown option: ${arg}`); + usage(); + } + } + + if (!envFile) { + console.error("Error: --env-file required"); + usage(); + } + + return { command, envFile, revision }; +} + +function loadEnvFile(envFilePath: string): void { + const absolutePath = resolve(envFilePath); + const content = readFileSync(absolutePath, "utf-8"); + + for (const line of content.split("\n")) { + const trimmed = line.trim(); + // Skip comments and empty lines + if (!trimmed || trimmed.startsWith("#")) continue; + + const eqIdx = trimmed.indexOf("="); + if (eqIdx === -1) continue; + + const key = trimmed.slice(0, eqIdx).trim(); + let value = trimmed.slice(eqIdx + 1).trim(); + + // Strip surrounding quotes + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1); + } + + if (key) { + process.env[key] = value; + } + } +} + +function run( + cmd: string, + args: string[], + opts: { cwd?: string; ignoreError?: boolean } = {} +): void { + console.log(`+ ${cmd} ${args.join(" ")}`); + const result = spawnSync(cmd, args, { + stdio: "inherit", + cwd: opts.cwd ?? __dirname, + }); + if (!opts.ignoreError && result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +function cmdUp(projectPrefix: string, revision: string): void { + if (!revision || revision === "latest") { + console.error("Error: --revision is required for 'up'"); + process.exit(1); + } + + run("docker", [ + "compose", + "-p", + projectPrefix, + "-f", + "docker-compose.yml", + "build", + "--no-cache", + ]); + + run("docker", [ + "compose", + "-p", + projectPrefix, + "-f", + "docker-compose.yml", + "up", + "-d", + "--remove-orphans", + ]); + + // Prune old images for this project + const imageName = `${projectPrefix}-ponder`; + const listResult = spawnSync( + "docker", + ["images", "--format", "{{.Repository}}:{{.Tag}}", imageName], + { encoding: "utf-8", cwd: __dirname } + ); + + if (listResult.status === 0 && listResult.stdout) { + const oldImages = listResult.stdout + .trim() + .split("\n") + .filter((img) => img && !img.endsWith(`:${revision}`)); + + for (const img of oldImages) { + run("docker", ["rmi", img], { ignoreError: true }); + } + } + + run("docker", ["image", "prune", "-f"], { ignoreError: true }); + run("docker", ["container", "prune", "-f"], { ignoreError: true }); + + console.log(">>> Deploy complete."); +} + +function cmdDown(projectPrefix: string): void { + run( + "docker", + [ + "compose", + "-p", + projectPrefix, + "-f", + "docker-compose.yml", + "down", + "-v", + "--remove-orphans", + ], + { ignoreError: true } + ); +} + +// ---- main ---- + +const { command, envFile, revision } = parseArgs(process.argv.slice(2)); + +loadEnvFile(envFile); + +// Hardcoded per project convention +process.env["DATABASE_SCHEMA"] = "programmatic_orders"; + +const projectPrefix = process.env["PROJECT_PREFIX"]; +if (!projectPrefix) { + console.error("Error: PROJECT_PREFIX must be set in the env file"); + process.exit(1); +} + +const appRevision = revision !== "latest" ? revision : process.env["APP_REVISION"] ?? "latest"; +process.env["APP_REVISION"] = appRevision; + +switch (command) { + case "up": + cmdUp(projectPrefix, appRevision); + break; + case "down": + cmdDown(projectPrefix); + break; + default: + console.error(`Unknown command: ${command}`); + usage(); +} diff --git a/deployment/static/start-db.sh b/deployment/static/start-db.sh deleted file mode 100755 index 3207dfc..0000000 --- a/deployment/static/start-db.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -POSTGRES_MAX_CONNECTIONS="${POSTGRES_MAX_CONNECTIONS:-100}" - -if [ -n "${POSTGRES_MEMORY_LIMIT:-}" ]; then - LIMIT_BYTES=$(numfmt --from=iec "${POSTGRES_MEMORY_LIMIT}" 2>/dev/null) - if [ -z "$LIMIT_BYTES" ] || [ "$LIMIT_BYTES" = "0" ]; then - echo "Error: Invalid POSTGRES_MEMORY_LIMIT value: $POSTGRES_MEMORY_LIMIT" >&2 - exit 1 - fi - TOTAL_RAM_MB=$((LIMIT_BYTES / 1024 / 1024)) -else - TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') - TOTAL_RAM_MB=$((TOTAL_RAM_KB / 1024)) -fi - -SHARED_BUFFERS_MB=$((TOTAL_RAM_MB * 20 / 100)) -MAINTENANCE_WORK_MEM_MB=$((TOTAL_RAM_MB * 5 / 100)) -EFFECTIVE_CACHE_SIZE_MB=$((TOTAL_RAM_MB / 2)) -WORK_MEM_MB=$(( (TOTAL_RAM_MB * 25 / 100) / POSTGRES_MAX_CONNECTIONS )) - -if [ "$WORK_MEM_MB" -lt 1 ]; then WORK_MEM_MB=1; fi -if [ "$SHARED_BUFFERS_MB" -lt 32 ]; then SHARED_BUFFERS_MB=32; fi -if [ "$MAINTENANCE_WORK_MEM_MB" -lt 16 ]; then MAINTENANCE_WORK_MEM_MB=16; fi - -set -x -exec docker-entrypoint.sh \ - -c "max_connections=${POSTGRES_MAX_CONNECTIONS}" \ - -c "shared_buffers=${SHARED_BUFFERS_MB}MB" \ - -c "work_mem=${WORK_MEM_MB}MB" \ - -c "maintenance_work_mem=${MAINTENANCE_WORK_MEM_MB}MB" \ - -c "effective_cache_size=${EFFECTIVE_CACHE_SIZE_MB}MB" \ - -c "max_wal_size=1GB" \ - -c "min_wal_size=256MB" \ - -c "checkpoint_completion_target=0.9" \ - -c "wal_buffers=8MB" diff --git a/package.json b/package.json index 257684c..7bad8da 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,10 @@ "codegen": "ponder codegen", "lint": "eslint . --ext .ts", "typecheck": "tsc", - "test": "vitest run" + "test": "vitest run", + "deploy:up": "tsx deployment/manage.ts up", + "deploy:down": "tsx deployment/manage.ts down", + "deploy:remote": "tsx deployment/deploy-remotely.ts" }, "dependencies": { "@cowprotocol/cow-sdk": "^7.3.8", @@ -26,6 +29,7 @@ "@types/node": "^20.9.0", "eslint": "^8.53.0", "eslint-config-ponder": "^0.16.2", + "tsx": "^4.0.0", "typescript": "^5.2.2", "vite": "^6.0.0", "vite-tsconfig-paths": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d208fca..d9206a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,15 +42,18 @@ importers: eslint-config-ponder: specifier: ^0.16.2 version: 0.16.3(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + tsx: + specifier: ^4.0.0 + version: 4.22.3 typescript: specifier: ^5.2.2 version: 5.9.3 vite: specifier: ^6.0.0 - version: 6.4.1(@types/node@20.19.35)(yaml@2.8.3) + version: 6.4.1(@types/node@20.19.35)(tsx@4.22.3)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.0.0 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.35)(yaml@2.8.3)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.35)(tsx@4.22.3)(yaml@2.8.3)) vitest: specifier: ^2.0.0 version: 2.1.9(@types/node@20.19.35) @@ -149,6 +152,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -161,6 +170,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -173,6 +188,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -185,6 +206,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -197,6 +224,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -209,6 +242,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -221,6 +260,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -233,6 +278,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -245,6 +296,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -257,6 +314,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -269,6 +332,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -281,6 +350,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -293,6 +368,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -305,6 +386,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -317,6 +404,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -329,6 +422,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -341,12 +440,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -359,12 +470,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -377,12 +500,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -395,6 +530,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -407,6 +548,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -419,6 +566,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -431,6 +584,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@escape.tech/graphql-armor-max-aliases@2.6.2': resolution: {integrity: sha512-SDk7pAzY6gutsdZ3NlyY55RrytrCPxJJxSN/DBfIGKphTrfBvKQWTnioQ9OlLP9kPjCE6XM5UWwGt7uqbpKSYA==} engines: {node: '>=18.0.0'} @@ -1336,6 +1495,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2385,6 +2549,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2446,6 +2615,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true validate-npm-package-license@3.0.4: @@ -2792,147 +2962,225 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.25.12': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.25.12': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.12': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.12': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.12': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.12': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.12': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.12': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.12': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.25.12': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.12': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.12': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.12': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.25.12': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@escape.tech/graphql-armor-max-aliases@2.6.2': dependencies: graphql: 16.13.0 @@ -3806,6 +4054,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escape-string-regexp@4.0.0: {} eslint-config-ponder@0.16.3(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): @@ -4954,6 +5231,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.22.3: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5070,13 +5353,13 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.35)(yaml@2.8.3)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@20.19.35)(tsx@4.22.3)(yaml@2.8.3)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@20.19.35)(yaml@2.8.3) + vite: 6.4.1(@types/node@20.19.35)(tsx@4.22.3)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript @@ -5090,7 +5373,7 @@ snapshots: '@types/node': 20.19.35 fsevents: 2.3.3 - vite@6.4.1(@types/node@20.19.35)(yaml@2.8.3): + vite@6.4.1(@types/node@20.19.35)(tsx@4.22.3)(yaml@2.8.3): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -5101,6 +5384,7 @@ snapshots: optionalDependencies: '@types/node': 20.19.35 fsevents: 2.3.3 + tsx: 4.22.3 yaml: 2.8.3 vitest@2.1.9(@types/node@20.19.35): From a0dde977aae6c60d5ddeb64621e9126458b174fd Mon Sep 17 00:00:00 2001 From: Luiz Gustavo Abou Hatem de Liz Date: Thu, 28 May 2026 17:44:34 -0300 Subject: [PATCH 2/2] docs: add bleu-context note to deployment scripts (COW-977) Clarify that manage.ts and deploy-remotely.ts are tailored to Bleu's internal deployment workflow, as requested in PR review. Co-Authored-By: Claude Sonnet 4.6 --- deployment/deploy-remotely.ts | 4 ++++ deployment/manage.ts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/deployment/deploy-remotely.ts b/deployment/deploy-remotely.ts index 1d315b8..37c9a53 100644 --- a/deployment/deploy-remotely.ts +++ b/deployment/deploy-remotely.ts @@ -3,6 +3,10 @@ * deploy-remotely.ts — rsync + SSH deploy or local deploy. * Replaces deploy-remotely.sh. * + * NOTE: This script is specific to Bleu's internal deployment workflow. + * It assumes a particular server layout and SSH setup. Adapt as needed for + * your own hosting environment. + * * Usage: * npx tsx deployment/deploy-remotely.ts [env_file_path] * diff --git a/deployment/manage.ts b/deployment/manage.ts index 7db65f4..f1097a3 100644 --- a/deployment/manage.ts +++ b/deployment/manage.ts @@ -3,6 +3,9 @@ * manage.ts — orchestrates `docker compose` up/down for the deploy stack. * Replaces manage.sh. * + * NOTE: This script is specific to Bleu's internal deployment workflow. + * Adapt the paths and docker compose arguments as needed for your own setup. + * * Usage: * npx tsx deployment/manage.ts --env-file [--revision ] */