From 9fd913b846d2a05b805b6ac29481f15e898fea4b Mon Sep 17 00:00:00 2001 From: Jonathan Alvarez Date: Thu, 12 Dec 2024 02:15:57 -0500 Subject: [PATCH] add fly deploy Signed-off-by: Jonathan Alvarez --- .dockerignore | 43 +++++++++++ .github/workflows/fly-deploy.yml | 22 ++++++ Dockerfile | 60 +++++++++++++++ README.FLY_DEPLOY.md | 89 ++++++++++++++++++++++ app/bookmarks/page.tsx | 1 - fly-db/fly.toml | 77 +++++++++++++++++++ fly.toml | 22 ++++++ next.config.ts | 3 + package.json | 1 + pnpm-lock.yaml | 123 +++++++++++++++++++++++++++++++ 10 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/fly-deploy.yml create mode 100644 Dockerfile create mode 100644 README.FLY_DEPLOY.md create mode 100644 fly-db/fly.toml create mode 100644 fly.toml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..83972b6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Sentry Config File +.env.sentry-build-plugin diff --git a/.github/workflows/fly-deploy.yml b/.github/workflows/fly-deploy.yml new file mode 100644 index 0000000..30dece7 --- /dev/null +++ b/.github/workflows/fly-deploy.yml @@ -0,0 +1,22 @@ +# See https://fly.io/docs/app-guides/continuous-deployment-with-github-actions/ + +name: Fly Deploy +on: + push: + branches: + - main +jobs: + deploy: + name: Deploy app + runs-on: ubuntu-latest + concurrency: deploy-group # optional: ensure only one action runs at a time + steps: + - uses: actions/checkout@v4 + - uses: superfly/flyctl-actions/setup-flyctl@master + - run: flyctl deploy --remote-only + env: + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + POSTGRESQL_ENDPOINT: ${{ POSTGRESQL_ENDPOINT }} + SESSION_SECRET: ${{ SESSION_SECRET }} + LAUNCHDARKLY_SDK_KEY: ${{ LAUNCHDARKLY_SDK_KEY }} + SENTRY_DSN: ${{ SENTRY_DSN }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8f70dc5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +# syntax = docker/dockerfile:1 + +# Adjust NODE_VERSION as desired +ARG NODE_VERSION=20.12.2 +FROM node:${NODE_VERSION}-slim as base + +LABEL fly_launch_runtime="Next.js" + +# Next.js app lives here +WORKDIR /app + +# Set production environment +ENV NODE_ENV="production" + +ARG POSTGRESQL_ENDPOINT="" +ARG SESSION_SECRET="" +ARG LAUNCHDARKLY_SDK_KEY="" +ARG SENTRY_DSN="" + +ENV POSTGRESQL_ENDPOINT=${POSTGRESQL_ENDPOINT} +ENV SESSION_SECRET=${SESSION_SECRET} +ENV LAUNCHDARKLY_SDK_KEY=${LAUNCHDARKLY_SDK_KEY} +ENV SENTRY_DSN=${SENTRY_DSN} + + +# Install pnpm +ARG PNPM_VERSION=9.14.4 +RUN npm install -g pnpm@$PNPM_VERSION + + +# Throw-away build stage to reduce size of final image +FROM base as build + +# Install packages needed to build node modules +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3 + +# Install node modules +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile --prod=false + +# Copy application code +COPY . . + +# Build application +RUN pnpm run build + +# Remove development dependencies +RUN pnpm prune --prod + + +# Final stage for app image +FROM base + +# Copy built application +COPY --from=build /app /app + +# Start the server by default, this can be overwritten at runtime +EXPOSE 3000 +CMD [ "pnpm", "run", "start" ] diff --git a/README.FLY_DEPLOY.md b/README.FLY_DEPLOY.md new file mode 100644 index 0000000..816c6f8 --- /dev/null +++ b/README.FLY_DEPLOY.md @@ -0,0 +1,89 @@ +# Deploy en Fly.io + +Esta página detalla puntos que se deben de tener en cuenta para desplegar una aplicación de Next.js con PostreSQL utilizando [Fly.io](https://fly.io) + +1. Crear tu cuenta en Fly.io + + Necesitarás agregar una tarjeta de crédito para esto. Te recomendamos activar las opciones de 2FA y utilizar contraseñas fuertes. + +2. Creación de maquinas y bases de datos. + + Desde la raíz del proyecto y luego de [instalar `flyctl`](https://fly.io/docs/flyctl/install/): + + ```bash + fly launch + ``` + + Fly detectará que se trata de un proyecto de Next.js y dará una opción para configurar las opciones del proyecto. + + En las opciones, debemos especificar que queremos una Base de Datos de tipo PostgreSQL. + + Fly creará la base de datos y la adjuntará a nuestra app. Así mismo creará un archivo de `Dockerfile` y de `fly.toml`. + + Debido a que nuestro proyecto depende de otros secretos (ver `env.example`), `fly launch` fallará pero nos servirá como base para continuar. + +3. Base de datos pública + + La base de datos que se crea por defecto es privada. Debido que utilizaremos esta misma base de datos para otros servicios (Clase de Despliegue en Cloudflare), la haremos pública. + + Completa la guia de Fly.io de [External Connections](https://fly.io/docs/postgres/connecting/connecting-external/) + + Es importante resaltar que la IP a asignar debe de ser de tipo IPV4 y dedicada. Esta IP tendrá un costo de 2 USD/ mensual. + + El archivo de configuración de la DB, se guardó en este proyecto dentro de la carpeta [`fly-db`](./fly-db) + + Aségurate de que este archivo tenga la siguiente sección: + + ```toml + [http_service] + internal_port = 5432 + force_https = true + auto_stop_machines = 'stop' + auto_start_machines = true + min_machines_running = 0 + processes = ['app'] + ``` + + Esto evitará el error de configuración de: + + > WARNING The app is not listening on the expected address and will not be reachable by fly-proxy. + > You can fix this by configuring your app to listen on the following addresses: + > + > - 0.0.0.0:3000 + + Aplica los cambios haciendo deploy como se indica en el articulo. + + La base de datos debería ahora ser accesible de la forma: + + ``` + psql "postgres://postgres:@.fly.dev" + ``` + +4. Preparar la DB + + Accede a la base de datos utilizando la URL de arriba o creando un proxy local para crear las bases de datos y tablas según sea necesario: + + - La mini app de `expenses` requiere DB y tabla. Ver `app/expenses-tracker/README.md` + - La mini app de `bookmarks` requiere que corras el comando de `pnpm bookmarks:db:push` y alternativamente `pnpm bookmarks:db:populate`. Asegúrate que la configuración en `drizzle.config.ts` sea correcta. + +5. Configurar secretos + + Los secretos de nuestra app (`env.example`) debemos configurarlos en dos partes. + + La primera en el Dashboard de Fly.io. Y la segunda dentro de Docker. + + La diferencia es que los secretos dentro Fly.io son usados durante tiempo de ejecución de la app (runtime). Sin embargo, Docker y nuestro build también los necesita, por tanto debemos especificarlos también. + + Estos se secretos se pueden pasar con [`fly deploy --build-secrets`](https://fly.io/docs/apps/build-secrets/#main-content-start). O, recomendado, proveer a través de GitHub Actions a Docker. + + En nuestro repo se ha dejado como referencia lo segundo. Ver `Dockerfile` y `.github/workflows/fly-deploy.yml` + +6. Deploy + + Solo resta hacer deploy de la app + + ```bash + fly deploy + ``` + + Si todo sale bien, la app estará disponible en Fly.io diff --git a/app/bookmarks/page.tsx b/app/bookmarks/page.tsx index fc56f91..224bf91 100644 --- a/app/bookmarks/page.tsx +++ b/app/bookmarks/page.tsx @@ -12,7 +12,6 @@ export default function Bookmarks() { useEffect(() => { fetch("/bookmarks/api", { - cache: "force-cache", next: { tags: ["bookmarks"] }, }) .then((response) => response.json() as Promise<{ data: BookmarkType[] }>) diff --git a/fly-db/fly.toml b/fly-db/fly.toml new file mode 100644 index 0000000..d5ea619 --- /dev/null +++ b/fly-db/fly.toml @@ -0,0 +1,77 @@ +# fly.toml app configuration file generated for postgres-platzi-next-15 on 2024-12-12T01:54:25-05:00 +# +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app = 'postgres-platzi-next-15' +primary_region = 'bog' + +[env] + PRIMARY_REGION = 'bog' + +[[mounts]] + source = 'pg_data' + destination = '/data' + +[[services]] + protocol = 'tcp' + internal_port = 5432 + auto_start_machines = true + + [[services.ports]] + port = 5432 + handlers = ['pg_tls'] + + [services.concurrency] + type = 'connections' + hard_limit = 1000 + soft_limit = 1000 + +[[services]] + protocol = 'tcp' + internal_port = 5433 + auto_start_machines = true + + [[services.ports]] + port = 5433 + handlers = ['pg_tls'] + + [services.concurrency] + type = 'connections' + hard_limit = 1000 + soft_limit = 1000 + +[checks] + [checks.pg] + port = 5500 + type = 'http' + interval = '15s' + timeout = '10s' + path = '/flycheck/pg' + + [checks.role] + port = 5500 + type = 'http' + interval = '15s' + timeout = '10s' + path = '/flycheck/role' + + [checks.vm] + port = 5500 + type = 'http' + interval = '15s' + timeout = '10s' + path = '/flycheck/vm' + +[[metrics]] + port = 9187 + path = '/metrics' + https = false + +[http_service] + internal_port = 5432 + force_https = true + auto_stop_machines = 'stop' + auto_start_machines = true + min_machines_running = 0 + processes = ['app'] diff --git a/fly.toml b/fly.toml new file mode 100644 index 0000000..7e527a2 --- /dev/null +++ b/fly.toml @@ -0,0 +1,22 @@ +# fly.toml app configuration file generated for platzi-next-15 on 2024-12-12T01:51:21-05:00 +# +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app = 'platzi-next-15' +primary_region = 'bog' + +[build] + +[http_service] + internal_port = 3000 + force_https = true + auto_stop_machines = 'stop' + auto_start_machines = true + min_machines_running = 0 + processes = ['app'] + +[[vm]] + memory = '1gb' + cpu_kind = 'shared' + cpus = 1 diff --git a/next.config.ts b/next.config.ts index b94e8be..338e8ed 100644 --- a/next.config.ts +++ b/next.config.ts @@ -31,6 +31,9 @@ const getSentryConfig = () => hideSourceMaps: true, disableLogger: true, automaticVercelMonitors: false, + sourcemaps: { + deleteSourcemapsAfterUpload: true, + }, }) const CONFIG = enableSentry ? getSentryConfig() : nextConfig diff --git a/package.json b/package.json index 597576e..cc6ad1e 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react-dom": "19.0.0-rc-66855b96-20241106" }, "devDependencies": { + "@flydotio/dockerfile": "^0.5.9", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10b9832..1bd960e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: specifier: 19.0.0-rc-66855b96-20241106 version: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106) devDependencies: + '@flydotio/dockerfile': + specifier: ^0.5.9 + version: 0.5.9 '@types/node': specifier: ^20 version: 20.17.9 @@ -589,6 +592,11 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@flydotio/dockerfile@0.5.9': + resolution: {integrity: sha512-ZPvMw9ABrE6W4nc92NL5Jy4XdAehldsU4LZ6pJP+H0sAqHqw3Bk9qKbMcjKJN1aM5AuKqfWm/I4ABGnkDjcqEw==} + engines: {node: '>=16.0.0'} + hasBin: true + '@formatjs/intl-localematcher@0.5.8': resolution: {integrity: sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==} @@ -1482,6 +1490,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1550,6 +1561,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1564,6 +1579,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1679,6 +1698,10 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1796,6 +1819,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.72: resolution: {integrity: sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==} @@ -2028,6 +2056,9 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2099,6 +2130,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -2368,6 +2403,11 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} @@ -2498,6 +2538,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2882,6 +2926,10 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-in-the-middle@7.4.0: resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} engines: {node: '>=8.6.0'} @@ -2973,6 +3021,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -3330,6 +3382,10 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -3345,6 +3401,14 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3794,6 +3858,14 @@ snapshots: '@eslint/js@8.57.1': {} + '@flydotio/dockerfile@0.5.9': + dependencies: + chalk: 5.3.0 + diff: 5.2.0 + ejs: 3.1.10 + shell-quote: 1.8.2 + yargs: 17.7.2 + '@formatjs/intl-localematcher@0.5.8': dependencies: tslib: 2.8.1 @@ -4856,6 +4928,8 @@ snapshots: ast-types-flow@0.0.8: {} + async@3.2.6: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -4924,6 +4998,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.3.0: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4942,6 +5018,12 @@ snapshots: client-only@0.0.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -5049,6 +5131,8 @@ snapshots: didyoumean@1.2.2: {} + diff@5.2.0: {} + dlv@1.1.3: {} doctrine@2.1.0: @@ -5082,6 +5166,10 @@ snapshots: eastasianwidth@0.2.0: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.5.72: {} emoji-regex@8.0.0: {} @@ -5498,6 +5586,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5564,6 +5656,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -5845,6 +5939,13 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + jest-worker@27.5.1: dependencies: '@types/node': 20.17.9 @@ -5956,6 +6057,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 @@ -6303,6 +6408,8 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 + require-directory@2.1.1: {} + require-in-the-middle@7.4.0: dependencies: debug: 4.3.7 @@ -6425,6 +6532,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.2: {} + shimmer@1.2.1: {} side-channel@1.0.6: @@ -6864,6 +6973,8 @@ snapshots: xtend@4.0.2: {} + y18n@5.0.8: {} + yallist@3.1.1: {} yallist@4.0.0: {} @@ -6872,4 +6983,16 @@ snapshots: yaml@2.6.1: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yocto-queue@0.1.0: {}