commit bbb34768b40674565d3ba7c263f745eda8f5eea5 Author: Efrain (Helgen) Date: Mon Oct 19 16:14:08 2026 -0600 Respaldo inicial del Cotizador Helgen (19/10/2026) Co-Authored-By: Claude Opus 5.5 diff --git a/.clasp.json b/.clasp.json new file mode 100644 index 0000000..80edf24 --- /dev/null +++ b/.clasp.json @@ -0,0 +1,16 @@ +{ + "scriptId": "1GsH8DjaFEZ9dltqBUTUEFE_frblSYimRRCvPkqKdRB5UhmBwwYHLSwyS", + "rootDir": "", + "scriptExtensions": [ + ".js", + ".gs" + ], + "htmlExtensions": [ + ".html" + ], + "jsonExtensions": [ + ".json" + ], + "filePushOrder": [], + "skipSubdirectories": false +} \ No newline at end of file diff --git a/.claspignore b/.claspignore new file mode 100644 index 0000000..817181e --- /dev/null +++ b/.claspignore @@ -0,0 +1,5 @@ +**/** +!Code.js +!Logo.js +!Index.html +!appsscript.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f8ca68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Dependencias de Node (se reinstalan con `npm install`) +node_modules/ + +# Archivos temporales de Wrangler (Cloudflare) +.wrangler/ + +# Basura de macOS (los "Icon" son archivos vacíos de carpetas con ícono) +Icon? +.DS_Store + +# Credenciales y secretos: nunca subirlos +.env +.env.* +.dev.vars +.clasprc.json +*.pem +*.key +*.p12 +credentials*.json +client_secret*.json +service-account*.json + +# Registros +*.log +npm-debug.log* diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..88d6ac3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,363 @@ +# Cotizador Helgen — contexto para Claude Code + +Léelo completo antes de cambiar algo. Resume el sistema, dónde viven los datos y las decisiones ya tomadas +(con su porqué) para no repetir errores. Textos de la interfaz y comentarios del código: **español de México**. + +## 1. Qué es + +App web interna de **Helgen Servicios Especializados** para hacer cotizaciones, solo para cuentas `@helgen.tech`. +Desde el **19/10/2026** (§11) la interfaz se sirve desde **Cloudflare** y habla por `doPost` con una API en +**Google Apps Script** (sin servidor propio), con sesión de Google verificada en cada llamada. Flujo: + +1. El usuario inicia sesión con Google y llena el formulario (cliente, conceptos, notas, línea de negocio Helgen / Helgen Energy). +2. El servidor **recalcula** subtotal, IVA y total, asigna un **folio único** `HLG-AAAA-0001` y genera el **PDF**. +3. El PDF se guarda en Drive (carpeta por año) y la cotización queda como una fila en Google Sheets, con el vendedor del token. + +Además: historial con búsqueda, catálogo de productos con precios (Google Sheets aparte), clientes sugeridos con +autorrelleno, y claves SAT internas por producto para contabilidad (con sugerencias por palabras o con IA). + +**Helgen Energy** es la submarca de paneles solares: mismo folio y diseño, pero sus propios Términos y Condiciones. + +## 2. Datos clave (IDs y URLs) + +| Qué | Valor | +|---|---| +| **Cotizador (lo usa el equipo)** | `https://cotizador-helgen.cotizador-helgen.workers.dev/cotizador/` (portada en `/`) | +| Proyecto Apps Script de la API (`scriptId` en `.clasp.json`) | `1GsH8DjaFEZ9dltqBUTUEFE_frblSYimRRCvPkqKdRB5UhmBwwYHLSwyS` (nombre anterior "Cotizador Helgen — PRUEBAS interfaz web"; ver §9) | +| Deployment de la API (siempre actualizar este; `API_URL` en `web/cotizador/index.html`) | `AKfycbwBjF7ra_4O8INsxBq0eh-4r-BlSsJ4LLxcJgVCPRpx1U1a-Pz1CUSdYtvj_Mh0S6y2` (@3 al 19/10/2026, `access: ANYONE_ANONYMOUS` + token) | +| Client ID de OAuth (`CLIENT_ID_GOOGLE` en `web/cotizador/index.html` y `Code.js`) | `884526916417-cn5fh45io0nnpvlad2439thkpius4063.apps.googleusercontent.com` (no es secreto) | +| Carpeta maestra en Drive "Cotizador Helgen" | `1lf3Z4d3e_oqFbYJse4QbyYkWowYT9HCo` | +| Base de datos "Cotizador Helgen — Base de datos" (`SPREADSHEET_ID`) | `1ozFsyt1OjSnSv-PVpRWZjgqeWt6voQREbjvOJAXPEaI` | +| Catálogo "Catálogo Helgen" (`CATALOGO_ID`) | `11Rr0G7ZHE8PqXWsw9OpPPfGLQx8Yz7g8h1wkjJY2ahQ` | +| Carpeta PDF "Cotizaciones Helgen (PDF)" (`FOLDER_ID`) | `1CDN1LyOlA1L6z5dvBp49tlqu0fDoxdX8` (subcarpeta `2026` = `1X6m0nexpc3TzJd9XWBmGOAeZuiJE3Pig`) | +| "Catálogos SAT (CFDI 4.0)" (`SAT_ID`) | `1B2t9tXuEj1i9JO9ybqsuH4PN1K47CqMZgoEBzd-Dmc8` (subcarpeta "Catálogos SAT" `15OYcUp41onVJoW7--b3gnLZY8ymvYbUZ`) | +| Respaldos de la migración | Carpeta "Respaldos 2026-10-19" `1hxx0tgh4cLZMqoyf-eT8l14UAde7Y-L1` (copias de base de datos y catálogo antes del cambio) | +| Worker de Cloudflare | `cotizador-helgen`, cuenta de efrain@helgen.tech `badd8bca60b008822a73ca24e983ff43` | +| Dueño de todo / cuenta de clasp | `efrain@helgen.tech` (la API se ejecuta como esta cuenta) | +| **Proyecto anterior (EN DESUSO)** | `1X-qSKgvqKwuDj4iPZBhXlakR5udau9ibVMevhwvlLXgtSkjV4IoQxqwU`; deployment `AKfycbxahS3…` en @10 = aviso "El cotizador se mudó". Código en `anterior/` (§11) | + +Los IDs que usa el código están en **Script Properties** del proyecto `1GsH8Dja…` (ver §5). Esta tabla es solo referencia. + +## 3. Archivos del proyecto (carpeta local `~/Downloads/cotizador-helgen`) + +| Archivo | Para qué | +|---|---| +| `Code.js` | Todo el backend: API `doPost` con sesión + lógica (ver §4). Se sube a Apps Script. | +| `Logo.js` | Logos en base64: `LOGO_HELGEN_AZUL` (PDF, fondo blanco, 700×200) y `LOGO_HELGEN_BLANCO`. Se sube. | +| `Index.html` | Interfaz vieja de HtmlService. Se sube pero **no se usa** (`doGet` ya no la sirve; su `API_URL` es un marcador). La interfaz real es `web/cotizador/index.html`. | +| `appsscript.json` | Manifiesto: zona `America/Mexico_City`, V8, web app `executeAs: USER_DEPLOYING`, `access: ANYONE_ANONYMOUS`. Se sube. | +| `.clasp.json` | Liga la carpeta al proyecto `1GsH8Dja…`. **No cambiar el scriptId.** | +| `.claspignore` | Lista blanca: solo se suben `Code.js`, `Logo.js`, `Index.html`, `appsscript.json` (excluye `anterior/`). | +| `web/` | Portada (`index.html`, `logo-helgen-blanco.png`) y la interfaz real `web/cotizador/index.html` (§10). No se sube a Apps Script. `.assetsignore` excluye `Icon`/`.DS_Store`. | +| `wrangler.jsonc` | Publica `web/` en Cloudflare como Worker solo de archivos estáticos. | +| `tests/` | Pruebas en Node con servicios de Google simulados (ver §8). No se suben. Aceptan `Code.js` (actual) o `Code.gs` (anterior). | +| `anterior/` | Código del proyecto viejo (@9), su `.clasp.json` (`1X-qSKgv…`), `LEEME.md` con cómo regresar y el CLAUDE.md previo a la migración. No tocar salvo para regresar. | +| `herramientas/extraer-catalogos-sat.js` | Convierte el Excel oficial del SAT en los CSV que importa la app (ver §6.5). | +| `GUIA.md` | Guía para personas (instalación inicial). Desactualizada: describe el proyecto anterior. | +| `package.json` | Solo `@google/clasp` como dependencia de desarrollo. | +| `Icon` | Archivo vacío de macOS; ignorarlo. | + +No hay git inicializado en la carpeta. + +## 4. Funciones de `Code.js` + +Convención: las que terminan en `_` son internas; las demás las llama la interfaz (por `doPost`, ver `API_FUNCIONES`) +o son lógica pura (sección 5 del archivo, sin servicios de Google, probables en Node). + +### 4.1 Entrada, sesión e instalación +- `doGet()` — solo responde un texto con la dirección del cotizador (no sirve la app; ver §10.3). +- `doPost(e)` — verifica el token (`verificarTokenGoogle_`) **antes** de buscar la función; solo ejecuta las de `API_FUNCIONES`. + Pone el vendedor en `VENDEDOR_` durante la petición y lo limpia en `finally`. Detalle en §10.3. +- `verificarTokenGoogle_(token)`, `validarClaimsToken(...)` (pura), `usuarioActual_()` (reemplaza `Session.getActiveUser()`). +- `setup()` — crea la base de datos (pestañas `Cotizaciones` y `Config`) y la carpeta de PDF, y guarda sus IDs. + `db_()` la ejecuta sola si faltan `SPREADSHEET_ID`/`FOLDER_ID` (bajo candado). +- `db_()` — abre la base de datos; si faltan `SPREADSHEET_ID`/`FOLDER_ID`, corre `setup()`. +- `getConfig_()` — lee `Config` como objeto; antes llama `migrarConfig_()`. +- `migrarConfig_(hoja)` — actualiza hojas `Config` viejas: `TERMINOS` → `TERMINOS_HELGEN` + `TERMINOS_ENERGY`, agrega claves + nuevas de `CONFIG_INICIAL`, cambia valores de ejemplo (`CONFIG_EJEMPLO_ANTERIOR`) por los reales y repara celdas `#ERROR!`. + +### 4.2 Catálogo de productos +- `hojaCatalogo_()` — abre "Catálogo Helgen"; si no existe, `crearCatalogo_()` (bajo candado). Llama `asegurarColumnasSat_()`. +- `crearCatalogo_()` — crea el archivo con formato, validaciones (clave única con `COUNTIF`, precio ≥ 0), migra la pestaña + `Catalogo` vieja de la base de datos (sin el ejemplo `EJ-001`, luego la borra) y lo mueve junto a la base de datos. +- `asegurarColumnasSat_(hoja)` — agrega encabezados `Clave SAT`/`Unidad SAT` (G:H, formato texto) a catálogos viejos. +- `getCatalogo_(hoja?)` — lista `{clave, descripcion, unidad, precio, claveSat, unidadSat}`. +- `getCatalogo()` *(UI)* — productos + URL del archivo + unidades SAT para la lista de selección. +- `guardarProducto(p)` *(UI)* — alta o edición (`p.claveOriginal` = edición, permite cambiar la clave). Valida con + `normalizarProducto`, rechaza claves duplicadas (sin distinguir mayúsculas) y claves/unidades SAT que no existan. + "Actualizó" = `usuarioActual_()`. + +### 4.3 Catálogos del SAT +- `libroSat_()` — abre "Catálogos SAT (CFDI 4.0)"; si no existe `SAT_ID`, `importarCatalogosSat_()`. +- `importarCatalogosSat_()` — busca en Drive `SAT_c_ClaveProdServ.csv` y `SAT_c_ClaveUnidad.csv`, crea el libro con pestañas + `ClaveProdServ`, `ClaveUnidad` y `Fuente`, y lo deja en la carpeta de los CSV. +- `getUnidadesSat_()` — `[[clave, nombre], …]` de unidades. +- `sugerirClavesSat(texto)` *(UI)* — si el texto es una clave de 7–8 dígitos la busca exacta; si no, toma ~40 candidatos + (`candidatosSat`) y, si existe `ANTHROPIC_API_KEY`, la IA elige las 5 mejores con razón (`ordenarConIaSat_`); + si no hay key o falla, devuelve los 8 mejores por palabras. +- `ordenarConIaSat_(texto, candidatos)` — llama a la API de Claude (`UrlFetchApp`), guarda el resultado 6 h en caché; `null` si falla o no hay key. +- `probarIaSat()` — correr desde el editor: muestra en el registro sugerencias de ejemplo. +- `existeEnSat_(pestana, clave)` — valida una clave con `TextFinder` (celda completa). + +### 4.4 Datos para la interfaz +- `getDatosIniciales()` *(UI, al cargar)* — IVA, vigencia, marcas, catálogo, clientes, `usuario` (correo) y `vendedor` (`{email, nombre, apellido}`). +- `getClientes()` *(UI)* — clientes que ya cotizaron, calculados desde la hoja `Cotizaciones` (`clientesDesdeFilas`). +- `listarCotizaciones(busqueda)` *(UI)* — últimas 100 cotizaciones, filtro por folio/cliente/empresa; `vendedor` = nombre + apellido + (filas viejas: `vendedor_email` o "Elaboró"). + +### 4.5 Guardar cotización +- `guardarCotizacion(payload)` *(UI)* — exige vendedor verificado (si no, error de sesión); normaliza, agrega clave/unidad SAT + a cada concepto que venga del catálogo (si falla, guarda igual), toma el candado, revisa idempotencia (`payload.idSolicitud` + en `CacheService`, 6 h), asigna folio, genera PDF, lo guarda en la carpeta del año, reescribe encabezados si no coinciden con + `ENCABEZADOS_COTIZACIONES` y agrega la fila. Devuelve `{folio, url, total}`. +- `siguienteFolio_(prefijo, hojaCot)` — `max(CONSECUTIVO_AAAA, mayor folio del año en la hoja) + 1`. +- `carpetaDelAnio_(anio)` — subcarpeta `2026`, `2027`… dentro de la carpeta de PDF (la busca **por nombre**). +- `logoDataUrl_(fileId)` — logo de Drive si `LOGO_FILE_ID` tiene valor; si no, `LOGO_HELGEN_AZUL`. + +### 4.6 Lógica pura (sin Google; se prueba en Node) +- `redondear(n)`, `formatoMoneda(n)`, `escaparHtml(s)`, `importeConLetra(n)` ("MIL CIENTO SESENTA PESOS 02/100 M.N."). +- `normalizarCotizacion(p, ivaTasa)` — limpia cliente/conceptos, exige nombre y ≥1 concepto, calcula importes y totales, `marca`. +- `formatearFolio`, `maxConsecutivo(folios, prefijo, anio)`. +- `clientesDesdeFilas(filas)` — agrupa por nombre+empresa normalizados (sin acentos/mayúsculas/espacios), la fila más + reciente manda, un dato vacío no borra uno anterior; `etiqueta` = nombre, o "nombre — empresa" si el nombre se repite. +- `normalizarProducto(p)`, `indiceDeClave(claves, clave)`. +- `terminosParaPdf(cfg, marca)` — renglones de T&C de la marca; agrega la línea de vigencia si falta. +- `textoCelda(s)` — antepone `'` a texto que empiece con `= + - @` para que Sheets no lo lea como fórmula. +- `validarClaimsToken(claims, clientId, dominio, ahora)` — ver §10.3. +- SAT: `palabrasSat`, `SINONIMOS_SAT`, `PALABRAS_SERVICIO_SAT`, `buscarClavesSat(consulta, filas, n)`, `candidatosSat`, + `solicitudIaSat`, `leerRespuestaIaSat` (solo acepta claves que estaban entre los candidatos). Modelo: `MODELO_IA_SAT`. +- `construirHtmlPdf(d, cfg, logoUrl)` — HTML del PDF (ver reglas 3–4). + +### 4.7 Interfaz (`web/cotizador/index.html`) +Tres pestañas: **Nueva cotización**, **Historial**, **Catálogo**. Funciones principales: `agregarFila`, `leerItems`, +`recalcular` (vista previa; el servidor recalcula), `guardar`, `limpiar`, `cargarHistorial`, `recibirClientes`, +`autorrellenarCliente`, `pintarDatalists`, `cargarCatalogo`, `pintarCatalogo`, `editarProd`, `guardarProd`, `sugerirSat`, `verTab`. +Autocompletado con ``: clientes (en "Nombre"), productos por descripción y por clave, unidades SAT. +Capa de sesión y `fetch` en ` + + + + diff --git a/Logo.js b/Logo.js new file mode 100644 index 0000000..d37c38f --- /dev/null +++ b/Logo.js @@ -0,0 +1,5 @@ +/** Logo Helgen azul (#2C3C5B): para el PDF (fondo blanco). */ +const LOGO_HELGEN_AZUL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAYAAAAKljK9AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABDmVYSWZNTQAqAAAACAAHARIAAwAAAAEAAQAAARoABQAAAAEAAABiARsABQAAAAEAAABqASgAAwAAAAEAAgAAATEAAgAAAEEAAAByATsAAgAAAAwAAAC0h2kABAAAAAEAAADAAAAAAAAAAGQAAAABAAAAZAAAAAFDYW52YSBkb2M9REFIRHJzcXF1dTAgdXNlcj1VQUhDTURVcVNlQSBicmFuZD1IZWxnZW4gVGVjaG5vbG9naWVzAABFZnJhaW4gU29zYQAABpAAAAcAAAAEMDIxMJEBAAcAAAAEAQIDAKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAABAAACvKADAAQAAAABAAAAyAAAAAAs/Xe1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHImlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyI+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTI2MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkV4aWZWZXJzaW9uPjAyMTA8L2V4aWY6RXhpZlZlcnNpb24+CiAgICAgICAgIDxleGlmOkZsYXNoUGl4VmVyc2lvbj4wMTAwPC9leGlmOkZsYXNoUGl4VmVyc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjM2MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT4xPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MjwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT4wPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9leGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkNhbnZhIGRvYz1EQUhEcnNxcXV1MCB1c2VyPVVBSENNRFVxU2VBIGJyYW5kPUhlbGdlbiBUZWNobm9sb2dpZXM8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkg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'; + +/** Logo Helgen blanco (fondo transparente): solo sobre fondo azul, en el encabezado de la app. */ +const LOGO_HELGEN_BLANCO = 'data:image/png;base64,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'; diff --git a/anterior/.clasp.json b/anterior/.clasp.json new file mode 100644 index 0000000..0955668 --- /dev/null +++ b/anterior/.clasp.json @@ -0,0 +1,16 @@ +{ + "scriptId": "1X-qSKgvqKwuDj4iPZBhXlakR5udau9ibVMevhwvlLXgtSkjV4IoQxqwU", + "rootDir": "", + "scriptExtensions": [ + ".js", + ".gs" + ], + "htmlExtensions": [ + ".html" + ], + "jsonExtensions": [ + ".json" + ], + "filePushOrder": [], + "skipSubdirectories": false +} \ No newline at end of file diff --git a/anterior/.claspignore b/anterior/.claspignore new file mode 100644 index 0000000..08b0587 --- /dev/null +++ b/anterior/.claspignore @@ -0,0 +1,5 @@ +**/** +!Code.gs +!Logo.gs +!Index.html +!appsscript.json diff --git a/anterior/CLAUDE-antes-de-migrar.md b/anterior/CLAUDE-antes-de-migrar.md new file mode 100644 index 0000000..271d8fb --- /dev/null +++ b/anterior/CLAUDE-antes-de-migrar.md @@ -0,0 +1,374 @@ +# Cotizador Helgen — contexto para Claude Code + +Léelo completo antes de cambiar algo. Resume el sistema, dónde viven los datos y las decisiones ya tomadas +(con su porqué) para no repetir errores. Textos de la interfaz y comentarios del código: **español de México**. + +## 1. Qué es + +App web interna de **Helgen Servicios Especializados** para hacer cotizaciones. Corre en **Google Apps Script** +(sin servidor propio), solo para cuentas `@helgen.tech`. Flujo: + +1. El usuario llena el formulario (cliente, conceptos, notas, línea de negocio Helgen / Helgen Energy). +2. El servidor **recalcula** subtotal, IVA y total, asigna un **folio único** `HLG-AAAA-0001` y genera el **PDF**. +3. El PDF se guarda en Drive (carpeta por año) y la cotización queda como una fila en Google Sheets. + +Además: historial con búsqueda, catálogo de productos con precios (Google Sheets aparte), clientes sugeridos con +autorrelleno, y claves SAT internas por producto para contabilidad (con sugerencias por palabras o con IA). + +**Helgen Energy** es la submarca de paneles solares: mismo folio y diseño, pero sus propios Términos y Condiciones. + +## 2. Datos clave (IDs y URLs) + +| Qué | Valor | +|---|---| +| URL de la app (la usa el equipo) | `https://script.google.com/a/macros/helgen.tech/s/AKfycbxahS3PbizPrRrQIC1m2uz-2G8PoT64BqPdtGLu0Ms5t9RKs2ucxH_c3tpJXkj8uLE/exec` | +| Deployment publicado (siempre actualizar este) | `AKfycbxahS3PbizPrRrQIC1m2uz-2G8PoT64BqPdtGLu0Ms5t9RKs2ucxH_c3tpJXkj8uLE` (versión @9 al 19/10/2026) | +| Proyecto Apps Script (`scriptId` en `.clasp.json`) | `1X-qSKgvqKwuDj4iPZBhXlakR5udau9ibVMevhwvlLXgtSkjV4IoQxqwU` — "Cotizador Helgen (código de la app)" | +| Carpeta maestra en Drive "Cotizador Helgen" | `1lf3Z4d3e_oqFbYJse4QbyYkWowYT9HCo` | +| Base de datos "Cotizador Helgen — Base de datos" (`SPREADSHEET_ID`) | `1ozFsyt1OjSnSv-PVpRWZjgqeWt6voQREbjvOJAXPEaI` | +| Catálogo "Catálogo Helgen" (`CATALOGO_ID`) | `11Rr0G7ZHE8PqXWsw9OpPPfGLQx8Yz7g8h1wkjJY2ahQ` | +| Carpeta PDF "Cotizaciones Helgen (PDF)" (`FOLDER_ID`) | `1CDN1LyOlA1L6z5dvBp49tlqu0fDoxdX8` | +| "Catálogos SAT (CFDI 4.0)" (`SAT_ID`) | `1B2t9tXuEj1i9JO9ybqsuH4PN1K47CqMZgoEBzd-Dmc8` (subcarpeta "Catálogos SAT" `15OYcUp41onVJoW7--b3gnLZY8ymvYbUZ`) | +| Interfaz web en Cloudflare (PRUEBAS) | `https://cotizador-helgen.cotizador-helgen.workers.dev/cotizador/` (portada en `/`). IDs de PRUEBAS en §10 | +| Dueño de todo / cuenta de clasp | `efrain@helgen.tech` (la app se ejecuta como esta cuenta) | + +Los IDs reales que usa el código están en **Script Properties** (ver §5). Esta tabla es solo referencia. + +## 3. Archivos del proyecto (carpeta local `~/Downloads/cotizador-helgen`) + +| Archivo | Para qué | +|---|---| +| `Code.gs` | Todo el backend (ver §4). Se sube a Apps Script. | +| `Index.html` | Interfaz completa (HTML + CSS + JS en un archivo). Plantilla de HtmlService. Se sube. | +| `Logo.gs` | Logos en base64: `LOGO_HELGEN_AZUL` (PDF, fondo blanco, 700×200) y `LOGO_HELGEN_BLANCO` (encabezado azul de la app). Se sube. | +| `appsscript.json` | Manifiesto: zona `America/Mexico_City`, V8, web app `executeAs: USER_DEPLOYING`, `access: DOMAIN`. Se sube. | +| `.clasp.json` | Liga la carpeta al proyecto `1X-qSKgv…`. **No cambiar el scriptId.** | +| `.claspignore` | Lista blanca: solo se suben `Code.gs`, `Logo.gs`, `Index.html`, `appsscript.json`. | +| `tests/` | Pruebas en Node con servicios de Google simulados (ver §8). No se suben. `sesion.test.js` es de PRUEBAS (Fase 2, §10). | +| `herramientas/extraer-catalogos-sat.js` | Convierte el Excel oficial del SAT en los CSV que importa la app (ver §6.5). | +| `GUIA.md` | Guía para personas (instalación inicial). Partes desactualizadas: hoy se usa `npx clasp` y `setup()` corre solo. | +| `web/` | Portada con la marca (`index.html`, `logo-helgen-blanco.png` extraído de `Logo.gs`); su botón lleva a `web/cotizador/index.html`: la interfaz completa con una capa que imita `google.script.run` por `fetch` al `doPost` de PRUEBAS (`API_URL`). El código de pruebas (`Code.js` con `doPost`/`API_FUNCIONES`) vive solo en el proyecto de PRUEBAS, no en esta carpeta. `.assetsignore` excluye `Icon`/`.DS_Store`. No se sube a Apps Script. Ver §10. | +| `wrangler.jsonc` | Publica `web/` en Cloudflare como Worker solo de archivos estáticos (ver §10). | +| `package.json` | Solo `@google/clasp` como dependencia de desarrollo. | +| `Icon` | Archivo vacío de macOS; ignorarlo. | + +No hay git inicializado en la carpeta. + +## 4. Funciones de `Code.gs` + +Convención: las que terminan en `_` son internas; las demás las llama la interfaz con `google.script.run` +o son lógica pura (sección 5 del archivo, sin servicios de Google, probables en Node). + +### 4.1 Entrada e instalación +- `doGet()` — sirve `Index.html` como plantilla (`createTemplateFromFile(...).evaluate()`). +- `setup()` — crea la base de datos (pestañas `Cotizaciones` y `Config`) y la carpeta de PDF, y guarda sus IDs. + **No hace falta correrla a mano:** `db_()` la ejecuta sola la primera vez (bajo candado). +- `db_()` — abre la base de datos; si faltan `SPREADSHEET_ID`/`FOLDER_ID`, corre `setup()`. +- `getConfig_()` — lee `Config` como objeto; antes llama `migrarConfig_()`. +- `migrarConfig_(hoja)` — actualiza hojas `Config` viejas: `TERMINOS` → `TERMINOS_HELGEN` + `TERMINOS_ENERGY`, agrega claves + nuevas de `CONFIG_INICIAL`, cambia valores de ejemplo (`CONFIG_EJEMPLO_ANTERIOR`) por los reales y repara celdas `#ERROR!`. + +### 4.2 Catálogo de productos +- `hojaCatalogo_()` — abre "Catálogo Helgen"; si no existe, `crearCatalogo_()` (bajo candado). Llama `asegurarColumnasSat_()`. +- `crearCatalogo_()` — crea el archivo con formato, validaciones (clave única con `COUNTIF`, precio ≥ 0), migra la pestaña + `Catalogo` vieja de la base de datos (sin el ejemplo `EJ-001`, luego la borra) y lo mueve junto a la base de datos. +- `asegurarColumnasSat_(hoja)` — agrega encabezados `Clave SAT`/`Unidad SAT` (G:H, formato texto) a catálogos viejos. +- `getCatalogo_(hoja?)` — lista `{clave, descripcion, unidad, precio, claveSat, unidadSat}`. +- `getCatalogo()` *(UI)* — productos + URL del archivo + unidades SAT para la lista de selección. +- `guardarProducto(p)` *(UI)* — alta o edición (`p.claveOriginal` = edición, permite cambiar la clave). Valida con + `normalizarProducto`, rechaza claves duplicadas (sin distinguir mayúsculas) y claves/unidades SAT que no existan. + +### 4.3 Catálogos del SAT +- `libroSat_()` — abre "Catálogos SAT (CFDI 4.0)"; si no existe, `importarCatalogosSat_()`. +- `importarCatalogosSat_()` — busca en Drive `SAT_c_ClaveProdServ.csv` y `SAT_c_ClaveUnidad.csv`, crea el libro con pestañas + `ClaveProdServ`, `ClaveUnidad` y `Fuente`, y lo deja en la carpeta de los CSV. +- `getUnidadesSat_()` — `[[clave, nombre], …]` de unidades. +- `sugerirClavesSat(texto)` *(UI)* — si el texto es una clave de 7–8 dígitos la busca exacta; si no, toma ~40 candidatos + (`candidatosSat`) y, si existe `ANTHROPIC_API_KEY`, la IA elige las 5 mejores con razón (`ordenarConIaSat_`); + si no hay key o falla, devuelve los 8 mejores por palabras. +- `ordenarConIaSat_(texto, candidatos)` — llama a la API de Claude (`UrlFetchApp`), guarda el resultado 6 h en caché; `null` si falla. +- `probarIaSat()` — correr desde el editor: autoriza `UrlFetchApp` y muestra en el registro sugerencias de ejemplo. +- `existeEnSat_(pestana, clave)` — valida una clave con `TextFinder` (celda completa). + +### 4.4 Datos para la interfaz +- `getDatosIniciales()` *(UI, al cargar)* — IVA, vigencia, marcas, catálogo, clientes, usuario. +- `getClientes()` *(UI)* — clientes que ya cotizaron, calculados desde la hoja `Cotizaciones` (`clientesDesdeFilas`). +- `listarCotizaciones(busqueda)` *(UI)* — últimas 100 cotizaciones, filtro por folio/cliente/empresa. + +### 4.5 Guardar cotización +- `guardarCotizacion(payload)` *(UI)* — normaliza, agrega clave/unidad SAT a cada concepto que venga del catálogo (si falla, + guarda igual), toma el candado, revisa idempotencia (`payload.idSolicitud` en `CacheService`, 6 h), asigna folio, + genera PDF, lo guarda en la carpeta del año y agrega la fila. Devuelve `{folio, url, total}`. +- `siguienteFolio_(prefijo, hojaCot)` — `max(CONSECUTIVO_AAAA, mayor folio del año en la hoja) + 1`. +- `carpetaDelAnio_(anio)` — subcarpeta `2026`, `2027`… dentro de la carpeta de PDF (la busca **por nombre**). +- `logoDataUrl_(fileId)` — logo de Drive si `LOGO_FILE_ID` tiene valor; si no, `LOGO_HELGEN_AZUL`. + +### 4.6 Lógica pura (sin Google; se prueba en Node) +- `redondear(n)`, `formatoMoneda(n)`, `escaparHtml(s)`, `importeConLetra(n)` ("MIL CIENTO SESENTA PESOS 02/100 M.N."). +- `normalizarCotizacion(p, ivaTasa)` — limpia cliente/conceptos, exige nombre y ≥1 concepto, calcula importes y totales, `marca`. +- `formatearFolio`, `maxConsecutivo(folios, prefijo, anio)`. +- `clientesDesdeFilas(filas)` — agrupa por nombre+empresa normalizados (sin acentos/mayúsculas/espacios), la fila más + reciente manda, un dato vacío no borra uno anterior; `etiqueta` = nombre, o "nombre — empresa" si el nombre se repite. +- `normalizarProducto(p)`, `indiceDeClave(claves, clave)`. +- `terminosParaPdf(cfg, marca)` — renglones de T&C de la marca; agrega la línea de vigencia si falta. +- `textoCelda(s)` — antepone `'` a texto que empiece con `= + - @` para que Sheets no lo lea como fórmula. +- SAT: `palabrasSat`, `SINONIMOS_SAT`, `PALABRAS_SERVICIO_SAT`, `buscarClavesSat(consulta, filas, n)`, `candidatosSat`, + `solicitudIaSat`, `leerRespuestaIaSat` (solo acepta claves que estaban entre los candidatos). Modelo: `MODELO_IA_SAT`. +- `construirHtmlPdf(d, cfg, logoUrl)` — HTML del PDF (ver reglas 3–4). + +### 4.7 `Index.html` (interfaz) +Tres pestañas: **Nueva cotización**, **Historial**, **Catálogo**. Funciones principales: `agregarFila`, `leerItems`, +`recalcular` (vista previa; el servidor recalcula), `guardar`, `limpiar`, `cargarHistorial`, `recibirClientes`, +`autorrellenarCliente`, `pintarDatalists`, `cargarCatalogo`, `pintarCatalogo`, `editarProd`, `guardarProd`, `sugerirSat`, `verTab`. +Autocompletado con ``: clientes (en "Nombre"), productos por descripción y por clave, unidades SAT. + +## 5. Dónde se guardan los datos + +**Todo en la carpeta maestra "Cotizador Helgen"** de Mi unidad: +``` +📁 Cotizador Helgen + ├─ 📊 Cotizador Helgen — Base de datos (Cotizaciones, Config) + ├─ 📊 Catálogo Helgen (Catalogo) + ├─ 📁 Cotizaciones Helgen (PDF) / 📁 2026 / HLG-2026-0001 - Cliente.pdf + ├─ 📁 Catálogos SAT / SAT_c_ClaveProdServ.csv, SAT_c_ClaveUnidad.csv, 📊 Catálogos SAT (CFDI 4.0) + └─ 📜 Cotizador Helgen (código de la app) +``` + +**Pestaña `Cotizaciones`** (16 columnas, 1 fila por cotización): Folio, Fecha, Cliente, Empresa, RFC, Correo, Teléfono, +Subtotal, IVA, Total, Elaboró, PDF (link), Conceptos (JSON: clave, descripcion, unidad, cantidad, precio, importe y, si vienen +del catálogo, claveSat/unidadSat), Notas, Marca (Helgen / Helgen Energy), Dirección. Las columnas Marca y Dirección se +agregaron después: `guardarCotizacion` reescribe la fila de encabezados si no coincide con `ENCABEZADOS_COTIZACIONES`. +En PRUEBAS la hoja tiene 19 columnas: además `vendedor_email`, `vendedor_nombre`, `vendedor_apellido` (Fase 2, §10.5). + +**Pestaña `Config`** (Clave | Valor, columna B en formato texto): `EMPRESA_NOMBRE` (Helgen Servicios Especializados), +`EMPRESA_RFC` (HSE240304PC1), `EMPRESA_DIRECCION`, `EMPRESA_TELEFONO` (+52 442 644 5391), `EMPRESA_EMAIL`, `EMPRESA_WEB`, +`PREFIJO_FOLIO` (HLG), `IVA_TASA` (0.16), `VIGENCIA_DIAS` (15), `MONEDA`, `LOGO_FILE_ID` (vacío = logo de `Logo.gs`), +`TERMINOS_HELGEN`, `TERMINOS_ENERGY` (un término por renglón dentro de la celda). + +**"Catálogo Helgen" / pestaña `Catalogo`**: Clave (única, mayúsculas), Descripción, Unidad, Precio unitario (sin IVA), +Actualizado, Actualizó, Clave SAT, Unidad SAT. A:C y G:H en formato texto. + +**Script Properties** (Configuración del proyecto en el editor): +`SPREADSHEET_ID`, `FOLDER_ID`, `CATALOGO_ID`, `SAT_ID`, `CONSECUTIVO_AAAA` (p. ej. `CONSECUTIVO_2026`), +`ANTHROPIC_API_KEY` (opcional; activa la IA para claves SAT). Nunca poner la API key en el código. + +## 6. Decisiones tomadas (y por qué) + +### 6.1 Folios sin duplicados +- Todo el guardado va dentro de `LockService.getScriptLock()` con `tryLock(30000)` y mensaje en español si se agota. +- El folio sale del **mayor** entre el contador y el último folio de la hoja: si alguien borra o edita `CONSECUTIVO_AAAA`, no se repite. +- **Idempotencia:** el formulario manda `idSolicitud` (UUID por cotización, se renueva al limpiar); un doble clic o reenvío devuelve el mismo folio. +- Borrar una fila no hace retroceder el contador (intencional). El consecutivo reinicia cada año. + +### 6.2 Instalación y migraciones automáticas +- La app se instala sola (`db_()` → `setup()`, `hojaCatalogo_()` → `crearCatalogo_()`, `libroSat_()` → `importarCatalogosSat_()`), + porque correr `setup()` a mano falló la primera vez. +- Toda estructura nueva se migra sola al abrir la app (Config, columnas del catálogo, encabezados de Cotizaciones). + Al agregar columnas o claves, seguir este patrón: **nunca pedir al usuario que edite la hoja a mano**. + +### 6.3 PDF (lecciones del conversor HTML→PDF de Google) +- **No imprime colores de fondo** (`background`): con la banda azul, el logo blanco y el texto blanco desaparecieron. + Por eso el PDF usa texto azul, líneas y bordes; `bgcolor` solo como extra opcional. +- No soporta flex/grid: solo tablas e inline CSS. Fuente del PDF: Arial (las web fonts no son confiables ahí). +- Logo azul en el PDF; el blanco solo sobre fondo azul. +- No hay forma local de ver el PDF real: para revisar, renderizar el HTML **quitando los fondos** (simula al conversor). + +### 6.4 Interfaz +- En la plantilla, imágenes `data:` se insertan con ``: `` las bloquea por seguridad. +- Fuentes de Google (League Spartan, Roboto Mono) sí funcionan en la app. +- Máximo 3 módulos por vista. Mensajes de error en español. + +### 6.5 Catálogo y SAT +- El catálogo es un **archivo aparte** para poder compartirlo con quien mantiene precios sin exponer el historial. +- La **clave SAT no reemplaza la clave interna**: muchas claves internas comparten una clave SAT. Es dato interno de + contabilidad: **no sale en el PDF**; se valida contra el catálogo vigente y viaja en el JSON de conceptos. +- Catálogo SAT: `catCFDI_V_4_20261015.xls` del Anexo 20 (`http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm`; + el sitio rechaza HTTPS desde aquí, usar HTTP con `curl`). 52,513 claves de producto/servicio y 2,418 unidades vigentes. +- **Actualizar el catálogo SAT:** descargar el `.xls` nuevo, correr + `node herramientas/extraer-catalogos-sat.js ` (requiere `npm i xlsx@0.18.5` en una carpeta + temporal), reemplazar los CSV en la subcarpeta "Catálogos SAT", **borrar la propiedad `SAT_ID`** y abrir la pestaña Catálogo. +- La búsqueda por palabras funciona bien para productos (panel solar → 26111607 / 32111701 / 60104702; inversor → 32121705; + cargador VE → 25175002) y mal para servicios genéricos; para eso existe la IA opcional. Ampliar `SINONIMOS_SAT` si una búsqueda falla. +- **No inventar claves SAT de memoria:** una vez se afirmó que 26111604 era "Paneles solares" y es "Generadores a gas". + Verificar siempre contra el CSV/hoja. Contabilidad debe validar toda clave sugerida. + +### 6.6 Clientes sugeridos +- No hay lista de clientes aparte: se calcula cada vez desde `Cotizaciones`. Si se borran sus filas, el cliente deja de sugerirse (lo pidió el usuario). + +### 6.7 Drive +- La app usa **IDs, no rutas**: se pueden mover o renombrar archivos. Rompe: copiar-y-borrar (cambia el ID), borrar, renombrar + las pestañas `Cotizaciones`/`Config`, sacar o renombrar las subcarpetas de año, perder acceso de edición de efrain@helgen.tech. +- **Peligro:** la carpeta local `~/Downloads` (incluida esta carpeta del proyecto) se sincroniza a Drive en una carpeta + "Downloads" (`1BBB4vyr9WW1TowC6Uemtd3K6V7_NitAh`). No mover ni borrar esas copias desde Drive: afectaría la carpeta local. +- Google Drive para escritorio está montado en `~/Library/CloudStorage/GoogleDrive-efrain@helgen.tech/Mi unidad/`: + sirve para dejar archivos en Drive (así se subieron los CSV del SAT). + +### 6.8 clasp +- clasp está instalado **local** en el proyecto (instalar global pedía permisos de administrador): usar siempre `npx clasp`. +- **No volver a correr `clasp create`**: crea otro proyecto y sobrescribe `appsscript.json` (pone zona de Nueva York y + quita la configuración de web app). Ya pasó y hubo que borrar un proyecto duplicado. +- Publicar siempre sobre el mismo deployment (misma URL para el equipo). Nunca `clasp deploy` sin `--deploymentId`. +- Si se agrega un servicio nuevo de Google o `UrlFetchApp`, el dueño debe autorizar el permiso una vez desde el editor. + +## 7. Reglas del proyecto (no romper) +1. Los totales SIEMPRE se recalculan en el servidor (`normalizarCotizacion`). El navegador solo muestra una vista previa. +2. Redondeo a 2 decimales por renglón (`redondear`). IVA = subtotal × tasa. +3. PDF con **tablas e inline CSS**, sin flex/grid y **sin depender de colores de fondo** (§6.3). +4. Todo texto del usuario que va al PDF pasa por `escaparHtml`. +5. Colores de marca (Brand Guidelines de Helgen en Canva): azul `#2C3C5B` y aqua `#51F3DA` (primarios), teal `#0AC5A8` + (secundario), negro/blanco; fondo neutro `#F2F4F7`. Tipografías: League Spartan Bold (títulos), Roboto Mono (texto). + No usar los colores viejos `#0B1C3F` / `#4CAF50`. +6. Toda cotización imprime Términos y Condiciones según la línea de negocio: + - **Helgen** (`TERMINOS_HELGEN`): solo "Precios vigentes por 15 días o hasta agotar existencias, sujetos a variaciones en costos de suministro de componentes." + - **Helgen Energy** (`TERMINOS_ENERGY`): metraje adicional, centro de carga, obra civil + vigencia. + No agregar términos por cuenta propia (se quitó uno de "fuera de alcance" que el usuario no quería). +7. Texto del usuario que va a Sheets pasa por `textoCelda` (un "+52…" se leería como fórmula → `#ERROR!`). +8. Textos de la interfaz en español de México. +9. Las claves SAT son internas: nunca en el PDF. + +## 8. Cómo trabajar + +```bash +# Pruebas (Node, servicios de Google simulados). Correr las tres antes de subir. +mkdir -p /tmp/salida-pdf && node tests/cotizacion.test.js Code.gs /tmp/salida-pdf # folios, idempotencia, marcas, Config, clientes; deja helgen.html / energy.html +node tests/catalogo.test.js . # catálogo: migración, alta, edición, duplicados +node tests/sat.test.js . "$HOME/Library/CloudStorage/GoogleDrive-efrain@helgen.tech/Mi unidad/Cotizador Helgen/Catálogos SAT" +node tests/probar-busqueda-sat.js Code.gs "/SAT_c_ClaveProdServ.csv" # ver qué sugiere la búsqueda por palabras +node tests/sesion.test.js # Fase 2: token en doPost, vendedor_* (ver §10) + +# Subir y publicar (misma URL) +npx clasp push --force +npx clasp deploy --deploymentId AKfycbxahS3PbizPrRrQIC1m2uz-2G8PoT64BqPdtGLu0Ms5t9RKs2ucxH_c3tpJXkj8uLE -d "descripción del cambio" +npx clasp list-deployments + +# Interfaz web en Cloudflare: ver §10 +npx --yes wrangler@4 deploy +``` + +- Antes de `push`, confirmar que `.clasp.json` apunta a `1X-qSKgv…`. +- Revisar sintaxis del JS de la interfaz: extraer el ` + + diff --git a/anterior/LEEME.md b/anterior/LEEME.md new file mode 100644 index 0000000..f7d52db --- /dev/null +++ b/anterior/LEEME.md @@ -0,0 +1,10 @@ +# Código del proyecto anterior (EN DESUSO desde el 19/10/2026) + +Proyecto Apps Script `1X-qSKgvqKwuDj4iPZBhXlakR5udau9ibVMevhwvlLXgtSkjV4IoQxqwU` ("Cotizador Helgen (código de la app)"). +Este es el código de la versión **@9** (la última que usó el equipo). Se guarda solo como referencia y para poder regresar. + +- El deployment `AKfycbxahS3PbizPrRrQIC1m2uz-2G8PoT64BqPdtGLu0Ms5t9RKs2ucxH_c3tpJXkj8uLE` está en **@10**: + muestra "El cotizador se mudó" y `guardarCotizacion` / `guardarProducto` lanzan error (para que solo un proyecto escriba en la hoja). +- **Regresar (solo si hace falta):** primero apuntar SPREADSHEET_ID, FOLDER_ID y CATALOGO_ID del proyecto nuevo a los IDs de prueba (no borrarlas: crearía otra base de datos), luego, desde esta carpeta: + `npx clasp deploy --deploymentId AKfycbxahS3PbizPrRrQIC1m2uz-2G8PoT64BqPdtGLu0Ms5t9RKs2ucxH_c3tpJXkj8uLE -V 9 -d "regreso a @9"` +- No usar `clasp push` desde aquí salvo para ese regreso. Nunca correr los dos proyectos guardando a la vez. diff --git a/anterior/Logo.gs b/anterior/Logo.gs new file mode 100644 index 0000000..d37c38f --- /dev/null +++ b/anterior/Logo.gs @@ -0,0 +1,5 @@ +/** Logo Helgen azul (#2C3C5B): para el PDF (fondo blanco). */ +const LOGO_HELGEN_AZUL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAYAAAAKljK9AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABDmVYSWZNTQAqAAAACAAHARIAAwAAAAEAAQAAARoABQAAAAEAAABiARsABQAAAAEAAABqASgAAwAAAAEAAgAAATEAAgAAAEEAAAByATsAAgAAAAwAAAC0h2kABAAAAAEAAADAAAAAAAAAAGQAAAABAAAAZAAAAAFDYW52YSBkb2M9REFIRHJzcXF1dTAgdXNlcj1VQUhDTURVcVNlQSBicmFuZD1IZWxnZW4gVGVjaG5vbG9naWVzAABFZnJhaW4gU29zYQAABpAAAAcAAAAEMDIxMJEBAAcAAAAEAQIDAKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAABAAACvKADAAQAAAABAAAAyAAAAAAs/Xe1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHImlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyI+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MTI2MDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkV4aWZWZXJzaW9uPjAyMTA8L2V4aWY6RXhpZlZlcnNpb24+CiAgICAgICAgIDxleGlmOkZsYXNoUGl4VmVyc2lvbj4wMTAwPC9leGlmOkZsYXNoUGl4VmVyc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjM2MDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT4xPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MjwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpPjM8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaT4wPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9leGlmOkNvbXBvbmVudHNDb25maWd1cmF0aW9uPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkNhbnZhIGRvYz1EQUhEcnNxcXV1MCB1c2VyPVVBSENNRFVxU2VBIGJyYW5kPUhlbGdlbiBUZWNobm9sb2dpZXM8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+MTAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkg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'; + +/** Logo Helgen blanco (fondo transparente): solo sobre fondo azul, en el encabezado de la app. */ +const LOGO_HELGEN_BLANCO = 'data:image/png;base64,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'; diff --git a/anterior/appsscript.json b/anterior/appsscript.json new file mode 100644 index 0000000..6af4430 --- /dev/null +++ b/anterior/appsscript.json @@ -0,0 +1,10 @@ +{ + "timeZone": "America/Mexico_City", + "dependencies": {}, + "exceptionLogging": "STACKDRIVER", + "runtimeVersion": "V8", + "webapp": { + "executeAs": "USER_DEPLOYING", + "access": "DOMAIN" + } +} \ No newline at end of file diff --git a/appsscript.json b/appsscript.json new file mode 100644 index 0000000..2040776 --- /dev/null +++ b/appsscript.json @@ -0,0 +1,10 @@ +{ + "timeZone": "America/Mexico_City", + "dependencies": {}, + "exceptionLogging": "STACKDRIVER", + "runtimeVersion": "V8", + "webapp": { + "executeAs": "USER_DEPLOYING", + "access": "ANYONE_ANONYMOUS" + } +} \ No newline at end of file diff --git a/herramientas/extraer-catalogos-sat.js b/herramientas/extraer-catalogos-sat.js new file mode 100644 index 0000000..07e2f5b --- /dev/null +++ b/herramientas/extraer-catalogos-sat.js @@ -0,0 +1,13 @@ +const X=require('xlsx'),fs=require('fs'); +const [,,xls,out]=process.argv; +const wb=X.readFile(xls,{sheets:['c_ClaveProdServ','c_ClaveUnidad']}); +const filas=n=>X.utils.sheet_to_json(wb.Sheets[n],{header:1,defval:''}); +const csv=v=>{const s=String(v).replace(/\s+/g,' ').trim();return /[",]/.test(s)?'"'+s.replace(/"/g,'""')+'"':s}; +// Productos y servicios: desde el renglón de encabezados; solo vigentes (sin fecha fin) +let p=filas('c_ClaveProdServ'); let i=p.findIndex(r=>r[0]==='c_ClaveProdServ'); +const prod=p.slice(i+1).filter(r=>r[0]!==''&&r[1]&&r[6]==='').map(r=>[String(r[0]).padStart(8,'0'),r[1]]); +fs.writeFileSync(out+'/SAT_c_ClaveProdServ.csv','Clave,Descripcion\n'+prod.map(r=>r.map(csv).join(',')).join('\n')+'\n'); +let u=filas('c_ClaveUnidad'); i=u.findIndex(r=>r[0]==='c_ClaveUnidad'); +const uni=u.slice(i+1).filter(r=>r[0]!==''&&r[1]&&r[5]==='').map(r=>[String(r[0]),r[1],r[6]]); +fs.writeFileSync(out+'/SAT_c_ClaveUnidad.csv','Clave,Nombre,Simbolo\n'+uni.map(r=>r.map(csv).join(',')).join('\n')+'\n'); +console.log('prodserv vigentes',prod.length,'de',p.length-i-1,'| unidades vigentes',uni.length); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dde59e4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4097 @@ +{ + "name": "cotizador-helgen", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@google/clasp": "^3.4.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.7.tgz", + "integrity": "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.18.tgz", + "integrity": "sha512-wX1efcL8d7K5QapOTRsP/OLTA/kpwe4LwqWyNxDNg5iRs8i9jJbCyxB5P8jc4KOW5oiLzz2DJr+BRY5xMV9+bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/icu-skeleton-parser": "2.1.11" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.11.tgz", + "integrity": "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@formatjs/intl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-4.2.1.tgz", + "integrity": "sha512-GiL0cReencWQkhfJedNLMe0Aorb/wyTRJdi+hLgG9gsDPy4yw2N+EkMcijf5+oGKd5jde75tr5nujsPg78bUTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "3.1.7", + "@formatjs/icu-messageformat-parser": "3.5.18", + "intl-messageformat": "11.2.15" + } + }, + "node_modules/@google/clasp": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@google/clasp/-/clasp-3.4.1.tgz", + "integrity": "sha512-92wlpu0loC9t4oADuTyJOxQm6T4H2dOD9oQ+BvdFJuzM2uP7cK5dGrrJQhb/m/HLbaR0UOsBXBqRlYbfyR9jbA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@formatjs/intl": "^4.1.7", + "@modelcontextprotocol/sdk": "^1.30.0", + "chalk": "^5.4.1", + "chokidar": "^4.0.3", + "cli-truncate": "^4.0.0", + "commander": "^13.1.0", + "debug": "^4.4.0", + "fdir": "^6.4.4", + "find-up": "^7.0.0", + "fuzzy": "^0.1.3", + "google-auth-library": "10.5.0", + "googleapis": "^176.0.0", + "googleapis-common": "^8.0.3", + "inflection": "^3.0.2", + "inquirer": "^12.6.0", + "inquirer-autocomplete-standalone": "^0.8.1", + "json5": "^2.2.3", + "loud-rejection": "^2.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "open": "^10.1.2", + "ora": "^8.1.1", + "p-map": "^7.0.6", + "picomatch": "^4.0.5", + "read-package-up": "^11.0.0", + "server-destroy": "^1.0.1", + "split-lines": "^3.0.0", + "strip-bom": "^5.0.0", + "zod": "^3.25.76" + }, + "bin": { + "clasp": "build/src/index.js" + }, + "engines": { + "node": " >=20.0.0" + } + }, + "node_modules/@hono/node-server": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.5.tgz", + "integrity": "sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "hono": "^4 || ^5.0.0-0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz", + "integrity": "sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9 || ^2.0.5", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/mute-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.1.tgz", + "integrity": "sha512-0yQLzYhCqGz7CQPE3iDmYjhb7KMBFOP+tBkyw+/Y2YyDI5wpS7itXXxneN1zSsUwWx3Ji6YiVYrhAnpQGS/vkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/content-disposition": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.1.0", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.7.1.tgz", + "integrity": "sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/gaxios": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.3.1.tgz", + "integrity": "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz", + "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "gaxios": "7.1.3", + "google-logging-utils": "1.1.3", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.2.0.tgz", + "integrity": "sha512-WE9av4wKDZgRjBwgVUabocx8T6/7o3Ca1Fat46FXDhXVAFibzNadedcOXrdgd1Kzmk8tsk/9ZH89Wyf/SqeZ3A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/googleapis": { + "version": "176.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-176.0.0.tgz", + "integrity": "sha512-v24+WfeIw3R9iF8LT7eixlawezy5SGGNB/WjFV8qeiBS9G6KCsqaFngsnTXvBrVH4womehN2Co8UYJxZ0KpbvQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "10.5.0", + "googleapis-common": "^8.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/googleapis-common": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.3.tgz", + "integrity": "sha512-7g1yzQKx0mmNTjiK0H9dJ8eqKqDBveES9vLHeg5neb3BMQy/d1oQefIMhIpOVT8a+f+LOcixMEdRbFIW/cQUJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "7.1.3", + "google-auth-library": "10.5.0", + "google-logging-utils": "1.1.3", + "qs": "^6.7.0", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/googleapis-common/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/googleapis-common/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.13.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.13.tgz", + "integrity": "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflection": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-3.0.2.tgz", + "integrity": "sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.11.1.tgz", + "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/prompts": "^7.10.1", + "@inquirer/type": "^3.0.10", + "mute-stream": "^2.0.0", + "run-async": "^4.0.6", + "rxjs": "^7.8.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/inquirer-autocomplete-standalone": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-standalone/-/inquirer-autocomplete-standalone-0.8.1.tgz", + "integrity": "sha512-mlzwCTiXDX1Cw4yJL5PCq32k23XYLTK8K6BDFoL1a76iJeFB5ul6IoMU9spgdDagl2SM7P6ZaCNjj8VNXRDPOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@inquirer/core": "^3.1.1", + "@inquirer/type": "^1.1.2", + "figures": "^5.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/@inquirer/core": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-3.1.2.tgz", + "integrity": "sha512-lR2GaqBkp42Ew9BOAOqf2pSp+ymVES1qN8OC90WWh45yeoYLl0Ty1GyCxmkKqBJtq/+Ea1MF12AdFcZcpRNFsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^1.1.2", + "@types/mute-stream": "^0.0.1", + "@types/node": "^20.4.8", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.0", + "cli-width": "^4.1.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/@inquirer/core/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/inquirer-autocomplete-standalone/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/intl-messageformat": { + "version": "11.2.15", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.15.tgz", + "integrity": "sha512-W4VNytsXyWgW5lvVchmsb9xgA5rSKqoflu3/IQ9UCtB0z4R+Bx9MoEkwFT/+30RCl/KzUoH0QGGe9lppF5SuvQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/fast-memoize": "3.1.7", + "@formatjs/icu-messageformat-parser": "3.5.18" + } + }, + "node_modules/ip-address": { + "version": "10.7.4", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz", + "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jose": { + "version": "6.2.12", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz", + "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loud-rejection": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loud-rejection/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.1.1.tgz", + "integrity": "sha512-6Lh3jQPLthYujSrlw6ccWXBGZTkoTCz27Hd92g79LH/kjAbgoEu0t442cCCNbegPSJsA0lwDX8z0bcKtkpA32g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/qs": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.24.tgz", + "integrity": "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split-lines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-3.0.0.tgz", + "integrity": "sha512-d0TpRBL/VfKDXsk8JxPF7zgF5pCUDdBMSlEL36xBgVeaX448t+yGXcJaikUyzkoKOJ0l6KpMfygzJU9naIuivw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-5.0.0.tgz", + "integrity": "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true, + "license": "BSD" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..02bf2f5 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@google/clasp": "^3.4.1" + } +} diff --git a/tests/catalogo.test.js b/tests/catalogo.test.js new file mode 100644 index 0000000..54bc522 --- /dev/null +++ b/tests/catalogo.test.js @@ -0,0 +1,56 @@ +const fs=require('fs'),vm=require('vm'),assert=require('assert'); +const dir=process.argv[2]; +// Acepta Code.js (código actual) o Code.gs (código anterior). +const ext=fs.existsSync(dir+'/Code.js')?'js':'gs'; +const src=fs.readFileSync(dir+'/Logo.'+ext,'utf8')+'\n'+fs.readFileSync(dir+'/Code.'+ext,'utf8'); +const chain=new Proxy({}, {get:(t,k)=>k==='build'?()=>({}):()=>chain}); +function hoja(nombre,m){const h={m,nombre,getName:()=>nombre,setName(n){nombre=n;return h},getLastRow:()=>m.length, + getDataRange:()=>({getValues:()=>m.map(r=>r.slice())}),appendRow:a=>m.push(a),setFrozenRows(){},setColumnWidth(){}, + getParent:()=>({getUrl:()=>'https://sheets/catalogo'}), + getRange:(r,c,nr=1,nc=1)=>typeof r==='string'?{setNumberFormat(){return this},setDataValidation(){return this}}:({ + getValues:()=>m.slice(r-1,r-1+nr).map(x=>x.slice(c-1,c-1+nc)),getValue:()=>(m[r-1]||[])[c-1], + setValue(v){(m[r-1]=m[r-1]||[])[c-1]=v;return this}, + setValues(vs){vs.forEach((x,i)=>{m[r-1+i]=m[r-1+i]||[];x.forEach((y,j)=>m[r-1+i][c-1+j]=y)});return this}, + setFontWeight(){return this},setBackground(){return this},setFontColor(){return this}})};return h} +const vieja=hoja('Catalogo',[['Clave','Descripción','Unidad','Precio unitario'],['EJ-001','Producto de ejemplo (bórrame)','PZA',1000],['car-7','Cargador 7 kW','PZA',15000]]); +const dbSheets={Catalogo:vieja,Config:hoja('Config',[['Clave','Valor']].concat([])),Cotizaciones:hoja('Cotizaciones',[['Folio']])}; +let borradas=[],creados=0,catSS; +const db={getId:()=>'db',getSheetByName:n=>dbSheets[n]||null,getSheets:()=>Object.values(dbSheets),deleteSheet:h=>{borradas.push(h.getName());delete dbSheets[h.getName()]}}; +const props={SPREADSHEET_ID:'db',FOLDER_ID:'f'}; +const ctx={console,Date, + PropertiesService:{getScriptProperties:()=>({getProperty:k=>props[k]??null,setProperty:(k,v)=>props[k]=v})}, + LockService:{getScriptLock:()=>({tryLock:()=>true,releaseLock(){}})}, + Session:{getActiveUser:()=>({getEmail:()=>'efrain@helgen.tech'})}, + SpreadsheetApp:{flush(){},newDataValidation:()=>chain, + create:n=>{creados++;const h=hoja('Hoja 1',[]);catSS={getId:()=>'cat',getSheets:()=>[h],getSheetByName:x=>h.getName()===x?h:null,h};return catSS}, + openById:id=>id==='cat'?catSS:db}, + DriveApp:{getFileById:id=>({getParents:()=>({hasNext:()=>true,next:()=>'carpeta'}),moveTo(){}})}, +}; +vm.createContext(ctx); vm.runInContext(src,ctx); +// Lógica pura +assert.throws(()=>ctx.normalizarProducto({descripcion:'x',precio:1}),/clave/); +assert.throws(()=>ctx.normalizarProducto({clave:'a',precio:1}),/descripción/); +assert.throws(()=>ctx.normalizarProducto({clave:'a',descripcion:'x',precio:''}),/obligatorio/); +assert.throws(()=>ctx.normalizarProducto({clave:'a',descripcion:'x',precio:-1}),/negativo/); +assert.deepEqual({...ctx.normalizarProducto({clave:' ab-1 ',descripcion:' Panel ',unidad:'',precio:'10.005'})},{clave:'AB-1',descripcion:'Panel',unidad:'PZA',precio:10.01,claveSat:'',unidadSat:''}); +assert.equal(ctx.indiceDeClave(['X','Ab-1 '],'ab-1'),1); assert.equal(ctx.indiceDeClave(['X'],''),-1); +// Creación + migración +let r=ctx.getCatalogo(); +assert.equal(creados,1); assert.equal(props.CATALOGO_ID,'cat'); assert.deepEqual(borradas,['Catalogo']); +assert.deepEqual(r.productos.map(p=>p.clave),['CAR-7'],'migra sin el ejemplo y normaliza clave'); +ctx.getCatalogo(); assert.equal(creados,1,'no crea otro archivo'); +// Alta +r=ctx.guardarProducto({clave:'pan-550',descripcion:'Panel solar 550 W',unidad:'pza',precio:'4200'}); +assert.equal(r.clave,'PAN-550'); assert.equal(r.productos.length,2); +// Duplicado (otra capitalización) +assert.throws(()=>ctx.guardarProducto({clave:'Pan-550',descripcion:'Otro',precio:1}),/ya existe/); +// Edición de precio +r=ctx.guardarProducto({clave:'PAN-550',descripcion:'Panel solar 550 W',precio:4100,claveOriginal:'PAN-550'}); +assert.equal(r.productos.find(p=>p.clave==='PAN-550').precio,4100); assert.equal(r.productos.length,2); +// Cambio de clave hacia una existente: error; hacia una nueva: ok sin duplicar +assert.throws(()=>ctx.guardarProducto({clave:'CAR-7',descripcion:'x',precio:1,claveOriginal:'PAN-550'}),/ya existe/); +r=ctx.guardarProducto({clave:'PAN-550M',descripcion:'Panel solar 550 W mono',precio:4100,claveOriginal:'PAN-550'}); +assert.deepEqual(r.productos.map(p=>p.clave),['CAR-7','PAN-550M']); +assert.throws(()=>ctx.guardarProducto({clave:'Z',descripcion:'x',precio:1,claveOriginal:'NOEXISTE'}),/ya no existe/); +assert.equal(catSS.h.m[2][5],'efrain@helgen.tech'); assert.equal(catSS.h.m[0][3],'Precio unitario (sin IVA)'); +console.log('OK catálogo', r.productos.map(p=>p.clave+' '+p.precio).join(', ')); diff --git a/tests/cotizacion.test.js b/tests/cotizacion.test.js new file mode 100644 index 0000000..30c721e --- /dev/null +++ b/tests/cotizacion.test.js @@ -0,0 +1,74 @@ +const fs=require('fs'),vm=require('vm'),assert=require('assert'); +// Acepta Code.js (código actual) o Code.gs (código anterior); Logo con la misma extensión. +const src=fs.readFileSync(process.argv[2].replace(/Code\.(js|gs)$/,'Logo.$1'),'utf8')+'\n'+fs.readFileSync(process.argv[2],'utf8'); +// Hoja simulada (matriz) con getRange(fila,col,nf,nc) / getRange('B:B') +function hoja(m){return{m,getLastRow:()=>m.length,getDataRange:()=>({getValues:()=>m.map(r=>r.slice())}), + appendRow:a=>m.push(a), + getRange:(r,c,nr=1,nc=1)=>typeof r==='string'?{setNumberFormat(){}}:({ + getValues:()=>m.slice(r-1,r-1+nr).map(x=>x.slice(c-1,c-1+nc)), + getValue:()=>(m[r-1]||[])[c-1], + setValue(v){m[r-1][c-1]=v;return this},setValues(vs){vs.forEach((x,i)=>{m[r-1+i]=m[r-1+i]||[];x.forEach((y,j)=>m[r-1+i][c-1+j]=y)});return this}, + setFontWeight(){return this},setBackground(){return this},setFontColor(){return this}})}} +const cfg=hoja([['Clave','Valor'],['EMPRESA_NOMBRE','Helgen Technologies'],['EMPRESA_RFC','XAXX010101000'],['EMPRESA_WEB','helgen.tech'],['EMPRESA_TELEFONO','#ERROR!'],['EMPRESA_EMAIL','contacto@helgen.tech'],['PREFIJO_FOLIO','HLG'],['IVA_TASA',0.16], + ['TERMINOS','Metraje adicional...\nCualquier trabajo o material fuera del alcance descrito se cotizará por separado.']]); +const cot=hoja([['Folio','Fecha','Cliente','Empresa','RFC','Correo','Teléfono','Subtotal','IVA','Total','Elaboró','PDF','Conceptos (JSON)','Notas']]); +const props={SPREADSHEET_ID:'x',FOLDER_ID:'y'},cache={},pdfs=[]; +const ctx={console,Date, + PropertiesService:{getScriptProperties:()=>({getProperty:k=>props[k]??null,setProperty:(k,v)=>props[k]=v})}, + CacheService:{getScriptCache:()=>({get:k=>cache[k]??null,put:(k,v)=>cache[k]=v})}, + LockService:{getScriptLock:()=>({tryLock:()=>true,releaseLock(){}})}, + Session:{getActiveUser:()=>({getEmail:()=>'efrain@helgen.tech'})}, + Utilities:{formatDate:(d,tz,f)=>f==='yyyy'?'2026':'15/10/2026',newBlob:h=>({getAs:()=>({setName:n=>({name:n,html:h})})}),base64Encode:()=>''}, + SpreadsheetApp:{flush(){},openById:()=>({getSheetByName:n=>n==='Config'?cfg:cot})}, + DriveApp:{getFolderById:()=>({getFoldersByName:()=>({hasNext:()=>true,next:()=>({createFile:b=>{pdfs.push(b);return{getUrl:()=>'u'}}})})})}, +}; +vm.createContext(ctx); vm.runInContext(src,ctx); +// Código con sesión (Fase 2): guardar exige un vendedor verificado; aquí se simula uno. +if (/let VENDEDOR_\b/.test(src)) vm.runInContext("VENDEDOR_ = {email:'efrain@helgen.tech',nombre:'Efrain',apellido:'Sosa'}", ctx); +const base={cliente:{nombre:'Ana',telefono:'+52 55 1234 5678'},items:[{descripcion:'Servicio',cantidad:1,precio:100}]}; +ctx.guardarCotizacion({...base,idSolicitud:'h1'}); +ctx.guardarCotizacion({...base,marca:'energy',idSolicitud:'e1'}); +// Migración de Config +const claves=cfg.m.map(r=>r[0]); +assert(!claves.includes('TERMINOS')&&claves.includes('TERMINOS_HELGEN')&&claves.includes('TERMINOS_ENERGY')); +const val=k=>cfg.m.find(r=>r[0]===k)[1]; +assert.equal(val('EMPRESA_TELEFONO'),'+52 442 644 5391'); assert.equal(val('EMPRESA_RFC'),'HSE240304PC1'); +assert.equal(val('EMPRESA_NOMBRE'),'Helgen Servicios Especializados'); +// Migrar de nuevo no duplica +ctx.guardarCotizacion({...base,idSolicitud:'h2'}); assert.equal(cfg.m.filter(r=>r[0]==='TERMINOS_HELGEN').length,1); +// PDF Helgen: solo vigencia +const [h,e]=pdfs.map(p=>p.html); +const li=x=>(x.match(/
  • /g)||[]).length; +assert.equal(li(h),1); assert(h.includes('Precios vigentes por 15 días o hasta agotar existencias')); +assert(!h.includes('Metraje')&&!h.includes('alcance')&&!h.includes('HELGEN ENERGY')&&!h.includes('#ERROR')); +assert.equal(li(e),4); assert(e.includes('Metraje adicional')&&e.includes('Obra civil')&&e.includes('HELGEN ENERGY')&&!e.includes('alcance')); +// Hoja Cotizaciones +assert.equal(cot.m[0][14],'Marca'); assert.equal(cot.m[0][15],'Dirección'); assert.equal(cot.m[1][14],'Helgen'); assert.equal(cot.m[2][14],'Helgen Energy'); +assert.equal(cot.m[1][6],"'+52 55 1234 5678"); +assert.deepEqual(cot.m.slice(1).map(r=>r[0]),['HLG-2026-0001','HLG-2026-0002','HLG-2026-0003']); +assert.equal(ctx.guardarCotizacion({...base,idSolicitud:'h1'}).folio,'HLG-2026-0001','reenvío = mismo folio'); +delete props.CONSECUTIVO_2026; assert.equal(ctx.guardarCotizacion({...base,idSolicitud:'z'}).folio,'HLG-2026-0004','contador borrado no repite'); +fs.writeFileSync(process.argv[3]+'/helgen.html',h); fs.writeFileSync(process.argv[3]+'/energy.html',e); +assert(h.includes('data:image/png;base64,iVBOR')&&h.includes('#2C3C5B')&&h.includes('#51F3DA')&&!/#0B1C3F|#4CAF50/.test(h)); +assert(h.includes('HSE240304PC1')&&h.includes('Sendero del Regocijo 32 int 1')); +// Clientes +const F=(fecha,n,e,rfc,mail,tel,dir)=>{const r=['F',fecha,n,e,rfc,mail,tel];r[15]=dir;return r}; +let cl=ctx.clientesDesdeFilas([ + F('01/10/2026','Juan Pérez','Acme','', 'j@a.com','', 'Calle 1'), + F('02/10/2026','juan perez','ACME','AAA010101AAA','', '442 1', ''), // mismo cliente (acentos/mayúsculas/espacios) + F('03/10/2026','Juan Pérez','Otra SA','', '', '', ''), // mismo nombre, otra empresa + F('04/10/2026','Ana','','', '', '', ''), + F('05/10/2026','','SinNombre','', '', '', ''), +]); +assert.equal(cl.length,3); +assert.deepEqual(cl.map(c=>c.etiqueta),['Ana','Juan Pérez — Otra SA','juan perez — ACME']); +const acme=cl.find(c=>/acme/i.test(c.empresa)); +assert.equal(acme.cotizaciones,2); assert.equal(acme.rfc,'AAA010101AAA'); assert.equal(acme.email,'j@a.com','dato vacío no borra el anterior'); +assert.equal(acme.direccion,'Calle 1'); assert.equal(acme.telefono,'442 1'); assert.equal(acme.ultimaFecha,'02/10/2026'); +assert.deepEqual([...ctx.clientesDesdeFilas([F('x','Solo','','','','','')])].map(c=>c.etiqueta),['Solo']); +// Desde la hoja: el cliente guardado aparece con su dirección; si se borran sus filas desaparece +ctx.guardarCotizacion({cliente:{nombre:'Luis',empresa:'Solar MX',direccion:'Av. 5'},items:[{descripcion:'x',cantidad:1,precio:1}],idSolicitud:'cl1'}); +let lc=ctx.getClientes(); const luis=lc.find(c=>c.nombre==='Luis'); +assert(luis&&luis.direccion==='Av. 5'&&luis.empresa==='Solar MX'); assert.equal(lc[0].nombre,'Luis','más reciente primero'); +cot.m.splice(1); assert.equal(ctx.getClientes().length,0,'sin filas = sin sugerencias'); +console.log('OK'); diff --git a/tests/probar-busqueda-sat.js b/tests/probar-busqueda-sat.js new file mode 100644 index 0000000..80e24eb --- /dev/null +++ b/tests/probar-busqueda-sat.js @@ -0,0 +1,10 @@ +const fs=require('fs'),vm=require('vm'); +const ctx={console};vm.createContext(ctx);vm.runInContext(fs.readFileSync(process.argv[2],'utf8'),ctx); +function csv(t){return t.trim().split('\n').slice(1).map(l=>{const m=l.match(/^([^,]*),(.*)$/);return [m[1],m[2].replace(/^"|"$/g,'').replace(/""/g,'"')]})} +const filas=csv(fs.readFileSync(process.argv[3],'utf8')); +const qs=['Panel solar 550 W','Inversor híbrido 5 kW','Cargador para vehículo eléctrico 7 kW','Estación de carga para auto eléctrico', + 'Instalación de paneles solares','Mantenimiento preventivo','Cable de cobre calibre 10','Servicio de rastreo GPS vehicular', + 'Limpieza de patios','Batería de litio','Estructura de aluminio para paneles','Centro de carga','Mano de obra eléctrica']; +console.time('13 búsquedas'); +for(const q of qs){const r=ctx.buscarClavesSat(q,filas,5);console.log('\n» '+q);r.forEach(x=>console.log(' '+x.clave+' '+x.puntaje.toFixed(2)+' '+x.descripcion))} +console.timeEnd('13 búsquedas'); diff --git a/tests/sat.test.js b/tests/sat.test.js new file mode 100644 index 0000000..0365285 --- /dev/null +++ b/tests/sat.test.js @@ -0,0 +1,61 @@ +const fs=require('fs'),vm=require('vm'),assert=require('assert'); +const dir=process.argv[2], csvDir=process.argv[3]; +// Acepta Code.js (código actual) o Code.gs (código anterior). +const ext=fs.existsSync(dir+'/Code.js')?'js':'gs'; +const src=fs.readFileSync(dir+'/Logo.'+ext,'utf8')+'\n'+fs.readFileSync(dir+'/Code.'+ext,'utf8'); +const chain=new Proxy({}, {get:(t,k)=>k==='build'?()=>({}):()=>chain}); +function hoja(nombre,m){const h={m,getName:()=>nombre,setName(n){nombre=n;return h},getLastRow:()=>m.length,getMaxRows:()=>Math.max(1000,m.length), + insertRowsAfter(){},getDataRange:()=>({getValues:()=>m.map(r=>r.slice())}),appendRow:a=>m.push(a),setFrozenRows(){},setColumnWidth(){}, + getParent:()=>({getUrl:()=>'https://sheets/x'}), + getRange:(r,c,nr=1,nc=1)=>typeof r==='string'?{setNumberFormat(){return this},setDataValidation(){return this}}:({ + getValues:()=>Array.from({length:nr},(_,i)=>Array.from({length:nc},(_,j)=>((m[r-1+i]||[])[c-1+j]??''))), + getValue:()=>(m[r-1]||[])[c-1], + setValues(vs){vs.forEach((x,i)=>{m[r-1+i]=m[r-1+i]||[];x.forEach((y,j)=>m[r-1+i][c-1+j]=y)});return this}, + setFontWeight(){return this},setBackground(){return this},setFontColor(){return this}, + createTextFinder:t=>({matchEntireCell:()=>({findNext:()=>m.slice(r-1,r-1+nr).some(x=>String(x[c-1])===t)?{}:null})})})};return h} +function libro(id,hojas){return{getId:()=>id,getSheets:()=>hojas,getSheetByName:n=>hojas.find(h=>h.getName()===n)||null, + insertSheet(n){const h=hoja(n||'Hoja',[]);hojas.push(h);return h}}} +const parseCsv=t=>t.trim().split('\n').map(l=>{const out=[];let cur='',q=false;for(let i=0;i({getProperty:k=>props[k]??null,setProperty:(k,v)=>props[k]=v})}, + CacheService:{getScriptCache:()=>({get:k=>cache[k]??null,put:(k,v)=>cache[k]=v})}, + LockService:{getScriptLock:()=>({tryLock:()=>true,releaseLock(){}})}, + Session:{getActiveUser:()=>({getEmail:()=>'efrain@helgen.tech'})}, + Utilities:{parseCsv,formatDate:(d,tz,f)=>f==='yyyy'?'2026':'15/10/2026',newBlob:h=>({getAs:()=>({setName:n=>({name:n,html:h})})}),base64Encode:()=>''}, + SpreadsheetApp:{flush(){},newDataValidation:()=>chain,create:n=>{nuevo++;const l=libro('sat',[hoja('Hoja 1',[])]);libros.sat=l;return l},openById:id=>libros[id]}, + DriveApp:{getFilesByName:n=>{let d=false;return{hasNext:()=>!d&&!!archivos[n],next:()=>{d=true;return{isTrashed:()=>false,getParents:()=>({next:()=>({})}),getBlob:()=>({getDataAsString:()=>archivos[n]})}}}}, + getFileById:()=>({moveTo(){},getParents:()=>({hasNext:()=>false})}), + getFolderById:()=>({getFoldersByName:()=>({hasNext:()=>true,next:()=>({createFile:b=>({getUrl:()=>'u'})})})})}, +}; +vm.createContext(ctx); vm.runInContext(src,ctx); +// Código con sesión (Fase 2): guardar exige un vendedor verificado; aquí se simula uno. +if (/let VENDEDOR_\b/.test(src)) vm.runInContext("VENDEDOR_ = {email:'efrain@helgen.tech',nombre:'Efrain',apellido:'Sosa'}", ctx); +// Columnas SAT agregadas a un catálogo existente +let r=ctx.getCatalogo(); assert.equal(cat.m[0][6],'Clave SAT'); assert.equal(cat.m[0][7],'Unidad SAT'); +assert.equal(nuevo,1,'importa el catálogo SAT una vez'); assert(r.unidadesSat.length>2000); +assert.equal(libros.sat.getSheetByName('ClaveProdServ').m.length,52514); assert.equal(libros.sat.getSheetByName('ClaveProdServ').m[1][0],'01010101'); +ctx.getCatalogo(); assert.equal(nuevo,1); +// Sugerencias +let s=ctx.sugerirClavesSat('Panel solar 550 W'); assert(s.some(x=>x.clave==='26111607'),'sugiere generadores solares'); +assert.deepEqual(s.map(x=>x.clave).length,8); +assert.equal(ctx.sugerirClavesSat('26111607')[0].descripcion,'Generadores solares'); +assert.equal(ctx.sugerirClavesSat('1010101')[0].clave,'01010101','repone el cero'); +// Validación al guardar +assert.throws(()=>ctx.guardarProducto({clave:'PAN-550',descripcion:'Panel',precio:1,claveSat:'99999999',claveOriginal:'PAN-550'}),/no existe/); +assert.throws(()=>ctx.guardarProducto({clave:'PAN-550',descripcion:'Panel',precio:1,unidadSat:'ZZZ',claveOriginal:'PAN-550'}),/no existe/); +assert.throws(()=>ctx.guardarProducto({clave:'PAN-550',descripcion:'Panel',precio:1,claveSat:'12ab'}),/8 dígitos/); +r=ctx.guardarProducto({clave:'PAN-550',descripcion:'Panel solar 550 W',precio:4200,claveSat:'26111607',unidadSat:'h87',claveOriginal:'PAN-550'}); +const p=r.productos[0]; assert.equal(p.claveSat,'26111607'); assert.equal(p.unidadSat,'H87'); assert.equal(cat.m[1][6],'26111607'); +// Sin datos SAT sigue siendo válido +ctx.guardarProducto({clave:'SERV-1',descripcion:'Servicio sin clasificar',precio:100}); +// Cotización: el concepto del catálogo guarda su clave SAT en el JSON, y el PDF no la muestra +const res=ctx.guardarCotizacion({cliente:{nombre:'Ana'},items:[{clave:'pan-550',descripcion:'Panel solar 550 W',cantidad:2,precio:4200},{descripcion:'Libre',cantidad:1,precio:5}],idSolicitud:'s1'}); +const items=JSON.parse(cot.m[1][12]); assert.equal(items[0].claveSat,'26111607'); assert.equal(items[0].unidadSat,'H87'); assert(!('claveSat' in items[1])); +console.log('OK SAT', res.folio); diff --git a/tests/sesion.test.js b/tests/sesion.test.js new file mode 100644 index 0000000..cb9f300 --- /dev/null +++ b/tests/sesion.test.js @@ -0,0 +1,89 @@ +// Sesión con Google en doPost y columnas vendedor_*. +// Uso: node tests/sesion.test.js . (carpeta con Code.js y Logo.js) +const fs=require('fs'),vm=require('vm'),assert=require('assert'),path=require('path'); +const dir=process.argv[2]; +let src=fs.readFileSync(path.join(dir,'Logo.js'),'utf8')+'\n'+fs.readFileSync(path.join(dir,'Code.js'),'utf8'); +const CID='123-abc.apps.googleusercontent.com'; +src=src.replace(/const CLIENT_ID_GOOGLE = '[^']*';/,"const CLIENT_ID_GOOGLE = '"+CID+"';"); +function hoja(m){return{m,getLastRow:()=>m.length,getDataRange:()=>({getValues:()=>m.map(r=>r.slice()),getDisplayValues:()=>m.map(r=>r.map(x=>x instanceof Date?'19/10/2026':String(x??'')))}), + appendRow:a=>m.push(a), + getRange:(r,c,nr=1,nc=1)=>typeof r==='string'?{setNumberFormat(){}}:({ + getValues:()=>m.slice(r-1,r-1+nr).map(x=>{const f=x.slice(c-1,c-1+nc);while(f.length{m[r-1+i]=m[r-1+i]||[];x.forEach((y,j)=>m[r-1+i][c-1+j]=y)});return this}, + setFontWeight(){return this},setBackground(){return this},setFontColor(){return this}})}} +const cfg=hoja([['Clave','Valor'],['PREFIJO_FOLIO','HLG'],['IVA_TASA',0.16]]); +// Hoja con una fila vieja (sin columnas vendedor_*) +const cot=hoja([['Folio','Fecha','Cliente','Empresa','RFC','Correo','Teléfono','Subtotal','IVA','Total','Elaboró','PDF','Conceptos (JSON)','Notas','Marca','Dirección'], + ['HLG-2026-0001','x','Viejo','','','','',1,0.16,1.16,'antes@helgen.tech','u','[]','','Helgen','']]); +const props={SPREADSHEET_ID:'x',FOLDER_ID:'y',CATALOGO_ID:'c'},cache={}; +const ahora=Math.floor(Date.now()/1000); +const BUENO={aud:CID,iss:'https://accounts.google.com',exp:String(ahora+3000),email:'Ana.Lopez@helgen.tech',email_verified:'true',hd:'helgen.tech',given_name:'Ana',family_name:'López Díaz'}; +const tokens={'t-bueno':BUENO,'t-gmail':{...BUENO,email:'ana@gmail.com',hd:undefined},'t-otro-aud':{...BUENO,aud:'otro.apps.googleusercontent.com'}, + 't-otro-dominio':{...BUENO,email:'x@otra.com',hd:'otra.com'}}; +let fetches=0; +const ctx={console,Date,JSON, + PropertiesService:{getScriptProperties:()=>({getProperty:k=>props[k]??null,setProperty:(k,v)=>props[k]=v})}, + CacheService:{getScriptCache:()=>({get:k=>cache[k]??null,put:(k,v)=>cache[k]=v})}, + LockService:{getScriptLock:()=>({tryLock:()=>true,releaseLock(){}})}, + Session:{getActiveUser:()=>({getEmail:()=>''})}, // despliegue anónimo: Google no da el correo + Utilities:{formatDate:(d,tz,f)=>f==='yyyy'?'2026':'19/10/2026',newBlob:h=>({getAs:()=>({setName:n=>({name:n,html:h})})}), + base64Encode:b=>Buffer.from(b).toString('base64'),DigestAlgorithm:{SHA_256:'sha256'}, + computeDigest:(a,s)=>[...require('crypto').createHash('sha256').update(s).digest()]}, + UrlFetchApp:{fetch:url=>{fetches++;const t=decodeURIComponent(url.split('id_token=')[1]);const c=tokens[t]; + return{getResponseCode:()=>c?200:400,getContentText:()=>JSON.stringify(c||{error:'invalid_token'})}}}, + ContentService:{MimeType:{JSON:'json'},createTextOutput:t=>({t,setMimeType(){return this}})}, + SpreadsheetApp:{flush(){},openById:id=>id==='c'?{getSheetByName:()=>hoja([['Clave','Descripción','Unidad','Precio unitario (sin IVA)','Actualizado','Actualizó','Clave SAT','Unidad SAT']]),getUrl:()=>'cat'}:{getSheetByName:n=>n==='Config'?cfg:cot}}, + DriveApp:{getFolderById:()=>({getFoldersByName:()=>({hasNext:()=>true,next:()=>({createFile:()=>({getUrl:()=>'u'})})})})}, +}; +vm.createContext(ctx); vm.runInContext(src,ctx); +const post=(cuerpo)=>JSON.parse(ctx.doPost({postData:{contents:typeof cuerpo==='string'?cuerpo:JSON.stringify(cuerpo)}}).t); +const base={cliente:{nombre:'Cliente Uno'},items:[{descripcion:'Servicio',cantidad:1,precio:100}]}; + +// --- validarClaimsToken (lógica pura) --- +const v=(c)=>ctx.validarClaimsToken(c,CID,'helgen.tech',ahora); +assert.deepEqual({...v(BUENO)},{email:'ana.lopez@helgen.tech',nombre:'Ana',apellido:'López Díaz'}); +assert.deepEqual({...v({...BUENO,given_name:'',family_name:'',name:'Luis Pérez Gómez'})},{email:'ana.lopez@helgen.tech',nombre:'Luis',apellido:'Pérez Gómez'}); +assert.equal(v({...BUENO,email_verified:true}).email,'ana.lopez@helgen.tech'); +for(const [malo,msg] of [[{aud:'otro'},/no corresponde/],[{iss:'evil.com'},/inválida/],[{exp:String(ahora-1)},/expiró/], + [{hd:undefined,email:'ana@gmail.com'},/@helgen.tech/],[{hd:'otra.com'},/@helgen.tech/],[{email_verified:'false'},/@helgen.tech/], + [{email:'ana@helgen.tech.mx'},/@helgen.tech/]]){ + assert.throws(()=>v({...BUENO,...malo}),e=>e.sesion===true&&msg.test(e.message),JSON.stringify(malo)); +} + +// --- doPost rechaza sin token válido y no ejecuta nada --- +const filasAntes=cot.m.length; +for(const tok of [undefined,'','t-falso','t-gmail','t-otro-aud','t-otro-dominio']){ + const r=post({funcion:'guardarCotizacion',args:[{...base,idSolicitud:'x-'+tok}],token:tok}); + assert.equal(r.ok,false,String(tok)); assert.equal(r.codigo,'SESION',String(tok)); +} +assert.equal(cot.m.length,filasAntes,'sin sesión no se guarda nada'); +assert.equal(post('no es json').ok,false); +assert.equal(post({funcion:'setup',token:'t-bueno'}).error,'Función no permitida: setup.'); +assert.equal(post({funcion:'guardarCotizacion',args:[base]}).codigo,'SESION'); + +// --- Guardar con token válido: vendedor del token, aunque el navegador mande otro --- +fetches=0; +const r=post({funcion:'guardarCotizacion',token:'t-bueno', + args:[{...base,idSolicitud:'ok1',vendedor_email:'impostor@helgen.tech',vendedor:{email:'impostor@helgen.tech',nombre:'X'},elaboro:'impostor@helgen.tech'}]}); +assert(r.ok,r.error); assert.equal(r.datos.folio,'HLG-2026-0002'); +const enc=cot.m[0]; assert.deepEqual(enc.slice(16),['vendedor_email','vendedor_nombre','vendedor_apellido']); +const fila=cot.m[cot.m.length-1]; +assert.equal(fila[10],'ana.lopez@helgen.tech','Elaboró = correo del token'); +assert.deepEqual(fila.slice(16),['ana.lopez@helgen.tech','Ana','López Díaz']); +assert(!JSON.stringify(fila).includes('impostor')); +// Caché: el token ya se verificó (en la llamada a setup); no se vuelve a consultar a Google +assert.equal(post({funcion:'listarCotizaciones',args:[''],token:'t-bueno'}).ok,true); assert.equal(fetches,0); +// Reenvío del mismo formulario = mismo folio (idempotencia intacta) +assert.equal(post({funcion:'guardarCotizacion',args:[{...base,idSolicitud:'ok1'}],token:'t-bueno'}).datos.folio,'HLG-2026-0002'); + +// --- Historial con el nombre del vendedor; filas viejas muestran el correo de "Elaboró" --- +const h=post({funcion:'listarCotizaciones',args:[''],token:'t-bueno'}).datos; +assert.equal(h[0].vendedor,'Ana López Díaz'); assert.equal(h[1].vendedor,'antes@helgen.tech'); +// Datos iniciales: usuario = correo del token +const d=post({funcion:'getDatosIniciales',args:[],token:'t-bueno'}).datos; +assert.equal(d.usuario,'ana.lopez@helgen.tech'); assert.equal(d.vendedor.nombre,'Ana'); +// Fuera de doPost (sin token) guardar se rechaza +assert.throws(()=>ctx.guardarCotizacion({...base,idSolicitud:'directo'}),/Inicia sesión/); +// doGet ya no sirve la app +assert(/solo la API/.test(ctx.doGet().t)); +console.log('OK'); diff --git a/web/.assetsignore b/web/.assetsignore new file mode 100644 index 0000000..9a62535 --- /dev/null +++ b/web/.assetsignore @@ -0,0 +1,2 @@ +Icon* +.DS_Store diff --git a/web/cotizador/index.html b/web/cotizador/index.html new file mode 100644 index 0000000..794cd3c --- /dev/null +++ b/web/cotizador/index.html @@ -0,0 +1,615 @@ + + + + + + + +Cotizador Helgen + + + + + +
    + Helgen +

    COTIZADOR

    + +
    + + +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    +

    1 · Datos del cliente

    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    2 · Conceptos

    + + + + + + + + + +
    ClaveDescripciónUnidadCant.P. UnitarioImporte
    + +
    + +
    +

    3 · Resumen

    +
    +
    + + +
    +
    +
    Subtotal$0.00
    +
    IVA (16%)$0.00
    +
    TOTAL$0.00
    + +
    +
    +
    +
    + + +
    +
    +

    Historial de cotizaciones

    + + + + +
    FolioFechaClienteEmpresaTotalVendedorPDF
    +
    +
    + + +
    +
    +

    Agregar producto

    +
    +
    +
    +
    +
    +
    + +
    +
    Datos para facturación (SAT) · uso interno de contabilidad, no aparecen en el PDF
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + Haz clic en un producto de la lista para editarlo. +
    +
    + +
    +

    Productos

    + + + + +
    ClaveDescripciónUnidadPrecio sin IVAClave SAT
    +
    +
    +
    + + + + + + + diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..9b3ea1d --- /dev/null +++ b/web/index.html @@ -0,0 +1,105 @@ + + + + + +Cotizador Helgen + + + + + + + + + +
    + Helgen +
    +
    +
    +

    Cotizador Helgen

    +

    Crea cotizaciones de Helgen y Helgen Energy, consulta el historial y el catálogo de productos.

    + Abrir el cotizador +

    Entra con tu cuenta @helgen.tech.

    +
    +
    + + + diff --git a/web/logo-helgen-blanco.png b/web/logo-helgen-blanco.png new file mode 100644 index 0000000..6bb429a Binary files /dev/null and b/web/logo-helgen-blanco.png differ diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..f40cec0 --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,9 @@ +// Página de acceso al cotizador en Cloudflare (Worker solo con archivos estáticos, sin código). +// Publicar: npx wrangler@4 deploy +{ + "name": "cotizador-helgen", + "compatibility_date": "2026-10-19", + "assets": { + "directory": "./web" + } +}