pax_global_header00006660000000000000000000000064147166563170014532gustar00rootroot0000000000000052 comment=799e84b716d0e03db80db5d5b0dcdd15b9d555fc husky-9.1.7/000077500000000000000000000000001471665631700127135ustar00rootroot00000000000000husky-9.1.7/.editorconfig000066400000000000000000000001411471665631700153640ustar00rootroot00000000000000root = true [*.{json,js,ts,sh}] end_of_line = lf indent_style = tab insert_final_newline = false husky-9.1.7/.gitattributes000066400000000000000000000000411471665631700156010ustar00rootroot00000000000000*.sh linguist-language=JavaScripthusky-9.1.7/.github/000077500000000000000000000000001471665631700142535ustar00rootroot00000000000000husky-9.1.7/.github/FUNDING.yml000066400000000000000000000000501471665631700160630ustar00rootroot00000000000000github: typicode open_collective: husky husky-9.1.7/.github/ISSUE_TEMPLATE/000077500000000000000000000000001471665631700164365ustar00rootroot00000000000000husky-9.1.7/.github/ISSUE_TEMPLATE/issue.md000066400000000000000000000010501471665631700201040ustar00rootroot00000000000000--- name: Issue about: Please use this template for issues title: '' labels: '' assignees: '' --- **Troubleshoot** - [ ] Before creating an issue, please check: https://typicode.github.io/husky/troubleshoot.html If you're migrating from husky 4, see: https://typicode.github.io/husky/migrate-from-v4.html **Context** Please describe your issue and provide some context: - Terminal or GUI client (PowerShell, Git Bash, GitHub Desktop, ...) - If applicable, content of the failing hook - If possible, minimal steps to reproduce the issue Thank you! husky-9.1.7/.github/README.md000066400000000000000000000054771471665631700155470ustar00rootroot00000000000000# husky [![](https://img.shields.io/npm/dm/husky.svg?style=flat)](https://www.npmjs.org/package/husky) [![Node.js CI](https://github.com/typicode/husky/workflows/Node.js%20CI/badge.svg)](https://github.com/typicode/husky/actions) > Modern native Git hooks made easy Husky improves your commits and more 🐶 _woof!_ 👋 _Hey! Using React, Vue or Astro? Check my new project [MistCSS](https://github.com/typicode/mistcss) to write 50% less code._ ## Features - Just `2 kB` (📦 _gzipped_) with no dependencies - Extremely fast (runs in `~1ms`) - Uses new Git feature (`core.hooksPath`) - Supports: - macOS, Linux, Windows - Git GUIs, Node version managers, custom hooks directory, nested projects, monorepos - [All 13 client-side Git hooks](https://git-scm.com/docs/githooks) And more: - Branch-specific hooks - Use POSIX shell to script advanced cases - Adheres to Git's native hook organization - Aligns with [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) best practices using `prepare` script - Opt-in/opt-out options - User-friendly error messages ## Changelog [Check out the v9 changelog](https://github.com/typicode/husky/releases/tag/v9.0.1) to discover all the new and improved features! ## Documentation https://typicode.github.io/husky **Important** Upgrading from v4 to v9 requires migrating previous config, please see the docs. ## Sponsors Support this project by becoming a sponsor [here](https://github.com/sponsors/typicode) 💖 ### Special Sponsor


Get rewards for your open-source contributions

### GitHub

### Open Collective husky-9.1.7/.github/workflows/000077500000000000000000000000001471665631700163105ustar00rootroot00000000000000husky-9.1.7/.github/workflows/deploy.yml000066400000000000000000000037141471665631700203340ustar00rootroot00000000000000# Sample workflow for building and deploying a VitePress site to GitHub Pages # name: Deploy VitePress site to Pages on: # Runs on pushes targeting the `main` branch. Change this to `master` if you're # using the `master` branch as the default branch. push: branches: [main] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: pages cancel-in-progress: false jobs: # Build job build: runs-on: ubuntu-latest defaults: run: working-directory: ./docs steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 # Not needed if lastUpdated is not enabled # - uses: pnpm/action-setup@v2 # Uncomment this if you're using pnpm # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun - name: Setup Node uses: actions/setup-node@v4 with: node-version: 20 cache: npm # or pnpm / yarn - name: Setup Pages uses: actions/configure-pages@v4 - name: Install dependencies run: npm ci # or pnpm install / yarn install / bun install - name: Build with VitePress run: npx vitepress build - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: docs/.vitepress/dist # Deployment job deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} needs: build runs-on: ubuntu-latest name: Deploy steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 husky-9.1.7/.github/workflows/node.js.yml000066400000000000000000000011541471665631700203740ustar00rootroot00000000000000# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: Node.js CI on: [push] permissions: contents: read # to fetch code (actions/checkout) jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, macOS-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm --version - run: npm ci --ignore-scripts - run: ./test.sh husky-9.1.7/.github/workflows/npm_publish.yml000066400000000000000000000016021471665631700213520ustar00rootroot00000000000000# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages name: Node.js Package on: release: types: [published] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - run: ./test.sh publish-npm: needs: build runs-on: ubuntu-latest permissions: id-token: write steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 registry-url: 'https://registry.npmjs.org' - run: npm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} husky-9.1.7/.gitignore000066400000000000000000000002361471665631700147040ustar00rootroot00000000000000node_modules *.log docs/.vitepress/cache docs/.vitepress/dist docs/.env docs/sponsorkit/.cache.json docs/sponsorkit/sponsors.json docs/sponsorkit/sponsors.pnghusky-9.1.7/.husky/000077500000000000000000000000001471665631700141345ustar00rootroot00000000000000husky-9.1.7/.husky/pre-commit000077500000000000000000000000111471665631700161260ustar00rootroot00000000000000./test.shhusky-9.1.7/.npmignore000066400000000000000000000000161471665631700147070ustar00rootroot00000000000000.* test* docs husky-9.1.7/.shellcheckrc000066400000000000000000000000261471665631700153440ustar00rootroot00000000000000disable=SC1090,SC2164 husky-9.1.7/LICENSE000066400000000000000000000020511471665631700137160ustar00rootroot00000000000000MIT License Copyright (c) 2021 typicode Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. husky-9.1.7/README.md000066400000000000000000000000411471665631700141650ustar00rootroot00000000000000https://typicode.github.io/husky husky-9.1.7/bin.js000077500000000000000000000012571471665631700140310ustar00rootroot00000000000000#!/usr/bin/env node import f, { writeFileSync as w } from 'fs' import i from './index.js' let p, a, n, s, o, d p = process a = p.argv[2] if (a == 'init') { n = 'package.json' s = f.readFileSync(n) o = JSON.parse(s) ;(o.scripts ||= {}).prepare = 'husky' w(n, JSON.stringify(o, 0, /\t/.test(s) ? '\t' : 2) + '\n') p.stdout.write(i()) try { f.mkdirSync('.husky') } catch {} w('.husky/pre-commit', (p.env.npm_config_user_agent?.split('/')[0] ?? 'npm') + ' test\n') p.exit() } d = c => console.error(`husky - ${c} command is DEPRECATED`) if (['add', 'set', 'uninstall'].includes(a)) { d(a); p.exit(1) } if (a == 'install') d(a) p.stdout.write(i(a == 'install' ? undefined : a)) husky-9.1.7/docs/000077500000000000000000000000001471665631700136435ustar00rootroot00000000000000husky-9.1.7/docs/.vitepress/000077500000000000000000000000001471665631700157455ustar00rootroot00000000000000husky-9.1.7/docs/.vitepress/config.mts000066400000000000000000000072311471665631700177420ustar00rootroot00000000000000import { defineConfig } from "vitepress"; // https://vitepress.dev/reference/site-config export default defineConfig({ title: "Husky", description: "Git hooks made easy", head: [ [ "link", { rel: "icon", href: 'data:image/svg+xml,🐶', }, ], ], base: "/husky/", themeConfig: { // outline: [2, 3], socialLinks: [ { icon: "github", link: "https://github.com/typicode/husky" }, { icon: "twitter", link: "https://x.com/typicode" }, ], // carbonAds: { // code: 'CWYDP53L', // placement: 'typicodegithubio', // }, sidebar: [ { text: "Introduction", link: "/" }, { text: "Get Started", link: "/get-started" }, { text: "How To", link: "/how-to" }, { text: "Troubleshoot", link: "/troubleshoot" }, { text: "Migrate from v4", link: "/migrate-from-v4" }, ], nav: [{ text: "Sponsor", link: "https://github.com/sponsors/typicode" }], }, locales: { root: { label: "English", lang: "en-US", }, zh: { label: "简体中文", lang: "zh-hans", description: "使 Git hooks 变得简单", link: "/zh/", themeConfig: { sidebar: [ { text: "简介", link: "/zh/" }, { text: "快速开始", link: "/zh/get-started" }, { text: "如何使用", link: "/zh/how-to" }, { text: "故障排查", link: "/zh/troubleshoot" }, { text: "从 v4 迁移", link: "/zh/migrate-from-v4" }, ], docFooter: { prev: "上一页", next: "下一页", }, outline: { label: "页面导航", }, nav: [ { text: "v9.0.1", items: [ { text: "更新日志", link: "https://github.com/typicode/husky/releases/tag/v9.0.1", }, ], }, ], }, }, ru: { label: "Русский", lang: "ru-RU", description: "Git hooks made easy", link: "/ru/", themeConfig: { sidebar: [ { text: "Введение", link: "/ru/" }, { text: "Начало работы", link: "/ru/get-started" }, { text: "Как использовать", link: "/ru/how-to" }, { text: "Устранение неполадок", link: "/ru/troubleshoot" }, { text: "Миграция с v4", link: "/ru/migrate-from-v4" }, ], docFooter: { prev: "Предыдущая страница", next: "Следующая страница", }, outline: { label: "Содержание страницы", }, nav: [ { text: "Sponsor", link: "https://github.com/sponsors/typicode" }, ], }, }, es: { label: "Español", lang: "es-EC", description: "Git hooks se vuelven fáciles", link: "/es/", themeConfig: { sidebar: [ { text: "Introducción", link: "/es/" }, { text: "Comenzar", link: "/es/get-started" }, { text: "Cómo hacerlo", link: "/es/how-to" }, { text: "Solucionar problemas", link: "/es/troubleshoot" }, { text: "Migrar desde v4", link: "/es/migrate-from-v4" }, ], docFooter: { prev: "Página anterior", next: "Página siguiente", }, outline: { label: "Contenido de la página", }, nav: [ { text: "Sponsor", link: "https://github.com/sponsors/typicode" }, ], }, }, }, }); husky-9.1.7/docs/es/000077500000000000000000000000001471665631700142525ustar00rootroot00000000000000husky-9.1.7/docs/es/get-started.md000066400000000000000000000041451471665631700170230ustar00rootroot00000000000000# Comenzar ## Instalar ::: code-group ```shell [npm] npm install --save-dev husky ``` ```shell [pnpm] pnpm add --save-dev husky ``` ```shell [yarn] yarn add --dev husky # Agregue pinst SÓLO si su paquete no es privado yarn add --dev pinst ``` ```shell [bun] bun add --dev husky ``` ::: ## `husky init` (recomendado) El comando `init` simplifica la configuración de husky en un proyecto. Crea un script `pre-commit` en `.husky/` y actualiza el script `prepare` en `package.json`. Luego se pueden realizar modificaciones para que se adapten a su flujo de trabajo. ::: code-group ```shell [npm] npx husky init ``` ```shell [pnpm] pnpm exec husky init ``` ```shell [yarn] # Debido a advertencias específicas y diferencias con otros administradores de paquetes, # consulte la sección Cómo hacerlo. ``` ```shell [bun] bunx husky init ``` ::: ## Pruébalo ¡Felicitaciones! Has configurado exitosamente tu primer gancho de Git (Git hook) con solo un comando 🎉. Probémoslo: ```shell git commit -m "Keep calm and commit" # El script de prueba se ejecutará cada vez que realices un commit ``` ## Unas pocas palabras... ### Scripting Si bien la mayoría de las veces, solo ejecutarás algunos comandos `npm run` o `npx` en tus ganchos (hooks), también puedes crear scripts con el shell POSIX para flujos de trabajo personalizados (custom workflows). Por ejemplo, aquí se muestra cómo puedes analizar (lint) tus archivos preparados (staged files) en cada confirmación (commit) con solo dos líneas de código de shell y sin dependencia externa: ```shell # .husky/pre-commit prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown git update-index --again ``` _Este es un ejemplo básico pero funcional, si necesita saber más verifique [lint-staged](https://github.com/lint-staged/lint-staged)._ ### Deshabilitar ganchos (hooks) Husky no fuerza los ganchos de Git (Git hooks). Se pueden deshabilitar globalmente (`HUSKY=0`) o se pueden habilitar si se desea. Consulta la sección [Cómo hacerlo](how-to) para obtener más información y realizar una configuración manual. husky-9.1.7/docs/es/how-to.md000066400000000000000000000175441471665631700160240ustar00rootroot00000000000000# Cómo hacerlo ## Agregar un nuevo gancho (Hook) Agregar un gancho (hook) es tan simple como crear un archivo. Esto se puede lograr usando su editor favorito, un script o un comando echo básico. Por ejemplo, en Linux/macOS: ```shell echo "npm test" > .husky/pre-commit ``` ## Archivos de inicio Husky le permite ejecutar comandos locales antes de ejecutar ganchos (hooks). Husky lee comandos de estos archivos: - `$XDG_CONFIG_HOME/husky/init.sh` - `~/.config/husky/init.sh` - `~/.huskyrc` (obsoleto (deprecated)) En Windows: `C:\Users\yourusername\.config\husky\init.sh` ## Omitir ganchos de Git (Git Hooks) ### Para un solo comando La mayoría de los comandos de Git incluyen una opción `-n/--no-verify` para omitir ganchos (hooks): ```sh git commit -m "..." -n # Skips Git hooks ``` Para los comandos sin esta bandera, deshabilite los ganchos (hooks) temporalmente con HUSKY=0: ```shell HUSKY=0 git ... # Desactiva temporalmente todos los ganchos de Git (Git hooks) git ... # Los ganchos (Hooks) se ejecutarán nuevamente ``` ### Para varios comandos Para deshabilitar los ganchos (hooks) durante un período prolongado (por ejemplo, durante la rebase/fusión (rebase/merge)): ```shell export HUSKY=0 # Deshabilita todos los ganchos (hooks) de Git git ... git ... unset HUSKY # Vuelve a habilitar los ganchos (hooks) ``` ### Para una GUI o globalmente Para deshabilitar los ganchos (hooks) de Git en un cliente GUI o globalmente, modifica la configuración de husky: ```sh # ~/.config/husky/init.sh export HUSKY=0 # Husky no instalará ni ejecutará ganchos (hooks) en tu máquina ``` ## Servidor CI y Docker Para evitar instalar ganchos de Git (Git Hooks) en servidores de CI o en Docker, use `HUSKY=0`. Por ejemplo, en acciones de GitHub (GitHub Actions): ```yml # https://docs.github.com/en/actions/learn-github-actions/variables env: HUSKY: 0 ``` Si instala solo `dependencies` (no `devDependencies`), el script `"prepare": "husky"` puede fallar porque Husky no se instalará. Tiene varias soluciones. Modifique el script `prepare` para que nunca falle: ```json // package.json "prepare": "husky || true" ``` Aún recibirá un mensaje de error `command not found` en su salida que puede ser confuso. Para que sea silencioso, cree `.husky/install.mjs`: ```js // Omitir la instalación de Husky en producción y CI if (process.env.NODE_ENV === "production" || process.env.CI === "true") { process.exit(0); } const husky = (await import("husky")).default; console.log(husky()); ``` Luego, úsalo en `prepare`: ```json "prepare": "node .husky/install.mjs" ``` ## Probar (testear) Ganchos (Hooks) sin confirmar (Committing) Para probar/testear un gancho (hook), agregue `exit 1` al script del gancho (hook) para cancelar el comando Git: ```shell # .husky/pre-commit # Your WIP script # ... exit 1 ``` ```shell git commit -m "testing pre-commit code" # No se creará una confirmación (commit) ``` ## El proyecto no está en el directorio raíz de Git Por razones de seguridad, Husky no se instala en los directorios padres (`../`). Sin embargo, puedes cambiar el directorio en el script `prepare`. Considera esta estructura de proyecto: ``` . ├── .git/ ├── backend/ # No package.json └── frontend/ # Package.json con husky ``` Configure su script de preparación de la siguiente manera: ```json "prepare": "cd .. && husky frontend/.husky" ``` En el script de gancho (hook script), cambie el directorio nuevamente al subdirectorio correspondiente: ```shell # frontend/.husky/pre-commit cd frontend npm test ``` ## Ganchos (hooks) que no son de shell Para ejecutar scripts que requieren el uso de un lenguaje de script, use el siguiente patrón para cada gancho (hook) en el que aplique: (Ejemplo usando el gancho (hook) `pre-commit` y NodeJS) 1. Cree un punto de entrada para el gancho (hook): ```shell .husky/pre-commit ``` 2. En el archivo agregue lo siguiente ```shell node .husky/pre-commit.js ``` 3. en `.husky/pre-commit.js` ```javascript // Su código NodeJS // ... ``` ## Bash Los scripts de gancho (hook) deben ser compatibles con POSIX para garantizar la mejor compatibilidad, ya que no todos tienen "bash" (por ejemplo, los usuarios de Windows). Dicho esto, si su equipo no usa Windows, puede usar Bash de esta manera: ```shell # .husky/pre-commit bash << EOF # Coloque dentro su script de bash # ... EOF ``` ## Administradores de versiones de Node y GUI Si usas ganchos de Git (Git hooks) en GUI con Node instalado a través de un administrador de versiones (como `nvm`, `n`, `fnm`, `asdf`, `volta`, etc.), es posible que te aparezca un error de `comando no encontrado` debido a problemas con la variable de entorno `PATH`. ### Entender `PATH` y los administradores de versiones `PATH` es una variable de entorno que contiene una lista de directorios. Su shell busca comandos en estos directorios. Si no encuentra un comando, recibirá un mensaje de `comando no encontrado`. Ejecute `echo $PATH` en un shell para ver su contenido. Los administradores de versiones funcionan de la siguiente manera: 1. Agregando el código de inicialización al archivo de inicio de su shell (`.zshrc`, `.bashrc`, etc.), que se ejecuta cada vez que abre una terminal. 2. Descargando versiones de Node a un directorio en su carpeta de inicio (home folder). Por ejemplo, si tiene dos versiones de Node: ```shell ~/version-manager/Node-X/node ~/version-manager/Node-Y/node ``` Al abrir una terminal se inicializa el administrador de versiones, que selecciona una versión (por ejemplo, `Node-Y`) y antepone su ruta a `PATH`: ```shell echo $PATH # Salida ~/version-manager/Node-Y/:... ``` Ahora, el node hace referencia a `Nodo-Y`. Al cambiar a `Nodo-X`, `PATH` cambia en concordancia: ```shell echo $PATH # Salida ~/version-manager/Node-X/:... ``` El problema surge porque las GUI, lanzadas fuera de una terminal, no inicializan el administrador de versiones, lo que deja a `PATH` sin la ruta de instalación de Node. Por lo tanto, los ganchos de Git (Git hooks) desde las GUI suelen fallar. ### Solución Husky obtiene `~/.config/husky/init.sh` antes de cada gancho de Git (Git hooks). Copie aquí el código de inicialización del administrador de versiones para asegurarse de que se ejecute en las GUI. Ejemplo con `nvm`: ```shell # ~/.config/husky/init.sh export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm ``` Como alternativa, si su archivo de inicio de shell es rápido y liviano, consígalo directamente: ```shell # ~/.config/husky/init.sh . ~/.zshrc ``` ## Configuración manual Git necesita ser configurado y husky debe configurar los archivos en `.husky/`. Ejecute el comando `husky` una vez en su repositorio. Lo ideal es incluirlo en el script `prepare` en `package.json` para su ejecución automática después de cada instalación (recomendado). ::: code-group ```json [npm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [pnpm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [yarn] { "scripts": { // Yarn doesn't support prepare script "postinstall": "husky", // Include this if publishing to npmjs.com "prepack": "pinst --disable", "postpack": "pinst --enable" } } ``` ```json [bun] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ::: Ejecute `prepare` una vez ::: code-group ```sh [npm] npm run prepare ``` ```sh [pnpm] pnpm run prepare ``` ```sh [yarn] # Yarn doesn't support `prepare` yarn run postinstall ``` ```sh [bun] bun run prepare ``` ::: Cree un archivo `pre-commit` en el directorio `.husky/`: ::: code-group ```shell [npm] # .husky/pre-commit npm test ``` ```shell [pnpm] # .husky/pre-commit pnpm test ``` ```shell [yarn] # .husky/pre-commit yarn test ``` ```sh [bun] # .husky/pre-commit bun test ``` ::: husky-9.1.7/docs/es/index.md000066400000000000000000000076201471665631700157100ustar00rootroot00000000000000![npm](https://img.shields.io/npm/dm/husky) > Hooks nativos de Git ultrarrápidos y modernos Husky mejora tus commits y más 🐶 _¡guau!_ Automáticamente hace un **análisis (lint) de tus mensages de commit**, **código**, y **ejecuta pruebas (test)** al confirmarse (committing ) o al enviar (pushing). Comienza [aquí](/es/get-started.md). ## Características - Solo `2 kB` (📦 _gzipped_) sin dependencias - Extremadamente rápido (se ejecuta en `~1ms`) - Utiliza la nueva característica de Git (`core.hooksPath`) - Soporta: - macOS, Linux, Windows - GUI de Git (Git GUIs), administradores de versiones de Node, directorio de ganchos personalizados (custom hooks directory), proyectos anidados, monorepositorios (monorepos) - [Todos los 13 ganchos de Git (Git hooks) del lado del cliente](https://git-scm.com/docs/githooks) Y más: - Ganchos específicos de la rama - Uso de shell POSIX para crear scripts de casos avanzados - Se adhiere a la organización de ganchos (hooks) nativa de Git (Git's native hook organization) - Se alinea con las mejores prácticas de [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) usando el script `prepare` - Opciones de inclusión/exclusión (Opt-in/opt-out) - Se puede deshabilitar globalmente - Mensajes de error amigables con el usuario ## Patrocinadores (Sponsors) Apoya este proyecto convirtiéndote en patrocinador (sponsor) [aquí](https://github.com/sponsors/typicode) 💖 ### Patrocinador especial (Special Sponsor)


Obtenga recompensas por sus contribuciones de código abierto

### GitHub

### Colectivo Abierto (Open Collective) ## Usado por Husky se utiliza en [**más de 1,5 millones de proyectos**](https://github.com/typicode/husky/network/dependents?package_id=UGFja2FnZS0xODQzNTgwNg%3D%3D) en GitHub, incluidos: - [vercel/next.js](https://github.com/vercel/next.js) - [vercel/hyper](https://github.com/vercel/hyper) - [webpack/webpack](https://github.com/webpack/webpack) - [angular/angular](https://github.com/angular/angular) - [facebook/docusaurus](https://github.com/facebook/docusaurus) - [microsoft/vscode](https://github.com/microsoft/vscode) - [11ty/eleventy](https://github.com/11ty/eleventy) - [stylelint/stylelint](https://github.com/stylelint/stylelint) - [colinhacks/zod](https://github.com/colinhacks/zod) - [rollup/rollup](https://github.com/rollup/rollup) - [tinyhttp/tinyhttp](https://github.com/tinyhttp/tinyhttp) - ... ## Artículos - [Por qué Husky ha abandonado la configuración JS convencional](https://blog.typicode.com/posts/husky-git-hooks-javascript-config/) - [Por qué Husky ya no se instala automáticamente](https://blog.typicode.com/posts/husky-git-hooks-autoinstall/) husky-9.1.7/docs/es/migrate-from-v4.md000066400000000000000000000024461471665631700175220ustar00rootroot00000000000000# Migrar desde v4 Si estabas llamando a los scripts `package.json` usando `npm` o `yarn`, **puedes simplemente copiar tus comandos** desde tu archivo de configuración al gancho (hook) correspondiente: Husky v4 ```json // package.json { "hooks": { "pre-commit": "npm test && npm run foo" // [!code hl] } } ``` Husky v9 ```shell # .husky/pre-commit # Tenga en cuenta que ahora puede tener comandos en varias líneas. npm test // [!code hl] npm run foo // [!code hl] ``` Si estaba llamando a binarios instalados localmente, **ahora necesita ejecutarlos a través de su administrador de paquetes**: ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "pre-commit": "jest" } } ``` ```shell [.husky/pre-commit (v9)] jest ``` ::: La variable de entorno `HUSKY_GIT_PARAMS` ahora se reemplaza por los parámetros nativos `$1`, `$2`, etc. ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } ``` ```shell [.husky/commit-msg (v9)] commitlint --edit $1 ``` ::: Otros cambios en las variables del entorno: - `HUSKY_SKIP_HOOKS` se reemplaza por `HUSKY`. - `HUSKY_SKIP_INSTALL` se reemplaza por `HUSKY`. - `HUSKY_GIT_PARAMS` se elimina. En su lugar, los parámetros de Git deben usarse directamente en los scripts (por ejemplo, `$1`). husky-9.1.7/docs/es/troubleshoot.md000066400000000000000000000025451471665631700173330ustar00rootroot00000000000000# Solución de problemas ## Comando no encontrado Consulte [Cómo hacerlo](how-to) para obtener soluciones. ## Los ganchos (hooks) no se están ejecutando 1. Verifique que el nombre del archivo sea correcto. Por ejemplo, `precommit` o `pre-commit.sh` son nombres inválidos. Consulte la [documentación](https://git-scm.com/docs/githooks) de los Ganchos de Git (Git hooks ) para conocer los nombres válidos. 2. Ejecute `git config core.hooksPath` y asegúrase de que apunte a `.husky/_` (o a su directorio de ganchos personalizado (custom hooks directory)). 3. Confirme que su versión de Git sea superior a `2.9`. ## `.git/hooks/` no funciona después de la desinstalación Si los ganchos (hooks) en `.git/hooks/` no funcionan después de desinstalar `husky`, ejecuta `git config --unset core.hooksPath`. ## Yarn en Windows Los ganchos de Git (Git hooks) pueden fallar con Yarn en Windows usando Git Bash (`stdin no es un tty`). Para los usuarios de Windows, implemente esta solución alternativa (workaround): 1. Cree `.husky/common.sh`: ```shell command_exists () { command -v "$1" >/dev/null 2>&1 } # Solución alternativa (Workaround) para Windows 10, Git Bash, and Yarn if command_exists winpty && test -t 1; then exec < /dev/tty fi ``` 2. Obtenga la fuente donde se ejecutan los comandos Yarn: ```shell # .husky/pre-commit . .husky/common.sh yarn ... ``` husky-9.1.7/docs/get-started.md000066400000000000000000000034211471665631700164100ustar00rootroot00000000000000# Get started ## Install ::: code-group ```shell [npm] npm install --save-dev husky ``` ```shell [pnpm] pnpm add --save-dev husky ``` ```shell [yarn] yarn add --dev husky # Add pinst ONLY if your package is not private yarn add --dev pinst ``` ```shell [bun] bun add --dev husky ``` ::: ## `husky init` (recommended) The `init` command simplifies setting up husky in a project. It creates a `pre-commit` script in `.husky/` and updates the `prepare` script in `package.json`. Modifications can be made later to suit your workflow. ::: code-group ```shell [npm] npx husky init ``` ```shell [pnpm] pnpm exec husky init ``` ```shell [yarn] # Due to specific caveats and differences with other package managers, # refer to the How To section. ``` ```shell [bun] bunx husky init ``` ::: ## Try it Congratulations! You've successfully set up your first Git hook with just one command 🎉. Let's test it: ```shell git commit -m "Keep calm and commit" # test script will run every time you commit ``` ## A few words... ### Scripting While most of the time, you'll just run a few `npm run` or `npx` commands in your hooks, you can also script them using POSIX shell for custom workflows. For example, here's how you can lint your staged files on each commit with only two lines of shell code and no external dependency: ```shell # .husky/pre-commit prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown git update-index --again ``` _This is a basic but working example, check [lint-staged](https://github.com/lint-staged/lint-staged) if you need more._ ### Disabling hooks Husky doesn't force Git hooks. It can be globally disabled (`HUSKY=0`) or be opt-in if wanted. See the [How To](how-to) section for manual setup and more information. husky-9.1.7/docs/how-to.md000066400000000000000000000154011471665631700154030ustar00rootroot00000000000000# How To ## Adding a New Hook Adding a hook is as simple as creating a file. This can be accomplished using your favorite editor, a script or a basic echo command. For example, on Linux/macOS: ```shell echo "npm test" > .husky/pre-commit ``` ## Startup files Husky allows you to execute local commands before running hooks. It reads commands from these files: - `$XDG_CONFIG_HOME/husky/init.sh` - `~/.config/husky/init.sh` - `~/.huskyrc` (deprecated) On Windows: `C:\Users\yourusername\.config\husky\init.sh` ## Skipping Git Hooks ### For a Single Command Most Git commands include a `-n/--no-verify` option to skip hooks: ```sh git commit -m "..." -n # Skips Git hooks ``` For commands without this flag, disable hooks temporarily with HUSKY=0: ```shell HUSKY=0 git ... # Temporarily disables all Git hooks git ... # Hooks will run again ``` ### For multiple commands To disable hooks for an extended period (e.g., during rebase/merge): ```shell export HUSKY=0 # Disables all Git hooks git ... git ... unset HUSKY # Re-enables hooks ``` ### For a GUI or Globally To disable Git hooks in a GUI client or globally, modify the husky config: ```sh # ~/.config/husky/init.sh export HUSKY=0 # Husky won't install and won't run hooks on your machine ``` ## CI server and Docker To avoid installing Git Hooks on CI servers or in Docker, use `HUSKY=0`. For instance, in GitHub Actions: ```yml # https://docs.github.com/en/actions/learn-github-actions/variables env: HUSKY: 0 ``` If installing only `dependencies` (not `devDependencies`), the `"prepare": "husky"` script may fail because Husky won't be installed. You have multiple solutions. Modify the `prepare` script to never fail: ```json // package.json "prepare": "husky || true" ``` You'll still get a `command not found` error message in your output which may be confusing. To make it silent, create `.husky/install.mjs`: ```js // Skip Husky install in production and CI if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') { process.exit(0) } const husky = (await import('husky')).default console.log(husky()) ``` Then, use it in `prepare`: ```json "prepare": "node .husky/install.mjs" ``` ## Testing Hooks Without Committing To test a hook, add `exit 1` to the hook script to abort the Git command: ```shell # .husky/pre-commit # Your WIP script # ... exit 1 ``` ```shell git commit -m "testing pre-commit code" # A commit will not be created ``` ## Project Not in Git Root Directory Husky doesn't install in parent directories (`../`) for security reasons. However, you can change the directory in the `prepare` script. Consider this project structure: ``` . ├── .git/ ├── backend/ # No package.json └── frontend/ # Package.json with husky ``` Set your prepare script like this: ```json "prepare": "cd .. && husky frontend/.husky" ``` In your hook script, change the directory back to the relevant subdirectory: ```shell # frontend/.husky/pre-commit cd frontend npm test ``` ## Non-shell hooks In order to run scripts that require the use of a scripting language, use the following pattern for each applicable hook: (Example using hook `pre-commit` and NodeJS) 1. Create an entrypoint for the hook: ```shell .husky/pre-commit ``` 2. In the file add the following ```shell node .husky/pre-commit.js ``` 3. in `.husky/pre-commit.js` ```javascript // Your NodeJS code // ... ``` ## Bash Hook scripts need to be POSIX compliant to ensure best compatibility as not everyone has `bash` (e.g. Windows users). That being said, if your team doesn't use Windows, you can use Bash this way: ```shell # .husky/pre-commit bash << EOF # Put your bash script inside # ... EOF ``` ## Node Version Managers and GUIs If you're using Git hooks in GUIs with Node installed via a version manager (like `nvm`, `n`, `fnm`, `asdf`, `volta`, etc...), you might face a `command not found` error due to `PATH` environment variable issues. ### Understanding `PATH` and Version Managers `PATH` is an environment variable containing a list of directories. Your shell searches these directories for commands. If it doesn't find a command, you get a `command not found` message. Run `echo $PATH` in a shell to view its contents. Version managers work by: 1. Adding initialization code to your shell startup file (`.zshrc`, `.bashrc`, etc.), which runs each time you open a terminal. 2. Downloading Node versions to a directory in your home folder. For example, if you have two Node versions: ```shell ~/version-manager/Node-X/node ~/version-manager/Node-Y/node ``` Opening a terminal initializes the version manager, which picks a version (say `Node-Y`) and prepends its path to `PATH`: ```shell echo $PATH # Output ~/version-manager/Node-Y/:... ``` Now, node refers to `Node-Y`. Switching to `Node-X` changes `PATH` accordingly: ```shell echo $PATH # Output ~/version-manager/Node-X/:... ``` The issue arises because GUIs, launched outside a terminal, don't initialize the version manager, leaving `PATH` without the Node install path. Thus, Git hooks from GUIs often fail. ### Solution Husky sources `~/.config/husky/init.sh` before each Git hook. Copy your version manager initialization code here to ensure it runs in GUIs. Example with `nvm`: ```shell # ~/.config/husky/init.sh export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm ``` Alternatively, if your shell startup file is fast and lightweight, source it directly: ```shell # ~/.config/husky/init.sh . ~/.zshrc ``` ## Manual setup Git needs to be configured and husky needs to setup files in `.husky/`. Run the `husky` command once in your repo. Ideally, include it in the `prepare` script in `package.json` for automatic execution after each install (recommended). ::: code-group ```json [npm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [pnpm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [yarn] { "scripts": { // Yarn doesn't support prepare script "postinstall": "husky", // Include this if publishing to npmjs.com "prepack": "pinst --disable", "postpack": "pinst --enable" } } ``` ```json [bun] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ::: Run `prepare` once: ::: code-group ```sh [npm] npm run prepare ``` ```sh [pnpm] pnpm run prepare ``` ```sh [yarn] # Yarn doesn't support `prepare` yarn run postinstall ``` ```sh [bun] bun run prepare ``` ::: Create a `pre-commit` file in the `.husky/` directory: ::: code-group ```shell [npm] # .husky/pre-commit npm test ``` ```shell [pnpm] # .husky/pre-commit pnpm test ``` ```shell [yarn] # .husky/pre-commit yarn test ``` ```sh [bun] # .husky/pre-commit bun test ``` ::: husky-9.1.7/docs/index.md000066400000000000000000000065771471665631700153130ustar00rootroot00000000000000![npm](https://img.shields.io/npm/dm/husky) > Ultra-fast modern native git hooks Husky enhances your commits and more 🐶 _woof!_ Automatically **lint your commit messages**, **code**, and **run tests** upon committing or pushing. Get started [here](/get-started.md). ## Features - Just `2 kB` (📦 _gzipped_) with no dependencies - Extremely fast (runs in `~1ms`) - Uses new Git feature (`core.hooksPath`) - Supports: - macOS, Linux, Windows - Git GUIs, Node version managers, custom hooks directory, nested projects, monorepos - [All 13 client-side Git hooks](https://git-scm.com/docs/githooks) And more: - Branch-specific hooks - Use POSIX shell to script advanced cases - Adheres to Git's native hook organization - Aligns with [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) best practices using `prepare` script - Opt-in/opt-out options - Can be globally disabled - User-friendly error messages ## Sponsors Support this project by becoming a sponsor [here](https://github.com/sponsors/typicode) 💖 ### Special Sponsor


Get rewards for your open-source contributions

### GitHub

### Open Collective ## Used by Husky is used in [**over 1.5M projects**](https://github.com/typicode/husky/network/dependents?package_id=UGFja2FnZS0xODQzNTgwNg%3D%3D) on GitHub, including: - [vercel/next.js](https://github.com/vercel/next.js) - [vercel/hyper](https://github.com/vercel/hyper) - [webpack/webpack](https://github.com/webpack/webpack) - [angular/angular](https://github.com/angular/angular) - [facebook/docusaurus](https://github.com/facebook/docusaurus) - [microsoft/vscode](https://github.com/microsoft/vscode) - [11ty/eleventy](https://github.com/11ty/eleventy) - [stylelint/stylelint](https://github.com/stylelint/stylelint) - [colinhacks/zod](https://github.com/colinhacks/zod) - [rollup/rollup](https://github.com/rollup/rollup) - [tinyhttp/tinyhttp](https://github.com/tinyhttp/tinyhttp) - ... ## Articles - [Why husky has dropped conventional JS config](https://blog.typicode.com/posts/husky-git-hooks-javascript-config/) - [Why husky doesn't autoinstall anymore](https://blog.typicode.com/posts/husky-git-hooks-autoinstall/) husky-9.1.7/docs/migrate-from-v4.md000066400000000000000000000022551471665631700171110ustar00rootroot00000000000000# Migrate from v4 If you were calling `package.json` scripts using `npm` or `yarn`, **you can simply copy your commands** from your config file to the corresponding hook: Husky v4 ```json // package.json { "hooks": { "pre-commit": "npm test && npm run foo" // [!code hl] } } ``` Husky v9 ```shell # .husky/pre-commit # Note that you can now have commands on multiple lines npm test // [!code hl] npm run foo // [!code hl] ``` If you were calling locally installed binaries, **you need to run them via your package manager now**: ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "pre-commit": "jest" } } ``` ```shell [.husky/pre-commit (v9)] jest ``` ::: `HUSKY_GIT_PARAMS` environment variable is replaced now by native params `$1`, `$2`, etc. ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } ``` ```shell [.husky/commit-msg (v9)] commitlint --edit $1 ``` ::: Other environment variables changes: - `HUSKY_SKIP_HOOKS` is replaced by `HUSKY`. - `HUSKY_SKIP_INSTALL` is replaced by `HUSKY`. - `HUSKY_GIT_PARAMS` is removed. Instead Git parameters should be used directly in scripts (e.g. `$1`).husky-9.1.7/docs/package-lock.json000066400000000000000000003027771471665631700170770ustar00rootroot00000000000000{ "name": "docs", "lockfileVersion": 3, "requires": true, "packages": { "": { "devDependencies": { "sponsorkit": "^0.9.3", "vitepress": "^1.0.1" } }, "node_modules/@algolia/autocomplete-core": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", "dev": true, "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", "@algolia/autocomplete-shared": "1.9.3" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", "dev": true, "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "dev": true, "dependencies": { "@algolia/autocomplete-shared": "1.9.3" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/autocomplete-shared": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", "dev": true, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/cache-browser-local-storage": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", "dev": true, "dependencies": { "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/cache-common": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==", "dev": true }, "node_modules/@algolia/cache-in-memory": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", "dev": true, "dependencies": { "@algolia/cache-common": "4.23.2" } }, "node_modules/@algolia/client-account": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", "dev": true, "dependencies": { "@algolia/client-common": "4.23.2", "@algolia/client-search": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-analytics": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", "dev": true, "dependencies": { "@algolia/client-common": "4.23.2", "@algolia/client-search": "4.23.2", "@algolia/requester-common": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-common": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", "dev": true, "dependencies": { "@algolia/requester-common": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-personalization": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", "dev": true, "dependencies": { "@algolia/client-common": "4.23.2", "@algolia/requester-common": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/client-search": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", "dev": true, "dependencies": { "@algolia/client-common": "4.23.2", "@algolia/requester-common": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/logger-common": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==", "dev": true }, "node_modules/@algolia/logger-console": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", "dev": true, "dependencies": { "@algolia/logger-common": "4.23.2" } }, "node_modules/@algolia/recommend": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", "dev": true, "dependencies": { "@algolia/cache-browser-local-storage": "4.23.2", "@algolia/cache-common": "4.23.2", "@algolia/cache-in-memory": "4.23.2", "@algolia/client-common": "4.23.2", "@algolia/client-search": "4.23.2", "@algolia/logger-common": "4.23.2", "@algolia/logger-console": "4.23.2", "@algolia/requester-browser-xhr": "4.23.2", "@algolia/requester-common": "4.23.2", "@algolia/requester-node-http": "4.23.2", "@algolia/transporter": "4.23.2" } }, "node_modules/@algolia/requester-browser-xhr": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", "dev": true, "dependencies": { "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/requester-common": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==", "dev": true }, "node_modules/@algolia/requester-node-http": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", "dev": true, "dependencies": { "@algolia/requester-common": "4.23.2" } }, "node_modules/@algolia/transporter": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", "dev": true, "dependencies": { "@algolia/cache-common": "4.23.2", "@algolia/logger-common": "4.23.2", "@algolia/requester-common": "4.23.2" } }, "node_modules/@antfu/utils": { "version": "0.7.10", "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@babel/parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@docsearch/css": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", "dev": true }, "node_modules/@docsearch/js": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", "dev": true, "dependencies": { "@docsearch/react": "3.6.0", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", "dev": true, "dependencies": { "@algolia/autocomplete-core": "1.9.3", "@algolia/autocomplete-preset-algolia": "1.9.3", "@docsearch/css": "3.6.0", "algoliasearch": "^4.19.1" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, "react": { "optional": true }, "react-dom": { "optional": true }, "search-insights": { "optional": true } } }, "node_modules/@emnapi/runtime": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "glibc": ">=2.26", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.2" } }, "node_modules/@img/sharp-darwin-x64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "glibc": ">=2.26", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.2" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], "engines": { "macos": ">=11", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-x64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], "engines": { "macos": ">=10.13", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", "cpu": [ "arm" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.28", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.26", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", "cpu": [ "s390x" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.28", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-x64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.26", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "musl": ">=1.2.2", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "engines": { "musl": ">=1.2.2", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-linux-arm": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", "cpu": [ "arm" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.28", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.2" } }, "node_modules/@img/sharp-linux-arm64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.26", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.2" } }, "node_modules/@img/sharp-linux-s390x": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", "cpu": [ "s390x" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.31", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.2" } }, "node_modules/@img/sharp-linux-x64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "glibc": ">=2.26", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.2" } }, "node_modules/@img/sharp-linuxmusl-arm64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "musl": ">=1.2.2", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" } }, "node_modules/@img/sharp-linuxmusl-x64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "musl": ">=1.2.2", "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.2" } }, "node_modules/@img/sharp-wasm32": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", "cpu": [ "wasm32" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { "@emnapi/runtime": "^1.1.1" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", "cpu": [ "ia32" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0", "yarn": ">=3.2.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@shikijs/core": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/transformers": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.3.tgz", "integrity": "sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==", "dev": true, "license": "MIT", "dependencies": { "shiki": "1.10.3" } }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true, "license": "MIT" }, "node_modules/@types/markdown-it": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "license": "MIT", "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "node_modules/@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", "dev": true, "license": "MIT" }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", "dev": true, "license": "MIT" }, "node_modules/@vitejs/plugin-vue": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { "vite": "^5.0.0", "vue": "^3.2.25" } }, "node_modules/@vue/compiler-core": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.32.tgz", "integrity": "sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", "@vue/shared": "3.4.32", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.32.tgz", "integrity": "sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==", "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.4.32", "@vue/shared": "3.4.32" } }, "node_modules/@vue/compiler-sfc": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.32.tgz", "integrity": "sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", "@vue/compiler-core": "3.4.32", "@vue/compiler-dom": "3.4.32", "@vue/compiler-ssr": "3.4.32", "@vue/shared": "3.4.32", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.39", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.32.tgz", "integrity": "sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==", "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.4.32", "@vue/shared": "3.4.32" } }, "node_modules/@vue/devtools-api": { "version": "7.3.6", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.6.tgz", "integrity": "sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==", "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-kit": "^7.3.6" } }, "node_modules/@vue/devtools-kit": { "version": "7.3.6", "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.6.tgz", "integrity": "sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==", "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-shared": "^7.3.6", "birpc": "^0.2.17", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.1" } }, "node_modules/@vue/devtools-shared": { "version": "7.3.6", "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.6.tgz", "integrity": "sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==", "dev": true, "license": "MIT", "dependencies": { "rfdc": "^1.4.1" } }, "node_modules/@vue/reactivity": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.32.tgz", "integrity": "sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==", "dev": true, "license": "MIT", "dependencies": { "@vue/shared": "3.4.32" } }, "node_modules/@vue/runtime-core": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.32.tgz", "integrity": "sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==", "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.4.32", "@vue/shared": "3.4.32" } }, "node_modules/@vue/runtime-dom": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.32.tgz", "integrity": "sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==", "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.4.32", "@vue/runtime-core": "3.4.32", "@vue/shared": "3.4.32", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.32.tgz", "integrity": "sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==", "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.4.32", "@vue/shared": "3.4.32" }, "peerDependencies": { "vue": "3.4.32" } }, "node_modules/@vue/shared": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.32.tgz", "integrity": "sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==", "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", "dev": true, "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.20", "@vueuse/metadata": "10.11.0", "@vueuse/shared": "10.11.0", "vue-demi": ">=0.14.8" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { "version": "0.14.8", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/@vueuse/integrations": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.0.tgz", "integrity": "sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==", "dev": true, "license": "MIT", "dependencies": { "@vueuse/core": "10.11.0", "@vueuse/shared": "10.11.0", "vue-demi": ">=0.14.8" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^4", "drauu": "^0.3", "focus-trap": "^7", "fuse.js": "^6", "idb-keyval": "^6", "jwt-decode": "^3", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^6" }, "peerDependenciesMeta": { "async-validator": { "optional": true }, "axios": { "optional": true }, "change-case": { "optional": true }, "drauu": { "optional": true }, "focus-trap": { "optional": true }, "fuse.js": { "optional": true }, "idb-keyval": { "optional": true }, "jwt-decode": { "optional": true }, "nprogress": { "optional": true }, "qrcode": { "optional": true }, "sortablejs": { "optional": true }, "universal-cookie": { "optional": true } } }, "node_modules/@vueuse/integrations/node_modules/vue-demi": { "version": "0.14.8", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/@vueuse/metadata": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", "dev": true, "license": "MIT", "dependencies": { "vue-demi": ">=0.14.8" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { "version": "0.14.8", "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "peerDependenciesMeta": { "@vue/composition-api": { "optional": true } } }, "node_modules/algoliasearch": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", "dev": true, "dependencies": { "@algolia/cache-browser-local-storage": "4.23.2", "@algolia/cache-common": "4.23.2", "@algolia/cache-in-memory": "4.23.2", "@algolia/client-account": "4.23.2", "@algolia/client-analytics": "4.23.2", "@algolia/client-common": "4.23.2", "@algolia/client-personalization": "4.23.2", "@algolia/client-search": "4.23.2", "@algolia/logger-common": "4.23.2", "@algolia/logger-console": "4.23.2", "@algolia/recommend": "4.23.2", "@algolia/requester-browser-xhr": "4.23.2", "@algolia/requester-common": "4.23.2", "@algolia/requester-node-http": "4.23.2", "@algolia/transporter": "4.23.2" } }, "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, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/birpc": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/cliui/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, "engines": { "node": ">=8" } }, "node_modules/cliui/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, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" }, "engines": { "node": ">=12.5.0" } }, "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, "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 }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "node_modules/consola": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", "dev": true, "engines": { "node": "^14.18.0 || >=16.10.0" } }, "node_modules/copy-anything": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, "license": "MIT", "dependencies": { "is-what": "^4.1.8" }, "engines": { "node": ">=12.13" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true, "license": "MIT" }, "node_modules/datauri": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/datauri/-/datauri-4.1.0.tgz", "integrity": "sha512-y17kh32+I82G+ED9MNWFkZiP/Cq/vO1hN9+tSZsT9C9qn3NrvcBnh7crSepg0AQPge1hXx2Ca44s1FRdv0gFWA==", "dev": true, "license": "MIT", "dependencies": { "image-size": "1.0.0", "mimer": "^2.0.2" }, "engines": { "node": ">= 10" } }, "node_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true, "license": "MIT" }, "node_modules/destr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", "dev": true, "license": "MIT" }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" } }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" }, "funding": { "url": "https://dotenvx.com" } }, "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 }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/focus-trap": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", "dev": true, "license": "MIT", "dependencies": { "tabbable": "^6.2.0" } }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", "dev": true, "license": "MIT" }, "node_modules/image-size": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", "dev": true, "license": "MIT", "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" }, "engines": { "node": ">=12.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/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true, "license": "MIT" }, "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, "engines": { "node": ">=8" } }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, "license": "MIT", "engines": { "node": ">=12.13" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/mark.js": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", "dev": true }, "node_modules/mimer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mimer/-/mimer-2.0.2.tgz", "integrity": "sha512-izxvjsB7Ur5HrTbPu6VKTrzxSMBFBqyZQc6dWlZNQ4/wAvf886fD4lrjtFd8IQ8/WmZKdxKjUtqFFNaj3hQ52g==", "dev": true, "license": "MIT", "bin": { "mimer": "bin/mimer" }, "engines": { "node": ">= 12" } }, "node_modules/minisearch": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.0.2.tgz", "integrity": "sha512-Pf0sFXaCgRpOBDr4G8wTbVAEH9o9rvJzCMwj0TMe3L/NfUuG188xabfx6Vm3vD/Dv5L500n7JeiMB9Mq3sWMfQ==", "dev": true, "license": "MIT" }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/node-fetch-native": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", "dev": true, "license": "MIT" }, "node_modules/node-html-parser": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", "dev": true, "license": "MIT", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/ofetch": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz", "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==", "dev": true, "license": "MIT", "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.3", "ufo": "^1.5.3" } }, "node_modules/perfect-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true, "license": "ISC" }, "node_modules/postcss": { "version": "8.4.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/preact": { "version": "10.20.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "license": "MIT", "dependencies": { "inherits": "~2.0.3" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.18.1", "@rollup/rollup-android-arm64": "4.18.1", "@rollup/rollup-darwin-arm64": "4.18.1", "@rollup/rollup-darwin-x64": "4.18.1", "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", "@rollup/rollup-linux-arm-musleabihf": "4.18.1", "@rollup/rollup-linux-arm64-gnu": "4.18.1", "@rollup/rollup-linux-arm64-musl": "4.18.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", "@rollup/rollup-linux-riscv64-gnu": "4.18.1", "@rollup/rollup-linux-s390x-gnu": "4.18.1", "@rollup/rollup-linux-x64-gnu": "4.18.1", "@rollup/rollup-linux-x64-musl": "4.18.1", "@rollup/rollup-win32-arm64-msvc": "4.18.1", "@rollup/rollup-win32-ia32-msvc": "4.18.1", "@rollup/rollup-win32-x64-msvc": "4.18.1", "fsevents": "~2.3.2" } }, "node_modules/search-insights": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", "dev": true, "peer": true }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/sharp": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.0" }, "engines": { "libvips": ">=8.15.2", "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.4", "@img/sharp-darwin-x64": "0.33.4", "@img/sharp-libvips-darwin-arm64": "1.0.2", "@img/sharp-libvips-darwin-x64": "1.0.2", "@img/sharp-libvips-linux-arm": "1.0.2", "@img/sharp-libvips-linux-arm64": "1.0.2", "@img/sharp-libvips-linux-s390x": "1.0.2", "@img/sharp-libvips-linux-x64": "1.0.2", "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", "@img/sharp-libvips-linuxmusl-x64": "1.0.2", "@img/sharp-linux-arm": "0.33.4", "@img/sharp-linux-arm64": "0.33.4", "@img/sharp-linux-s390x": "0.33.4", "@img/sharp-linux-x64": "0.33.4", "@img/sharp-linuxmusl-arm64": "0.33.4", "@img/sharp-linuxmusl-x64": "0.33.4", "@img/sharp-wasm32": "0.33.4", "@img/sharp-win32-ia32": "0.33.4", "@img/sharp-win32-x64": "0.33.4" } }, "node_modules/shiki": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/core": "1.10.3", "@types/hast": "^3.0.4" } }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/speakingurl": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/sponsorkit": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/sponsorkit/-/sponsorkit-0.9.3.tgz", "integrity": "sha512-P7YLBr4Is+R7cl73E95wSCL/pKR8Cfqh156hQCcFxWZPxjGwt2BCKLd5S0Zx1XtvI5KrSbOczdjLQ5BVRk3L9Q==", "dev": true, "license": "MIT", "dependencies": { "consola": "^3.2.3", "datauri": "^4.1.0", "dotenv": "^16.3.1", "node-html-parser": "^6.1.11", "ofetch": "^1.3.3", "picocolors": "^1.0.0", "sharp": "^0.33.0", "unconfig": "^0.3.11", "yargs": "^17.7.2" }, "bin": { "sponsorkit": "bin/sponsorkit.js" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "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, "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/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, "engines": { "node": ">=8" } }, "node_modules/string-width/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, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/superjson": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", "dev": true, "license": "MIT", "dependencies": { "copy-anything": "^3.0.2" }, "engines": { "node": ">=16" } }, "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "dev": true, "license": "MIT" }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true, "license": "0BSD", "optional": true }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "dev": true, "license": "MIT" }, "node_modules/unconfig": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.13.tgz", "integrity": "sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==", "dev": true, "license": "MIT", "dependencies": { "@antfu/utils": "^0.7.7", "defu": "^6.1.4", "jiti": "^1.21.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/vite": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "less": { "optional": true }, "lightningcss": { "optional": true }, "sass": { "optional": true }, "stylus": { "optional": true }, "sugarss": { "optional": true }, "terser": { "optional": true } } }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/android-arm": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/android-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=12" } }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { "node": ">=12" }, "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" } }, "node_modules/vitepress": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.1.tgz", "integrity": "sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==", "dev": true, "license": "MIT", "dependencies": { "@docsearch/css": "^3.6.0", "@docsearch/js": "^3.6.0", "@shikijs/core": "^1.10.3", "@shikijs/transformers": "^1.10.3", "@types/markdown-it": "^14.1.1", "@vitejs/plugin-vue": "^5.0.5", "@vue/devtools-api": "^7.3.5", "@vue/shared": "^3.4.31", "@vueuse/core": "^10.11.0", "@vueuse/integrations": "^10.11.0", "focus-trap": "^7.5.4", "mark.js": "8.11.1", "minisearch": "^7.0.0", "shiki": "^1.10.3", "vite": "^5.3.3", "vue": "^3.4.31" }, "bin": { "vitepress": "bin/vitepress.js" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { "optional": true }, "postcss": { "optional": true } } }, "node_modules/vue": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.32.tgz", "integrity": "sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==", "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.4.32", "@vue/compiler-sfc": "3.4.32", "@vue/runtime-dom": "3.4.32", "@vue/server-renderer": "3.4.32", "@vue/shared": "3.4.32" }, "peerDependencies": { "typescript": "*" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/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, "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/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, "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, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } } } } husky-9.1.7/docs/package.json000066400000000000000000000002331471665631700161270ustar00rootroot00000000000000{ "scripts": { "dev": "vitepress", "build": "sponsorkit" }, "devDependencies": { "sponsorkit": "^0.9.3", "vitepress": "^1.0.1" } } husky-9.1.7/docs/ru/000077500000000000000000000000001471665631700142715ustar00rootroot00000000000000husky-9.1.7/docs/ru/get-started.md000066400000000000000000000054371471665631700170470ustar00rootroot00000000000000# Начало работы ## Установить ::: code-group ```shell [npm] npm install --save-dev husky ``` ```shell [pnpm] pnpm add --save-dev husky ``` ```shell [yarn] yarn add --dev husky # Добавить pinst ТОЛЬКО если ваш пакет не является закрытым yarn add --dev pinst ``` ```shell [bun] bun add --dev husky ``` ::: ## `husky init` (рекомендуется) Команда `init` упрощает настройку husky в проекте. Она создает скрипт `pre-commit` в `.husky/` и обновляет скрипт `prepare` в `package.json`. Изменения можно внести позже в соответствии с вашим рабочим процессом. ::: code-group ```shell [npm] npx husky init ``` ```shell [pnpm] pnpm exec husky init ``` ```shell [yarn] # Из-за особых оговорок и различий с другими менеджерами пакетов, # обратитесь к разделу «Как использовать». ``` ```shell [bun] bunx husky init ``` ::: ## Попробуйте Поздравляем! Вы успешно настроили свой первый Git hook всего одной командой 🎉. Давайте проверим: ```shell git commit -m "Keep calm and commit" # тестовый скрипт будет запускаться каждый раз при коммите ``` ## Несколько слов... ### Скриптинг Хотя большую часть времени вы просто запускаете несколько команд `npm run` или `npx` в своих хуках, вы также можете записать их с помощью оболочки POSIX для пользовательских рабочих процессов. Например, вот как можно линтинговать подготовленные файлы на каждом коммите, используя всего две строки кода оболочки и без внешней зависимости: ```shell # .husky/pre-commit prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown git update-index --again ``` _Это простой, но рабочий пример, проверьте [lint-staged](https://github.com/lint-staged/lint-staged), если вам нужно больше._ ### Отключение хуков Husky не принудительно использует хуки Git. Его можно отключить глобально (`HUSKY=0`) или включить, если нужно. См. раздел [Как сделать](how-to) для ручной настройки и дополнительной информации.husky-9.1.7/docs/ru/how-to.md000066400000000000000000000244761471665631700160450ustar00rootroot00000000000000# Как использовать ## Добавление нового хука Добавление хука так же просто, как создание файла. Это можно сделать с помощью вашего любимого редактора, скрипта или базовой команды echo. Например, в Linux/macOS: ```shell echo "npm test" > .husky/pre-commit ``` ## Файлы запуска Husky позволяет выполнять локальные команды перед запуском хуков. Он считывает команды из следующих файлов: - `$XDG_CONFIG_HOME/husky/init.sh` - `~/.config/husky/init.sh` - `~/.huskyrc` (устарело) В Windows: `C:\Users\yourusername\.config\husky\init.sh` ## Пропуск хуков Git ### Для одной команды Большинство команд Git включают опцию `-n/--no-verify` для пропуска хуков: ```sh git commit -m "..." -n # Пропускает хуки Git ``` Для команд без этого флага временно отключите хуки с помощью HUSKY=0: ```shell HUSKY=0 git ... # Временно отключает все хуки Git git ... # Хуки снова запустятся ``` ### Для нескольких команд Чтобы отключить хуки для длительный период (например, во время rebase/merge): ```shell export HUSKY=0 # Отключает все хуки Git git ... git ... unset HUSKY # Повторно включает хуки ``` ### Для GUI или глобально Чтобы отключить хуки Git в клиенте GUI или глобально, измените конфигурацию husky: ```sh # ~/.config/husky/init.sh export HUSKY=0 # Husky не установит и не запустит хуки на вашей машине ``` ## CI-сервер и Docker Чтобы избежать установки хуков Git на CI-серверах или в Docker, используйте `HUSKY=0`. Например, в GitHub Actions: ```yml # https://docs.github.com/en/actions/learn-github-actions/variables env: HUSKY: 0 ``` Если устанавливается только `dependencies` (не `devDependencies`), скрипт `"prepare": "husky"` может завершиться ошибкой, поскольку Husky не будет установлен. У вас есть несколько решений. Измените скрипт `prepare`, чтобы он никогда не завершался ошибкой: ```json // package.json "prepare": "husky || true" ``` Вы все равно получите сообщение об ошибке `command not found` в выводе, что может сбивать с толку. Чтобы сделать его тихим, создайте `.husky/install.mjs`: ```js // Пропустить установку Husky в production и CI if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') { process.exit(0) } const husky = (await import('husky')).default console.log(husky()) ``` Затем используйте его в `prepare`: ```json "prepare": "node .husky/install.mjs" ``` ## Тестирование хуков без коммита Чтобы протестировать хук, добавьте `exit 1` в скрипт хука, чтобы прервать Git команду: ```shell # .husky/pre-commit # Ваш скрипт WIP # ... exit 1 ``` ```shell git commit -m "testing pre-commit code" # Коммит не будет создан ``` ## Проект не в корневом каталоге Git Husky не устанавливается в родительские каталоги (`../`) по соображениям безопасности. Однако вы можете изменить каталог в скрипте `prepare`. Рассмотрим следующую структуру проекта: ``` . ├── .git/ ├── backend/ # Нет package.json └── frontend/ # Package.json с husky ``` Настройте скрипт подготовки следующим образом: ```json "prepare": "cd .. && husky frontend/.husky" ``` В скрипте хука измените каталог обратно на соответствующий подкаталог: ```shell # frontend/.husky/pre-commit cd frontend npm test ``` ## Хуки, не относящиеся к оболочке Чтобы запустить скрипты, требующие использования языка сценариев, используйте следующий шаблон для каждого применимого хука: (Пример использования хука `pre-commit` и NodeJS) 1. Создайте точку входа для хука: ```shell .husky/pre-commit ``` 2. В файл добавьте следующее ```shell node .husky/pre-commit.js ``` 3. в `.husky/pre-commit.js` ```javascript // Ваш код NodeJS // ... ``` ## Bash Скрипты хуков должны быть совместимы с POSIX, чтобы обеспечить лучшую совместимость, так как не у всех есть `bash` (например, у пользователей Windows). При этом, если ваша команда не использует Windows, вы можете использовать Bash следующим образом: ```shell # .husky/pre-commit bash << EOF # Поместите свой скрипт bash внутрь # ... EOF ``` ## Менеджеры версий Node и графические интерфейсы Если вы используете хуки Git в графических интерфейсах с Node, установленным через менеджер версий (например, `nvm`, `n`, `fnm`, `asdf`, `volta` и т. д.), вы можете столкнуться с ошибкой `command not found` из-за проблем с переменной среды `PATH`. ### Понимание `PATH` и менеджеров версий `PATH` — это переменная среды, содержащая список каталогов. Ваша оболочка ищет команды в этих каталогах. Если она не находит команду, вы получаете сообщение `command not found`. Запустите `echo $PATH` в оболочке, чтобы просмотреть ее содержимое. Менеджеры версий работают следующим образом: 1. Добавляют код инициализации в файл запуска оболочки (`.zshrc`, `.bashrc` и т. д.), который запускается каждый раз при открытии терминала. 2. Загружают версии Node в каталог в вашей домашней папке. Например, если у вас две версии Node: ```shell ~/version-manager/Node-X/node ~/version-manager/Node-Y/node ``` Открытие терминала инициализирует менеджер версий, который выбирает версию (например, `Node-Y`) и добавляет ее путь к `PATH`: ```shell echo $PATH # Вывод ~/version-manager/Node-Y/:... ``` Теперь node ссылается на `Node-Y`. Переключение на `Node-X` соответственно изменяет `PATH`: ```shell echo $PATH # Вывод /version-manager/Node-X/:... ``` Проблема возникает из-за того, что GUI, запущенные вне терминала, не инициализируют менеджер версий, оставляя `PATH` без пути установки Node. Таким образом, хуки Git из GUI часто терпят неудачу. ### Решение Husky создает `~/.config/husky/init.sh` перед каждым хуком Git. Скопируйте сюда код инициализации вашего менеджера версий, чтобы он работал в GUI. Пример с `nvm`: ```shell # ~/.config/husky/init.sh export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Это загружает nvm ``` В качестве альтернативы, если ваш файл запуска оболочки быстрый и легкий, используйте его напрямую: ```shell # ~/.config/husky/init.sh . ~/.zshrc ``` ## Ручная настройка Git необходимо настроить, а husky необходимо настроить файлы в `.husky/`. Запустите команду `husky` один раз в вашем репозитории. В идеале включите ее в скрипт `prepare` в `package.json` для автоматического выполнения после каждой установки (рекомендуется). ::: code-group ```json [npm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [pnpm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [yarn] { "scripts": { // Yarn не поддерживает скрипт подготовки "postinstall": "husky", // Включить это при публикации на npmjs.com "prepack": "pinst --disable", "postpack": "pinst --enable" } } ``` ```json [bun] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ::: Запустить `prepare` once: ::: code-group ```sh [npm] npm run prepare ``` ```sh [pnpm] pnpm run preparation ``` ```sh [yarn] # Yarn не поддерживает `prepare` yarn run postinstall ``` ```sh [bun] bun run preparation ``` ::: Создайте файл `pre-commit` в каталоге `.husky/`: ::: code-group ```shell [npm] # .husky/pre-commit npm test ``` ```shell [pnpm] # .husky/pre-commit pnpm test ``` ```shell [yarn] # .husky/pre-commit yarn test ``` ```sh [bun] # .husky/pre-commit тест булочки ``` :::husky-9.1.7/docs/ru/index.md000066400000000000000000000105401471665631700157220ustar00rootroot00000000000000![npm](https://img.shields.io/npm/dm/husky) > Сверхбыстрые современные собственные хуки git Husky улучшает ваши коммиты и многое другое 🐶 _woof!_ Автоматически **линтует ваши сообщения коммитов**, **код** и **запускает тесты** при коммите или отправке. Начните [здесь](/get-started.md). ## Возможности - Всего `2 КБ` (📦 _gzipped_) без зависимостей - Очень быстрый (запускается за `~1 мс`) - Использует новую функцию Git (`core.hooksPath`) - Поддерживает: - macOS, Linux, Windows - Git GUI, менеджеры версий Node, каталог пользовательских хуков, вложенные проекты, монорепозитории - [Все 13 клиентских хуков Git](https://git-scm.com/docs/githooks) И многое другое: - Хуки, специфичные для веток - Используйте оболочку POSIX для скриптов сложных случаев - Соответствует собственной организации хуков Git - Соответствует лучшим практикам [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) с использованием скрипта `prepare` - Параметры согласия/отказа - Может быть глобально отключено - Удобные сообщения об ошибках ## Спонсоры Поддержите этот проект, став спонсором [здесь](https://github.com/sponsors/typicode) 💖 ### Специальный спонсор


Получите награды за свой вклад в открытый исходный код

### GitHub

### Открытый коллектив ## Используется Husky используется в [**более 1,5 млн проектов**](https://github.com/typicode/husky/network/dependents?package_id=UGFja2FnZS0xODQzNTgwNg%3D%3D) на GitHub, включая: - [vercel/next.js](https://github.com/vercel/next.js) - [vercel/hyper](https://github.com/vercel/hyper) - [webpack/webpack](https://github.com/webpack/webpack) - [angular/angular](https://github.com/angular/angular) - [facebook/docusaurus](https://github.com/facebook/docusaurus) - [microsoft/vscode](https://github.com/microsoft/vscode) - [11ty/eleventy](https://github.com/11ty/eleventy) - [stylelint/stylelint](https://github.com/stylelint/stylelint) - [colinhacks/zod](https://github.com/colinhacks/zod) - [rollup/rollup](https://github.com/rollup/rollup) - [tinyhttp/tinyhttp](https://github.com/tinyhttp/tinyhttp) - ... ## Статьи - [Почему husky отказался от обычного JS config](https://blog.typicode.com/posts/husky-git-hooks-javascript-config/) - [Почему husky больше не устанавливается автоматически](https://blog.typicode.com/posts/husky-git-hooks-autoinstall/)husky-9.1.7/docs/ru/migrate-from-v4.md000066400000000000000000000032571471665631700175420ustar00rootroot00000000000000# Переход с v4 Если вы вызывали скрипты `package.json` с помощью `npm` или `yarn`, **вы можете просто скопировать свои команды** из файла конфигурации в соответствующий хук: Husky v4 ```json // package.json { "hooks": { "pre-commit": "npm test && npm run foo" // [!code hl] } } ``` Husky v9 ```shell # .husky/pre-commit # Обратите внимание, что теперь вы можете иметь команды в нескольких строках npm test // [!code hl] npm run foo // [!code hl] ``` Если вы вызывали локально установленные двоичные файлы, **теперь вам нужно запустить их через менеджер пакетов**: ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "pre-commit": "jest" } } ``` ```shell [.husky/pre-commit (v9)] jest ``` ::: Переменная окружения `HUSKY_GIT_PARAMS` теперь заменена на собственные параметры `$1`, `$2` и т. д. ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } ``` ```shell [.husky/commit-msg (v9)] commitlint --edit $1 ``` ::: Другие изменения переменных окружения: - `HUSKY_SKIP_HOOKS` заменен на `HUSKY`. - `HUSKY_SKIP_INSTALL` заменен на `HUSKY`. - `HUSKY_GIT_PARAMS` удален. Вместо этого параметры Git следует использовать непосредственно в скриптах (например, `$1`).husky-9.1.7/docs/ru/troubleshoot.md000066400000000000000000000031371471665631700173500ustar00rootroot00000000000000# Устранение неполадок ## Команда не найдена (Command not found) См. [Как сделать](how-to) для решений. ## Хуки не работают 1. Проверьте правильность имени файла. Например, `precommit` или `pre-commit.sh` — недопустимые имена. Обратитесь к [документации] Git hooks (https://git-scm.com/docs/githooks) для допустимых имен. 2. Запустите `git config core.hooksPath` и убедитесь, что он указывает на `.husky/_` (или на ваш пользовательский каталог hooks). 1. Убедитесь, что версия Git выше `2.9`. ## `.git/hooks/` не работает после удаления Если хуки в `.git/hooks/` не работают после удаления `husky`, выполните `git config --unset core.hooksPath`. ## Yarn в Windows Git-хуки могут не работать с Yarn в Windows с использованием Git Bash (`stdin не является tty`). Для пользователей Windows реализуйте этот обходной путь: 1. Создайте `.husky/common.sh`: ```shell command_exists () { command -v "$1" >/dev/null 2>&1 } # Обходной путь для Windows 10, Git Bash и Yarn if command_exists winpty && test -t 1; then exec < /dev/tty fi ``` 2. Укажите его там, где выполняются команды Yarn: ```shell # .husky/pre-commit . .husky/common.sh yarn ... ```husky-9.1.7/docs/sponsorkit.config.js000066400000000000000000000015021471665631700176560ustar00rootroot00000000000000import { defineConfig, presets } from 'sponsorkit' export default defineConfig({ // includePrivate: true, tiers: [ { title: 'Past Sponsors', monthlyDollars: -1, preset: presets.xs, }, { title: 'Backers', preset: presets.base, }, { title: 'Sponsors', monthlyDollars: 10, preset: presets.medium, // to insert custom elements after the tier block composeAfter: (composer, _tierSponsors, _config) => { composer.addSpan(10) }, }, { title: 'Bronze Sponsors', monthlyDollars: 100, preset: presets.large, }, { title: 'Silver Sponsors', monthlyDollars: 250, preset: presets.large, }, { title: 'Gold Sponsors', monthlyDollars: 500, preset: presets.xl, }, ], }) husky-9.1.7/docs/sponsorkit/000077500000000000000000000000001471665631700160565ustar00rootroot00000000000000husky-9.1.7/docs/sponsorkit/sponsors.svg000066400000000000000000020511431471665631700204730ustar00rootroot00000000000000 Gold Sponsors Zuplo Silver Sponsors Kong Bronze Sponsors risedotcom Storyblok Better Stack Route4Me Sponsors Ehren Erik Gross Cased Dustin Extremely Comarch Mercury Ray Foss Backers Past Sponsors husky-9.1.7/docs/troubleshoot.md000066400000000000000000000020441471665631700167160ustar00rootroot00000000000000# Troubleshoot ## Command not found See [How To](how-to) for solutions. ## Hooks not running 1. Verify the file name is correct. For example, `precommit` or `pre-commit.sh` are invalid names. Refer to the Git hooks [documentation](https://git-scm.com/docs/githooks) for valid names. 2. Run `git config core.hooksPath` and ensure it points to `.husky/_` (or your custom hooks directory). 1. Confirm your Git version is above `2.9`. ## `.git/hooks/` Not Working After Uninstall If hooks in `.git/hooks/` don't work post-uninstalling `husky`, execute `git config --unset core.hooksPath`. ## Yarn on Windows Git hooks might fail with Yarn on Windows using Git Bash (`stdin is not a tty`). For Windows users, implement this workaround: 1. Create `.husky/common.sh`: ```shell command_exists () { command -v "$1" >/dev/null 2>&1 } # Workaround for Windows 10, Git Bash, and Yarn if command_exists winpty && test -t 1; then exec < /dev/tty fi ``` 2. Source it where Yarn commands are run: ```shell # .husky/pre-commit . .husky/common.sh yarn ... ``` husky-9.1.7/docs/zh/000077500000000000000000000000001471665631700142645ustar00rootroot00000000000000husky-9.1.7/docs/zh/get-started.md000066400000000000000000000021511471665631700170300ustar00rootroot00000000000000# 快速开始 ## 安装 ::: code-group ```shell [npm] npm install --save-dev husky ``` ```shell [pnpm] pnpm add --save-dev husky ``` ```shell [yarn] yarn add --dev husky # 如果你的项目不是私有的,那么只需要安装 pinst yarn add --dev pinst ``` ```shell [bun] bun add --dev husky ``` ::: ## `husky init` `init` 命令简化了项目中的 husky 设置。它会在 `.husky/` 中创建 `pre-commit` 脚本,并更新 `package.json` 中的 `prepare` 脚本。随后可根据你的工作流进行修改。 ::: code-group ```shell [npm] npx husky init ``` ```shell [pnpm] pnpm exec husky init ``` ```shell [yarn] # 由于特殊的注意事项和与其他包管理器的差异, # 请参考“如何使用”章节。 ``` ```shell [bun] bunx husky init ``` ::: ## 试一试 恭喜你!你已经成功地用一个命令设置了你的第一个 Git 钩子 🎉。让我们测试一下: ```shell git commit -m "Keep calm and commit" # 测试脚本会在每次提交时运行 ``` _有关手动设置和更多信息,请参见 [如何使用](how-to.md) 章节_ husky-9.1.7/docs/zh/how-to.md000066400000000000000000000155451471665631700160350ustar00rootroot00000000000000# 如何使用 ## 添加新 Hook 添加 hook 与创建文件一样简单。可以通过你喜欢的编辑器、脚本或 echo 命令来实现。例如,在 Linux/macOS 中: ```shell echo "npm test" > .husky/pre-commit ``` ## 启动文件 Husky 允许你在运行钩子之前执行本地命令。它从这些文件中读取命令: - `$XDG_CONFIG_HOME/husky/init.sh` - `~/.config/husky/init.sh` - `~/.huskyrc` (已弃用) Windows 系统:`C:\Users\yourusername\.config\husky\init.sh` ## 跳过 Git 钩子 ### 对于单个命令 大多数 Git 命令都包含一个 `-n/--no-verify` 选项来用于跳过钩子: ```sh git commit -m "..." -n # 跳过 Git 钩子 ``` 对于没有使用此标识的命令,使用 HUSKY=0 来临时禁用钩子: ```shell HUSKY=0 git ... # 临时禁用所有 Git 钩子 git ... # 钩子会再次运行 ``` ### 对于多个命令 在一个较长的时间里禁用钩子(例如,在变基或者合并期间): ```shell export HUSKY=0 # 禁用所有 Git 钩子 git ... git ... unset HUSKY # 重新启用钩子 ``` ### 对于 GUI 或全局 要在 GUI 客户端或全局禁用 Git 钩子,请修改 Husky 配置: ```sh # ~/.config/husky/init.sh export HUSKY=0 # Husky 不会安装,也不会再你的机器上运行钩子 ``` ## CI 服务器和 Docker 要避免在 CI 服务器或 Docker 中安装 Git 钩子,请使用 `HUSKY=0`。例如,在 GitHub Actions 中: ```yml # https://docs.github.com/en/actions/learn-github-actions/variables env: HUSKY: 0 ``` 如果只安装 `dependencies`(不是 `devDependencies`),`"prepare": "husky"` 脚本可能会失败,因为 Husky 不会被安装。 你有多种解决方案。 修改 `prepare` 脚本使其永远不会失败: ```json // package.json "prepare": "husky || true" ``` 你仍然会在输出中看到一个 `command not found` 的错误消息,这可能会让你很感到困惑。为了让它消失,创建 `.husky/install.mjs`: ```js // 在生产环境或 CI 环境中跳过 Husky 的安装 if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') { process.exit(0) } const husky = (await import('husky')).default console.log(husky()) ``` 然后,在 `prepare` 脚本中使用它: ```json "prepare": "node .husky/install.mjs" ``` ## 测试钩子 要测试一个钩子,将 `exit 1` 添加到钩子脚本以中止 Git 命令: ```shell # .husky/pre-commit # 你的 WIP 脚本 # ... exit 1 ``` ```shell git commit -m "testing pre-commit code" # 提交不会被创建 ``` ## 项目不在 Git 根目录 出于安全考虑,Husky 不会安装在父目录(`../`)中。但是,你可以在 `prepare` 脚本中更改目录。 考虑一下这个项目结构: ``` . ├── .git/ ├── backend/ # 没有 package.json └── frontend/ # package.json 中带有 husky ``` 像这样设置你的 prepare 脚本: ```json "prepare": "cd .. && husky frontend/.husky" ``` 在你的 hook 脚本中,将目录切换回相关的子目录: ```shell # frontend/.husky/pre-commit cd frontend npm test ``` ## 非 shell 脚本钩子 为了运行需要使用脚本语言的脚本,对每个适用的钩子使用以下模式: (使用钩子 `pre-commit` 和 NodeJS 的示例) 1. 为钩子创建一个入口: ```shell .husky/pre-commit ``` 2. 在文件中添加以下内容: ```shell node .husky/pre-commit.js ``` 3. 在 `.husky/pre-commit.js` 文件中: ```javascript // 你的 NodeJS 代码 // ... ``` ## Bash 钩子脚本需要与 POSIX 兼容,以确保最佳兼容性,因为并非每个人都有 bash (例如 Windows 用户)。 也就是说,如果你的团队不使用 Windows,你可以这样使用 Bash: ```shell # .husky/pre-commit bash << EOF # Put your bash script inside # ... EOF ``` ## Node 版本管理器和 GUI 如果您在 GUI 中使用 Git 钩子,并通过版本管理器(比如 `nvm`、`n`、`fnm`、`asdf`、`volta` 等等)安装 Node,由于 `PATH` 环境变量问题,你可能会遇到 `command not found` 报错。 ### 了解 `PATH` 和版本管理器 `PATH` 是一个包含目录列表的环境变量,你的 shell 在这些目录中检索命令,如果没找到这个命令,你就会得到一个 `command not found` 报错。 在 shell 中运行 `echo $PATH` 来查看其内容。 版本管理器的工作方式如下: 1. 将初始化代码添加到 shell 启动文件(`.zshrc`、`.bashrc` 等),它会在每次打开终端时运行。 2. 将 Node 版本下载到主文件夹下的目录中。 例如,如果你有两个 Node 版本: ```shell ~/version-manager/Node-X/node ~/version-manager/Node-Y/node ``` 打开终端将初始化版本管理器,它将选择一个版本(比如 `Node-Y`)并预先设置其到 `PATH` 的路径: ```shell echo $PATH # 输出 ~/version-manager/Node-Y/:... ``` 现在,Node 指向 `Node-Y`。切换到 `Node-X` 时会相应地改变 `PATH`: ```shell echo $PATH # 输出 ~/version-manager/Node-X/:... ``` 出现这个问题是因为在终端之外启动的 GUI 没有初始化版本管理器,导致 `PATH` 没有 Node 安装路径。因此,来自 GUI 的 Git 钩子常常会失败。 ### 解决方案 husky 在每个钩子之前都会执行 `~/.config/husky/init.sh`。将版本管理器初始化代码复制到这里,以确保在 GUI 中运行。 `nvm` 示例: ```shell # ~/.config/husky/init.sh export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 加载 nvm ``` 或者,如果你的 shell 启动文件快速且轻量,也可以直接使用: ```shell # ~/.config/husky/init.sh . ~/.zshrc ``` ## 手动设置 Git 需要配置,husky 需要在 `.husky/` 中设置文件。 在仓库中运行一次 `husky` 命令。理想情况下,将其设置在 `package.json` 的 `prepare` 脚本中,以便每次安装后自动执行。 ::: code-group ```json [npm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [pnpm] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ```json [yarn] { "scripts": { // Yarn 不支持 prepare 脚本 "postinstall": "husky", // 如果发布到 npmjs.com,需要加上这个 "prepack": "pinst --disable", "postpack": "pinst --enable" } } ``` ```json [bun] { "scripts": { "prepare": "husky" // [!code hl] } } ``` ::: 运行一次 `prepare`: ::: code-group ```sh [npm] npm run prepare ``` ```sh [pnpm] pnpm run prepare ``` ```sh [yarn] # Yarn 不支持 `prepare` yarn run postinstall ``` ```sh [bun] bun run prepare ``` ::: 在 `.husky/` 目录中创建一个 `pre-commit` 文件: ::: code-group ```shell [npm] # .husky/pre-commit npm test ``` ```shell [pnpm] # .husky/pre-commit pnpm test ``` ```shell [yarn] # .husky/pre-commit yarn test ``` ```sh [bun] # .husky/pre-commit bun test ``` ::: husky-9.1.7/docs/zh/index.md000066400000000000000000000070251471665631700157210ustar00rootroot00000000000000![npm](https://img.shields.io/npm/dm/husky) > 使现代的原生 Git 钩子变得简单 Husky 能使你的提交变得更好 🐶 _汪!_ 在提交或推送时,自动化 **检查提交信息**、**检查代码** 和 **运行测试**。 从 [这里](./get-started.md) 快速开始。 [查看 v9 更新日志](https://github.com/typicode/husky/releases/tag/v9.0.1)去发现所有新特性! 🚀 ## 特性 - 仅有 `2 kB`(📦 _gzip 压缩后_),没有任何依赖。 - 非常快(运行速度约 `~1ms`) - 使用新 Git 特性(`core.hooksPath`) - 支持: - macOS、Linux、Windows - Git GUI、Node 版本管理器、自定义钩子目录、嵌套项目、Monorepos - [所有 13 个客户端 Git 钩子](https://git-scm.com/docs/githooks) 更多: - Branch-specific 钩子 - 使用 POSIX shell 为高级案例编写脚本 - 遵循 Git 的原生钩子组织结构 - 使用 `prepare` 脚本与 [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) 最佳实践保持一致 - Opt-in/opt-out 选项 - 用户友好的报错信息 ## 赞助者 支持这个项目来成为一个赞助者 [点击此处](https://github.com/sponsors/typicode) 💖 ### 特别赞助


Get rewards for your open-source contributions

### GitHub

### Open Collective ## 谁在使用 Husky 在 GitHub 上用于[超过 130 万个项目](https://github.com/typicode/husky/network/dependents?package_id=UGFja2FnZS0xODQzNTgwNg%3D%3D),包括: - [vercel/next.js](https://github.com/vercel/next.js) - [vercel/hyper](https://github.com/vercel/hyper) - [webpack/webpack](https://github.com/webpack/webpack) - [angular/angular](https://github.com/angular/angular) - [facebook/docusaurus](https://github.com/facebook/docusaurus) - [microsoft/vscode](https://github.com/microsoft/vscode) - [11ty/eleventy](https://github.com/11ty/eleventy) - [stylelint/stylelint](https://github.com/stylelint/stylelint) - [colinhacks/zod](https://github.com/colinhacks/zod) - [rollup/rollup](https://github.com/rollup/rollup) - [tinyhttp/tinyhttp](https://github.com/tinyhttp/tinyhttp) - ... ## 相关文章 - [为什么 Husky 放弃了传统的 JS 配置](https://blog.typicode.com/posts/husky-git-hooks-javascript-config/) - [为什么 Husky 不再自动安装了](https://blog.typicode.com/posts/husky-git-hooks-autoinstall/) husky-9.1.7/docs/zh/migrate-from-v4.md000066400000000000000000000024711471665631700175320ustar00rootroot00000000000000# 从 v4 迁移 如果你使用 `npm` 或 `yarn` 调用 `package.json` 脚本,**你可以简单地将命令**从配置文件复制到相应的钩子: Husky v4 ```json // package.json { "hooks": { "pre-commit": "npm test && npm run foo" // [!code hl] } } ``` Husky v9 ```shell # .husky/pre-commit # 提示,你现在可以在多行中输入命令 npm test # [!code hl] npm run foo # [!code hl] ``` 如果你想调用本地安装的二进制文件,**现在你需要通过包管理器运行它们**: ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "pre-commit": "jest" } } ``` ```shell [.husky/pre-commit (v9)] # ... npx --no jest # 或者 yarn jest ``` ::: `HUSKY_GIT_PARAMS` 环境变量现在替换成原生参数 `$1`、`$2`。 ::: code-group ```js [.huskyrc.json (v4)] { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } ``` ```shell [.husky/commit-msg (v9)] # ... npx --no -- commitlint --edit $1 # 或者 yarn commitlint --edit $1 ``` ::: 其他环境变量的变化: - `HUSKY_SKIP_HOOKS` 替换成 `HUSKY`. - `HUSKY_SKIP_INSTALL` 替换成 `HUSKY`. - `HUSKY_GIT_PARAMS` 被移除。取而代之的是 Git 参数应该直接在脚本中使用(例如 `$1`)。 - 本地安装工具的 `PATH` 不再自动设置,你需要使用包管理器来运行它们。 husky-9.1.7/docs/zh/troubleshoot.md000066400000000000000000000022031471665631700173340ustar00rootroot00000000000000# 故障排查 ## 找不到命令(Command not found) 请参阅 [如何使用](./how-to) 获取解决方案。 ## 钩子未运行 1. 验证文件名是否正确。例如,`precommit` 或 `pre-commit.sh` 都是无效的名称。有效名称请参考 Git 钩子[文档](https://git-scm.com/docs/githooks)。 2. 运行 `git config core.hooksPath` 并确保它指向 `.husky/_`(或者你的自定义目录)。 3. 确认你的 Git 版本高于 `2.9`。 ## 卸载后 `.git/hooks/` 无法正常使用 如果卸载 `husky` 后 hooks 在 `.git/hooks/` 中无法正常使用,请执行命令 `git config --unset core.hooksPath`。 ## 在 Windows 上使用 Yarn 在 Windows 上使用 Git Bash 时,Git 钩子可能会失败(`stdin is not a tty`)。对于 Windows 用户,通过以下解决方案来实现: 1. 创建 `.husky/common.sh`: ```shell command_exists () { command -v "$1" >/dev/null 2>&1 } # Windows 10、Git Bash 和 Yarn 的解决方案 if command_exists winpty && test -t 1; then exec < /dev/tty fi ``` 1. 在运行 Yarn 命令的地方使用它: ```shell # .husky/pre-commit . "$(dirname -- "$0")/common.sh" yarn ... ```husky-9.1.7/husky000066400000000000000000000010471471665631700140030ustar00rootroot00000000000000#!/usr/bin/env sh [ "$HUSKY" = "2" ] && set -x n=$(basename "$0") s=$(dirname "$(dirname "$0")")/$n [ ! -f "$s" ] && exit 0 if [ -f "$HOME/.huskyrc" ]; then echo "husky - '~/.huskyrc' is DEPRECATED, please move your code to ~/.config/husky/init.sh" fi i="${XDG_CONFIG_HOME:-$HOME/.config}/husky/init.sh" [ -f "$i" ] && . "$i" [ "${HUSKY-}" = "0" ] && exit 0 export PATH="node_modules/.bin:$PATH" sh -e "$s" "$@" c=$? [ $c != 0 ] && echo "husky - $n script failed (code $c)" [ $c = 127 ] && echo "husky - command not found in PATH=$PATH" exit $c husky-9.1.7/index.d.ts000066400000000000000000000000571471665631700146160ustar00rootroot00000000000000export default function (dir?: string): string;husky-9.1.7/index.js000066400000000000000000000023041471665631700143570ustar00rootroot00000000000000import c from 'child_process' import f, { readdir, writeFileSync as w } from 'fs' import p from 'path' let l = [ 'pre-commit', 'pre-merge-commit', 'prepare-commit-msg', 'commit-msg', 'post-commit', 'applypatch-msg', 'pre-applypatch', 'post-applypatch', 'pre-rebase', 'post-rewrite', 'post-checkout', 'post-merge', 'pre-push', 'pre-auto-gc' ], msg = `echo "husky - DEPRECATED\n\nPlease remove the following two lines from $0:\n\n#!/usr/bin/env sh\n. \\"\\$(dirname -- \\"\\$0\\")/_/husky.sh\\"\n\nThey WILL FAIL in v10.0.0\n"` export default (d = '.husky') => { if (process.env.HUSKY === '0') return 'HUSKY=0 skip install' if (d.includes('..')) return '.. not allowed' if (!f.existsSync('.git')) return `.git can't be found` let _ = (x = '') => p.join(d, '_', x) let { status: s, stderr: e } = c.spawnSync('git', ['config', 'core.hooksPath', `${d}/_`]) if (s == null) return 'git command not found' if (s) return '' + e f.rmSync(_('husky.sh'), { force: true }) f.mkdirSync(_(), { recursive: true }) w(_('.gitignore'), '*') f.copyFileSync(new URL('husky', import.meta.url), _('h')) l.forEach(h => w(_(h), `#!/usr/bin/env sh\n. "\$(dirname "\$0")/h"`, { mode: 0o755 })) w(_('husky.sh'), msg) return '' } husky-9.1.7/package-lock.json000066400000000000000000000005141471665631700161270ustar00rootroot00000000000000{ "name": "husky", "version": "9.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "husky", "version": "9.1.7", "license": "MIT", "bin": { "husky": "bin.mjs" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" } } } } husky-9.1.7/package.json000066400000000000000000000006661471665631700152110ustar00rootroot00000000000000{ "name": "husky", "version": "9.1.7", "type": "module", "description": "Modern native Git hooks", "keywords": [ "git", "hooks", "pre-commit" ], "repository": { "type": "git", "url": "git+https://github.com/typicode/husky.git" }, "funding": "https://github.com/sponsors/typicode", "license": "MIT", "author": "typicode", "bin": { "husky": "bin.js" }, "exports": "./index.js", "engines": { "node": ">=18" } } husky-9.1.7/test.sh000077500000000000000000000006221471665631700142310ustar00rootroot00000000000000#!/bin/sh # To run tests, type ./test.sh in your terminal set -e npm pack && mv husky-*.tgz /tmp/husky.tgz sh test/1_default.sh sh test/2_in-sub-dir.sh sh test/3_from-sub-dir.sh sh test/4_not-git-dir.sh sh test/5_git_command_not_found.sh sh test/6_command_not_found.sh sh test/7_node_modules_path.sh sh test/8_set_u.sh sh test/9_husky_0.sh sh test/10_init.sh sh test/11_time.sh sh test/12_deprecated.shhusky-9.1.7/test/000077500000000000000000000000001471665631700136725ustar00rootroot00000000000000husky-9.1.7/test/10_init.sh000077500000000000000000000001501471665631700154700ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install # Test init command expect 0 "npx --no-install husky init" husky-9.1.7/test/11_time.sh000077500000000000000000000002341471665631700154670ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install npx --no-install husky git add package.json echo "echo pre-commit" > .husky/pre-commit time git commit -m foo husky-9.1.7/test/12_deprecated.sh000077500000000000000000000003171471665631700166340ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install npx --no-install husky git add package.json cat > .husky/pre-commit <<'EOL' #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" EOL expect 0 "git commit -m foo"husky-9.1.7/test/1_default.sh000077500000000000000000000003731471665631700161000ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install npx --no-install husky # Test core.hooksPath expect_hooksPath_to_be ".husky/_" # Test pre-commit git add package.json echo "echo \"pre-commit\" && exit 1" > .husky/pre-commit expect 1 "git commit -m foo" husky-9.1.7/test/2_in-sub-dir.sh000077500000000000000000000004561471665631700164300ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install # Test custom dir support mkdir sub npx --no-install husky sub/husky echo "echo \"pre-commit\" && exit 1" >sub/husky/pre-commit # Test core.hooksPath expect_hooksPath_to_be "sub/husky/_" # Test pre-commit git add package.json expect 1 "git commit -m foo" husky-9.1.7/test/3_from-sub-dir.sh000077500000000000000000000010321471665631700167550ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup # Skip test for npm 6 npm --version | grep "^6\." && exit 0 # Example: # .git # sub/package.json # Edit package.json in sub directory mkdir sub cd sub npm install ../../husky.tgz cat >package.json <.husky/pre-commit # Test core.hooksPath expect_hooksPath_to_be "sub/.husky/_" # Test pre-commit git add package.json expect 1 "git commit -m foo" husky-9.1.7/test/4_not-git-dir.sh000077500000000000000000000002331471665631700166070ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install # Should not fail rm -rf .git expect 0 "npx --no-install husky" mkdir .git expect 0 "npx --no-install husky" husky-9.1.7/test/5_git_command_not_found.sh000077500000000000000000000002351471665631700210110ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install cat >index.mjs < .husky/pre-commit expect 1 "git commit -m foo" husky-9.1.7/test/7_node_modules_path.sh000077500000000000000000000003601471665631700201470ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install npx --no-install husky # Test pre-commit git add package.json # Should not fail when running hook echo 'echo "$PATH" | grep "node_modules/.bin"' > .husky/pre-commit expect 0 "git commit -m foo" husky-9.1.7/test/8_set_u.sh000077500000000000000000000005071471665631700156010ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install npx --no-install husky expect_hooksPath_to_be ".husky/_" git add package.json echo "echo \"pre-commit\"" > .husky/pre-commit # Should not fail if set -u is used mkdir -p config/husky echo "set -u" > config/husky/init.sh XDG_CONFIG_HOME="$(pwd)/config" expect 0 "git commit -m foo"husky-9.1.7/test/9_husky_0.sh000077500000000000000000000007671471665631700160550ustar00rootroot00000000000000#!/bin/sh . test/functions.sh setup install # Should not setup hooks when HUSKY=0 HUSKY=0 npx --no-install husky expect_hooksPath_to_be "" # Should setup hooks npx --no-install husky expect_hooksPath_to_be ".husky/_" # Should not commit git add package.json echo "echo \"pre-commit\" && exit 1" >.husky/pre-commit expect 1 "git commit -m foo" # Should commit when HUSKY=0 mkdir -p config/husky echo "export HUSKY=0" > config/husky/init.sh XDG_CONFIG_HOME="$(pwd)/config" expect 0 "git commit -m foo"husky-9.1.7/test/functions.sh000077500000000000000000000016011471665631700162370ustar00rootroot00000000000000# Exit on error set -eu setup() { name="$(basename -- "$0")" testDir="/tmp/husky-test-$name" echo echo "-------------------" echo "+ $name" echo "-------------------" echo # Create test directory rm -rf "$testDir" mkdir -p "$testDir" cd "$testDir" # Init git git init --quiet git config user.email "test@test" git config user.name "test" # Init package.json npm_config_loglevel="error" npm init -y 1>/dev/null } install() { npm install ../husky.tgz } expect() { set +e sh -c "$2" exitCode="$?" set -e if [ $exitCode != "$1" ]; then error "expect command \"$2\" to exit with code $1 (got $exitCode)" fi } expect_hooksPath_to_be() { set +e hooksPath=$(git config core.hooksPath) if [ "$hooksPath" != "$1" ]; then error "core.hooksPath should be $1, was $hooksPath" fi } error() { echo -e "\e[0;31mERROR:\e[m $1" exit 1 } ok() { echo -e "\e[0;32mOK\e[m" }