commit 3af5c5b48773587b7c949f35d767cee02735e0f4 Author: Andras Bacsai Date: Wed Sep 4 10:15:31 2024 +0200 ๐ŸŒฎ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e09bf55 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Starlight Starter Kit: Basics + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) + +``` +npm create astro@latest -- --template starlight +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) + +> ๐Ÿง‘โ€๐Ÿš€ **Seasoned astronaut?** Delete this file. Have fun! + +## ๐Ÿš€ Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and files: + +``` +. +โ”œโ”€โ”€ public/ +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ assets/ +โ”‚ โ”œโ”€โ”€ content/ +โ”‚ โ”‚ โ”œโ”€โ”€ docs/ +โ”‚ โ”‚ โ””โ”€โ”€ config.ts +โ”‚ โ””โ”€โ”€ env.d.ts +โ”œโ”€โ”€ astro.config.mjs +โ”œโ”€โ”€ package.json +โ””โ”€โ”€ tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## ๐Ÿงž Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## ๐Ÿ‘€ Want to learn more? + +Check out [Starlightโ€™s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..c7fe882 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,243 @@ +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi' +import starlightImageZoom from 'starlight-image-zoom' +import starlightLinksValidator from 'starlight-links-validator' +import tailwind from '@astrojs/tailwind'; + +import sitemap from '@astrojs/sitemap'; + +// https://astro.build/config +export default defineConfig({ + base: '/docs', + site: 'https://coolify.io/docs', + integrations: [tailwind({ + // Disable the default base styles: + applyBaseStyles: false, + }), starlight({ + customCss: [ + './src/tailwind.css', + ], + favicon: '/coolify.png', + social: { + 'x.com': 'https://x.com/coolifyio', + discord: 'https://discord.gg/coolify', + github: 'https://github.com/coollabsio/coolify', + twitch: 'https://twitch.tv/heyandras', + }, + plugins: [ + starlightLinksValidator(), + starlightImageZoom(), + starlightOpenAPI([ + { + base: 'api', + label: 'API', + schema: './openapi.yaml', + }, + ]), + ], + title: 'Coolify', + social: { + github: 'https://github.com/coollabsio/coolify-documentation', + }, + sidebar: [ + { + label: 'Get Started', + items: [ + { label: 'Introduction', link: '/' }, + { label: 'Screenshots', link: '/screenshots' }, + { label: 'Videos', link: '/videos' }, + { label: 'Quickstart', link: '/quickstart' }, + { label: 'Installation - Self-hosted', link: '/installation' }, + { label: 'Uninstall - Self-hosted', link: '/uninstall' }, + { label: 'Upgrade - Self-hosted', link: '/upgrade' }, + { label: 'Downgrade - Self-hosted', link: '/downgrade' }, + { label: 'Contact', link: '/contact' }, + ] + }, + { + label: 'Knowledge Base', + collapsed: false, + items: [ + { label: 'FAQ', link: '/knowledge-base/faq' }, + { + label: 'Self-hosted Instance', items: [ + { label: 'Monitoring', link: '/knowledge-base/monitoring' }, + { label: 'Notifications', link: '/knowledge-base/notifications' }, + { label: 'Self-update', link: '/knowledge-base/self-update' }, + { label: 'Commands', link: '/knowledge-base/commands' }, + { label: "Delete User", link: '/knowledge-base/delete-user' }, + ] + }, + { + label: 'DNS & Domains', items: [ + { label: 'DNS Configuration', link: '/knowledge-base/dns-configuration' }, + { label: 'Domains', link: '/knowledge-base/domains' }, + ] + }, + { + label: 'Resources', items: [ + { label: 'Environment Variables', link: '/knowledge-base/environment-variables' }, + { label: 'Persistent Storage', link: '/knowledge-base/persistent-storage' }, + { label: 'Drain Logs', link: '/knowledge-base/drain-logs' }, + { label: 'Health checks', link: '/knowledge-base/health-checks' }, + { label: 'Database Backups', link: '/knowledge-base/database-backups' }, + { label: 'How to add a new service', link: '/knowledge-base/add-a-service' }, + { + label: 'Applications', items: [ + { label: 'Overview', link: '/knowledge-base/applications' }, + { label: 'Django', link: '/knowledge-base/applications/django' }, + { label: 'Laravel', link: '/knowledge-base/applications/laravel' }, + { label: 'Jekyll', link: '/knowledge-base/applications/jekyll' }, + { label: 'Next.js', link: '/knowledge-base/applications/nextjs' }, + { label: 'Nuxt', link: '/knowledge-base/applications/nuxt' }, + { label: 'Ruby on Rails', link: '/knowledge-base/applications/rails' }, + { label: 'SvelteKit', link: '/knowledge-base/applications/svelte-kit' }, + { label: 'Symfony', link: '/knowledge-base/applications/symfony' }, + { label: 'Vite', link: '/knowledge-base/applications/vite' }, + { label: 'Vue.js', link: '/knowledge-base/applications/vuejs' }, + ] + }, + { + label: "Databases", items: [ + { label: "Overview", link: '/knowledge-base/databases' }, + { label: 'Backups', link: '/knowledge-base/databases/backups' }, + { label: "MySQL", link: '/knowledge-base/databases/mysql' }, + { label: "MariaDB", link: '/knowledge-base/databases/mariadb' }, + { label: "PostgreSQL", link: '/knowledge-base/databases/postgresql' }, + { label: "MongoDB", link: '/knowledge-base/databases/mongodb' }, + { label: "Redis", link: '/knowledge-base/databases/redis' }, + { label: "DragonFly", link: '/knowledge-base/databases/dragonfly' }, + { label: "KeyDB", link: '/knowledge-base/databases/keydb' }, + { label: "Clickhouse", link: '/knowledge-base/databases/clickhouse' }, + ] + }, + + { + label: "Services", items: [ + { label: "Overview", link: '/knowledge-base/services' }, + { label: "Activepieces", link: '/knowledge-base/services/activepieces' }, + { label: "Appsmith", link: '/knowledge-base/services/appsmith' }, + { label: "Appwrite", link: '/knowledge-base/services/appwrite' }, + { label: "Authentik", link: '/knowledge-base/services/authentik' }, + { label: "Baby Buddy", link: '/knowledge-base/services/babybuddy' }, + { label: "Budge", link: '/knowledge-base/services/budge' }, + { label: "Changedetection", link: '/knowledge-base/services/changedetection' }, + { label: "Classicpress", link: '/knowledge-base/services/classicpress' }, + { label: "Code Server", link: '/knowledge-base/services/code-server' }, + { label: "Dashboard", link: '/knowledge-base/services/dashboard' }, + { label: "Directus", link: '/knowledge-base/services/directus' }, + { label: "Dokuwiki", link: '/knowledge-base/services/dokuwiki' }, + { label: "Duplicati", link: '/knowledge-base/services/duplicati' }, + { label: "Emby Stat", link: '/knowledge-base/services/emby-stat' }, + { label: "Emby", link: '/knowledge-base/services/emby' }, + { label: "Fider", link: '/knowledge-base/services/fider' }, + { label: "Filebrowser", link: '/knowledge-base/services/filebrowser' }, + { label: "Firefly III", link: '/knowledge-base/services/firefly-iii' }, + { label: "Formbricks", link: '/knowledge-base/services/formbricks' }, + { label: "Ghost", link: '/knowledge-base/services/ghost' }, + { label: "Gitea", link: '/knowledge-base/services/gitea' }, + { label: "Glitchtip", link: '/knowledge-base/services/glitchtip' }, + { label: "Grafana", link: '/knowledge-base/services/grafana' }, + { label: "Grocy", link: '/knowledge-base/services/grocy' }, + { label: "Heimdall", link: '/knowledge-base/services/heimdall' }, + { label: "Jellyfin", link: '/knowledge-base/services/jellyfin' }, + { label: "Kuzzle", link: '/knowledge-base/services/kuzzle' }, + { label: "Logto", link: '/knowledge-base/services/logto' }, + { label: "Meilisearch", link: '/knowledge-base/services/meilisearch' }, + { label: "Metabase", link: '/knowledge-base/services/metabase' }, + { label: "Metube", link: '/knowledge-base/services/metube' }, + { label: "Minio", link: '/knowledge-base/services/minio' }, + { label: "Plausible", link: '/knowledge-base/services/plausible' }, + { label: "Statusnook", link: '/knowledge-base/services/statusnook' }, + ] + } + ] + }, + { + label: 'How-Tos', items: [ + { label: 'Load-balancing on Hetzner', link: '/knowledge-base/how-to/hetzner-loadbalancing' }, + ] + }, + { + label: "Git", items: [ + { + label: "GitHub", items: [ + { label: "Integration", link: '/knowledge-base/git/github/integration' }, + { label: "GitHub Actions", link: '/knowledge-base/git/github/github-actions' }, + ], + }, + { + label: "GitLab", items: [ + { label: "Integration", link: '/knowledge-base/git/gitlab/integration' }, + ], + }, + { + label: "Bitbucket", items: [ + { label: "Integration", link: '/knowledge-base/git/bitbucket/integration' }, + ], + }, + { + label: "Gitea", items: [ + { label: "Integration", link: '/knowledge-base/git/gitea/integration' }, + ] + } + ] + }, + { + label: "Server", items: [ + { label: "Introduction", link: '/knowledge-base/server/introduction' }, + { label: "Automated Cleanup", link: '/knowledge-base/server/automated-cleanup' }, + { label: "Build Server", link: '/knowledge-base/server/build-server' }, + { label: "Firewall", link: '/knowledge-base/server/firewall' }, + { label: "Multiple Servers", link: '/knowledge-base/server/multiple-servers' }, + { label: "Non-root User", link: '/knowledge-base/server/non-root-user' }, + { label: "OpenSSH", link: '/knowledge-base/server/openssh' }, + { label: "Oracle Cloud", link: '/knowledge-base/server/oracle-cloud' }, + { label: "Proxies", link: '/knowledge-base/server/proxies' } + ] + }, + { + label: "S3", items: [ + { label: "Introduction", link: '/knowledge-base/s3' }, + { label: "AWS", link: '/knowledge-base/s3/aws' }, + { label: "R2", link: '/knowledge-base/s3/r2' }, + ] + }, + { + label: "Docker", items: [ + { label: "Compose", link: '/knowledge-base/docker/compose' }, + { label: "Custom Commands", link: '/knowledge-base/docker/custom-commands' }, + { label: "Registry", link: '/knowledge-base/docker/registry' }, + { label: "Swarm", link: '/knowledge-base/docker/swarm' }, + ] + }, + { + label: "Cloudflare", items: [ + { label: "Tunnels", link: '/knowledge-base/cloudflare/tunnels' }, + ] + }, { + label: "Traefik", items: [ + { label: "Basic Auth Middleware", link: '/knowledge-base/traefik/basic-auth' }, + { label: "Custom SSL Certificates", link: '/knowledge-base/traefik/custom-ssl-certs' }, + { label: "Dashboard", link: '/knowledge-base/traefik/dashboard' }, + { label: "Dynamic Configurations", link: '/knowledge-base/traefik/dynamic-configurations' }, + { label: "Healthcheck", link: '/knowledge-base/traefik/healthcheck' }, + { label: "Load Balancing", link: '/knowledge-base/traefik/load-balancing' }, + { label: "Redirects", link: '/knowledge-base/traefik/redirects' }, + { label: "Wildcard Certificates", link: '/knowledge-base/traefik/wildcard-certificates' }, + ] + } + ] + }, + { + label: "API Reference", + items: [ + { label: "Authorization", link: '/api-reference/authorization' }, + ...openAPISidebarGroups, + ] + }, + + ], + }), sitemap()], +}); \ No newline at end of file diff --git a/openapi.yaml b/openapi.yaml new file mode 100644 index 0000000..e5bebd5 --- /dev/null +++ b/openapi.yaml @@ -0,0 +1,4892 @@ +openapi: 3.0.0 +info: + title: Coolify + version: '0.1' +servers: + - + url: 'https://app.coolify.io/api/v1' + description: 'Coolify Cloud API. Change the host to your own instance if you are self-hosting.' +paths: + /applications: + get: + tags: + - Applications + summary: List + description: 'List all applications.' + operationId: list-applications + responses: + '200': + description: 'Get all applications.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Application' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/public: + post: + tags: + - Applications + summary: 'Create (Public)' + description: 'Create new application based on a public git repository.' + operationId: create-public-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - git_repository + - git_branch + - build_pack + - ports_exposes + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + git_repository: + type: string + description: 'The git repository URL.' + git_branch: + type: string + description: 'The git branch.' + build_pack: + type: string + enum: [nixpacks, static, dockerfile, dockercompose] + description: 'The build pack type.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + git_commit_sha: + type: string + description: 'The git commit SHA.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + is_static: + type: boolean + description: 'The flag to indicate if the application is static.' + install_command: + type: string + description: 'The install command.' + build_command: + type: string + description: 'The build command.' + start_command: + type: string + description: 'The start command.' + ports_mappings: + type: string + description: 'The ports mappings.' + base_directory: + type: string + description: 'The base directory for all commands.' + publish_directory: + type: string + description: 'The publish directory.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + dockerfile: + type: string + description: 'The Dockerfile content.' + docker_compose_location: + type: string + description: 'The Docker Compose location.' + docker_compose_raw: + type: string + description: 'The Docker Compose raw content.' + docker_compose_custom_start_command: + type: string + description: 'The Docker Compose custom start command.' + docker_compose_custom_build_command: + type: string + description: 'The Docker Compose custom build command.' + docker_compose_domains: + type: array + description: 'The Docker Compose domains.' + watch_paths: + type: string + description: 'The watch paths.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/private-github-app: + post: + tags: + - Applications + summary: 'Create (Private - GH App)' + description: 'Create new application based on a private repository through a Github App.' + operationId: create-private-github-app-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - github_app_uuid + - git_repository + - git_branch + - build_pack + - ports_exposes + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + github_app_uuid: + type: string + description: 'The Github App UUID.' + git_repository: + type: string + description: 'The git repository URL.' + git_branch: + type: string + description: 'The git branch.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + build_pack: + type: string + enum: [nixpacks, static, dockerfile, dockercompose] + description: 'The build pack type.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + git_commit_sha: + type: string + description: 'The git commit SHA.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + is_static: + type: boolean + description: 'The flag to indicate if the application is static.' + install_command: + type: string + description: 'The install command.' + build_command: + type: string + description: 'The build command.' + start_command: + type: string + description: 'The start command.' + ports_mappings: + type: string + description: 'The ports mappings.' + base_directory: + type: string + description: 'The base directory for all commands.' + publish_directory: + type: string + description: 'The publish directory.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + dockerfile: + type: string + description: 'The Dockerfile content.' + docker_compose_location: + type: string + description: 'The Docker Compose location.' + docker_compose_raw: + type: string + description: 'The Docker Compose raw content.' + docker_compose_custom_start_command: + type: string + description: 'The Docker Compose custom start command.' + docker_compose_custom_build_command: + type: string + description: 'The Docker Compose custom build command.' + docker_compose_domains: + type: array + description: 'The Docker Compose domains.' + watch_paths: + type: string + description: 'The watch paths.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/private-deploy-key: + post: + tags: + - Applications + summary: 'Create (Private - Deploy Key)' + description: 'Create new application based on a private repository through a Deploy Key.' + operationId: create-private-deploy-key-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - private_key_uuid + - git_repository + - git_branch + - build_pack + - ports_exposes + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + private_key_uuid: + type: string + description: 'The private key UUID.' + git_repository: + type: string + description: 'The git repository URL.' + git_branch: + type: string + description: 'The git branch.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + build_pack: + type: string + enum: [nixpacks, static, dockerfile, dockercompose] + description: 'The build pack type.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + git_commit_sha: + type: string + description: 'The git commit SHA.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + is_static: + type: boolean + description: 'The flag to indicate if the application is static.' + install_command: + type: string + description: 'The install command.' + build_command: + type: string + description: 'The build command.' + start_command: + type: string + description: 'The start command.' + ports_mappings: + type: string + description: 'The ports mappings.' + base_directory: + type: string + description: 'The base directory for all commands.' + publish_directory: + type: string + description: 'The publish directory.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + dockerfile: + type: string + description: 'The Dockerfile content.' + docker_compose_location: + type: string + description: 'The Docker Compose location.' + docker_compose_raw: + type: string + description: 'The Docker Compose raw content.' + docker_compose_custom_start_command: + type: string + description: 'The Docker Compose custom start command.' + docker_compose_custom_build_command: + type: string + description: 'The Docker Compose custom build command.' + docker_compose_domains: + type: array + description: 'The Docker Compose domains.' + watch_paths: + type: string + description: 'The watch paths.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/dockerfile: + post: + tags: + - Applications + summary: 'Create (Dockerfile)' + description: 'Create new application based on a simple Dockerfile.' + operationId: create-dockerfile-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - dockerfile + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + dockerfile: + type: string + description: 'The Dockerfile content.' + build_pack: + type: string + enum: [nixpacks, static, dockerfile, dockercompose] + description: 'The build pack type.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + ports_mappings: + type: string + description: 'The ports mappings.' + base_directory: + type: string + description: 'The base directory for all commands.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/dockerimage: + post: + tags: + - Applications + summary: 'Create (Docker Image)' + description: 'Create new application based on a prebuilt docker image' + operationId: create-dockerimage-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - docker_registry_image_name + - ports_exposes + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + ports_mappings: + type: string + description: 'The ports mappings.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /applications/dockercompose: + post: + tags: + - Applications + summary: 'Create (Docker Compose)' + description: 'Create new application based on a docker-compose file.' + operationId: create-dockercompose-application + requestBody: + description: 'Application object that needs to be created.' + required: true + content: + application/json: + schema: + required: + - project_uuid + - server_uuid + - environment_name + - docker_compose_raw + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + docker_compose_raw: + type: string + description: 'The Docker Compose raw content.' + destination_uuid: + type: string + description: 'The destination UUID if the server has more than one destinations.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + type: object + responses: + '200': + description: 'Application created successfully.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/applications/{uuid}': + get: + tags: + - Applications + summary: Get + description: 'Get application by UUID.' + operationId: get-application-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Get application by UUID.' + content: + application/json: + schema: + $ref: '#/components/schemas/Application' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + delete: + tags: + - Applications + summary: Delete + description: 'Delete application by UUID.' + operationId: delete-application-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + - + name: cleanup + in: query + description: 'Delete configurations and volumes.' + required: false + schema: + type: boolean + default: true + responses: + '200': + description: 'Application deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Application deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + patch: + tags: + - Applications + summary: Update + description: 'Update application by UUID.' + operationId: update-application-by-uuid + requestBody: + description: 'Application updated.' + required: true + content: + application/json: + schema: + properties: + project_uuid: + type: string + description: 'The project UUID.' + server_uuid: + type: string + description: 'The server UUID.' + environment_name: + type: string + description: 'The environment name.' + github_app_uuid: + type: string + description: 'The Github App UUID.' + git_repository: + type: string + description: 'The git repository URL.' + git_branch: + type: string + description: 'The git branch.' + ports_exposes: + type: string + description: 'The ports to expose.' + destination_uuid: + type: string + description: 'The destination UUID.' + build_pack: + type: string + enum: [nixpacks, static, dockerfile, dockercompose] + description: 'The build pack type.' + name: + type: string + description: 'The application name.' + description: + type: string + description: 'The application description.' + domains: + type: string + description: 'The application domains.' + git_commit_sha: + type: string + description: 'The git commit SHA.' + docker_registry_image_name: + type: string + description: 'The docker registry image name.' + docker_registry_image_tag: + type: string + description: 'The docker registry image tag.' + is_static: + type: boolean + description: 'The flag to indicate if the application is static.' + install_command: + type: string + description: 'The install command.' + build_command: + type: string + description: 'The build command.' + start_command: + type: string + description: 'The start command.' + ports_mappings: + type: string + description: 'The ports mappings.' + base_directory: + type: string + description: 'The base directory for all commands.' + publish_directory: + type: string + description: 'The publish directory.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + custom_labels: + type: string + description: 'Custom labels.' + custom_docker_run_options: + type: string + description: 'Custom docker run options.' + post_deployment_command: + type: string + description: 'Post deployment command.' + post_deployment_command_container: + type: string + description: 'Post deployment command container.' + pre_deployment_command: + type: string + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + description: 'Pre deployment command container.' + manual_webhook_secret_github: + type: string + description: 'Manual webhook secret for Github.' + manual_webhook_secret_gitlab: + type: string + description: 'Manual webhook secret for Gitlab.' + manual_webhook_secret_bitbucket: + type: string + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + description: 'Manual webhook secret for Gitea.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: [www, non-www, both] + instant_deploy: + type: boolean + description: 'The flag to indicate if the application should be deployed instantly.' + dockerfile: + type: string + description: 'The Dockerfile content.' + docker_compose_location: + type: string + description: 'The Docker Compose location.' + docker_compose_raw: + type: string + description: 'The Docker Compose raw content.' + docker_compose_custom_start_command: + type: string + description: 'The Docker Compose custom start command.' + docker_compose_custom_build_command: + type: string + description: 'The Docker Compose custom build command.' + docker_compose_domains: + type: array + description: 'The Docker Compose domains.' + watch_paths: + type: string + description: 'The watch paths.' + type: object + responses: + '200': + description: 'Application updated.' + content: + application/json: + schema: + properties: + uuid: { type: string } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/envs': + get: + tags: + - Applications + summary: 'List Envs' + description: 'List all envs by application UUID.' + operationId: list-envs-by-application-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'All environment variables by application UUID.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/EnvironmentVariable' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + post: + tags: + - Applications + summary: 'Create Env' + description: 'Create env by application UUID.' + operationId: create-env-by-application-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + requestBody: + description: 'Env created.' + required: true + content: + application/json: + schema: + properties: + key: + type: string + description: 'The key of the environment variable.' + value: + type: string + description: 'The value of the environment variable.' + is_preview: + type: boolean + description: 'The flag to indicate if the environment variable is used in preview deployments.' + is_build_time: + type: boolean + description: 'The flag to indicate if the environment variable is used in build time.' + is_literal: + type: boolean + description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' + is_multiline: + type: boolean + description: 'The flag to indicate if the environment variable is multiline.' + is_shown_once: + type: boolean + description: "The flag to indicate if the environment variable's value is shown on the UI." + type: object + responses: + '201': + description: 'Environment variable created.' + content: + application/json: + schema: + properties: + uuid: { type: string, example: nc0k04gk8g0cgsk440g0koko } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + patch: + tags: + - Applications + summary: 'Update Env' + description: 'Update env by application UUID.' + operationId: update-env-by-application-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + requestBody: + description: 'Env updated.' + required: true + content: + application/json: + schema: + required: + - key + - value + properties: + key: + type: string + description: 'The key of the environment variable.' + value: + type: string + description: 'The value of the environment variable.' + is_preview: + type: boolean + description: 'The flag to indicate if the environment variable is used in preview deployments.' + is_build_time: + type: boolean + description: 'The flag to indicate if the environment variable is used in build time.' + is_literal: + type: boolean + description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' + is_multiline: + type: boolean + description: 'The flag to indicate if the environment variable is multiline.' + is_shown_once: + type: boolean + description: "The flag to indicate if the environment variable's value is shown on the UI." + type: object + responses: + '201': + description: 'Environment variable updated.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Environment variable updated.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/envs/bulk': + patch: + tags: + - Applications + summary: 'Update Envs (Bulk)' + description: 'Update multiple envs by application UUID.' + operationId: update-envs-by-application-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + requestBody: + description: 'Bulk envs updated.' + required: true + content: + application/json: + schema: + required: + - data + properties: + data: + type: array + items: { properties: { key: { type: string, description: 'The key of the environment variable.' }, value: { type: string, description: 'The value of the environment variable.' }, is_preview: { type: boolean, description: 'The flag to indicate if the environment variable is used in preview deployments.' }, is_build_time: { type: boolean, description: 'The flag to indicate if the environment variable is used in build time.' }, is_literal: { type: boolean, description: 'The flag to indicate if the environment variable is a literal, nothing espaced.' }, is_multiline: { type: boolean, description: 'The flag to indicate if the environment variable is multiline.' }, is_shown_once: { type: boolean, description: "The flag to indicate if the environment variable's value is shown on the UI." } }, type: object } + type: object + responses: + '201': + description: 'Environment variables updated.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Environment variables updated.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/envs/{env_uuid}': + delete: + tags: + - Applications + summary: 'Delete Env' + description: 'Delete env by UUID.' + operationId: delete-env-by-application-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + - + name: env_uuid + in: path + description: 'UUID of the environment variable.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Environment variable deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Environment variable deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/start': + get: + tags: + - Applications + summary: Start + description: 'Start application. `Post` request is also accepted.' + operationId: start-application-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + - + name: force + in: query + description: 'Force rebuild.' + schema: + type: boolean + default: false + - + name: instant_deploy + in: query + description: 'Instant deploy (skip queuing).' + schema: + type: boolean + default: false + responses: + '200': + description: 'Start application.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Deployment request queued.', description: Message. } + deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/stop': + get: + tags: + - Applications + summary: Stop + description: 'Stop application. `Post` request is also accepted.' + operationId: stop-application-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Stop application.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Application stopping request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/applications/{uuid}/restart': + get: + tags: + - Applications + summary: Restart + description: 'Restart application. `Post` request is also accepted.' + operationId: restart-application-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Restart application.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Restart request queued.' } + deployment_uuid: { type: string, example: doogksw, description: 'UUID of the deployment.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /databases: + get: + tags: + - Databases + summary: List + description: 'List all databases.' + operationId: list-databases + responses: + '200': + description: 'Get all databases' + content: + application/json: + schema: + type: string + example: 'Content is very complex. Will be implemented later.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/databases/{uuid}': + get: + tags: + - Databases + summary: Get + description: 'Get database by UUID.' + operationId: get-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Get all databases' + content: + application/json: + schema: + type: string + example: 'Content is very complex. Will be implemented later.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + delete: + tags: + - Databases + summary: Delete + description: 'Delete database by UUID.' + operationId: delete-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + - + name: cleanup + in: query + description: 'Delete configurations and volumes.' + required: false + schema: + type: boolean + default: true + responses: + '200': + description: 'Database deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Database deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + patch: + tags: + - Databases + summary: Update + description: 'Update database by UUID.' + operationId: update-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + properties: + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + postgres_user: + type: string + description: 'PostgreSQL user' + postgres_password: + type: string + description: 'PostgreSQL password' + postgres_db: + type: string + description: 'PostgreSQL database' + postgres_initdb_args: + type: string + description: 'PostgreSQL initdb args' + postgres_host_auth_method: + type: string + description: 'PostgreSQL host auth method' + postgres_conf: + type: string + description: 'PostgreSQL conf' + clickhouse_admin_user: + type: string + description: 'Clickhouse admin user' + clickhouse_admin_password: + type: string + description: 'Clickhouse admin password' + dragonfly_password: + type: string + description: 'DragonFly password' + redis_password: + type: string + description: 'Redis password' + redis_conf: + type: string + description: 'Redis conf' + keydb_password: + type: string + description: 'KeyDB password' + keydb_conf: + type: string + description: 'KeyDB conf' + mariadb_conf: + type: string + description: 'MariaDB conf' + mariadb_root_password: + type: string + description: 'MariaDB root password' + mariadb_user: + type: string + description: 'MariaDB user' + mariadb_password: + type: string + description: 'MariaDB password' + mariadb_database: + type: string + description: 'MariaDB database' + mongo_conf: + type: string + description: 'Mongo conf' + mongo_initdb_root_username: + type: string + description: 'Mongo initdb root username' + mongo_initdb_root_password: + type: string + description: 'Mongo initdb root password' + mongo_initdb_init_database: + type: string + description: 'Mongo initdb init database' + mysql_root_password: + type: string + description: 'MySQL root password' + mysql_user: + type: string + description: 'MySQL user' + mysql_database: + type: string + description: 'MySQL database' + mysql_conf: + type: string + description: 'MySQL conf' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /databases/postgresql: + post: + tags: + - Databases + summary: 'Create (PostgreSQL)' + description: 'Create a new PostgreSQL database.' + operationId: create-database-postgresql + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + postgres_user: + type: string + description: 'PostgreSQL user' + postgres_password: + type: string + description: 'PostgreSQL password' + postgres_db: + type: string + description: 'PostgreSQL database' + postgres_initdb_args: + type: string + description: 'PostgreSQL initdb args' + postgres_host_auth_method: + type: string + description: 'PostgreSQL host auth method' + postgres_conf: + type: string + description: 'PostgreSQL conf' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/clickhouse: + post: + tags: + - Databases + summary: 'Create (Clickhouse)' + description: 'Create a new Clickhouse database.' + operationId: create-database-clickhouse + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + clickhouse_admin_user: + type: string + description: 'Clickhouse admin user' + clickhouse_admin_password: + type: string + description: 'Clickhouse admin password' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/dragonfly: + post: + tags: + - Databases + summary: 'Create (DragonFly)' + description: 'Create a new DragonFly database.' + operationId: create-database-dragonfly + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + dragonfly_password: + type: string + description: 'DragonFly password' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/redis: + post: + tags: + - Databases + summary: 'Create (Redis)' + description: 'Create a new Redis database.' + operationId: create-database-redis + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + redis_password: + type: string + description: 'Redis password' + redis_conf: + type: string + description: 'Redis conf' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/keydb: + post: + tags: + - Databases + summary: 'Create (KeyDB)' + description: 'Create a new KeyDB database.' + operationId: create-database-keydb + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + keydb_password: + type: string + description: 'KeyDB password' + keydb_conf: + type: string + description: 'KeyDB conf' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/mariadb: + post: + tags: + - Databases + summary: 'Create (MariaDB)' + description: 'Create a new MariaDB database.' + operationId: create-database-mariadb + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + mariadb_conf: + type: string + description: 'MariaDB conf' + mariadb_root_password: + type: string + description: 'MariaDB root password' + mariadb_user: + type: string + description: 'MariaDB user' + mariadb_password: + type: string + description: 'MariaDB password' + mariadb_database: + type: string + description: 'MariaDB database' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/mysql: + post: + tags: + - Databases + summary: 'Create (MySQL)' + description: 'Create a new MySQL database.' + operationId: create-database-mysql + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + mysql_root_password: + type: string + description: 'MySQL root password' + mysql_user: + type: string + description: 'MySQL user' + mysql_database: + type: string + description: 'MySQL database' + mysql_conf: + type: string + description: 'MySQL conf' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /databases/mongodb: + post: + tags: + - Databases + summary: 'Create (MongoDB)' + description: 'Create a new MongoDB database.' + operationId: create-database-mongodb + requestBody: + description: 'Database data' + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + properties: + server_uuid: + type: string + description: 'UUID of the server' + project_uuid: + type: string + description: 'UUID of the project' + environment_name: + type: string + description: 'Name of the environment' + destination_uuid: + type: string + description: 'UUID of the destination if the server has multiple destinations' + mongo_conf: + type: string + description: 'MongoDB conf' + mongo_initdb_root_username: + type: string + description: 'MongoDB initdb root username' + name: + type: string + description: 'Name of the database' + description: + type: string + description: 'Description of the database' + image: + type: string + description: 'Docker Image of the database' + is_public: + type: boolean + description: 'Is the database public?' + public_port: + type: integer + description: 'Public port of the database' + limits_memory: + type: string + description: 'Memory limit of the database' + limits_memory_swap: + type: string + description: 'Memory swap limit of the database' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness of the database' + limits_memory_reservation: + type: string + description: 'Memory reservation of the database' + limits_cpus: + type: string + description: 'CPU limit of the database' + limits_cpuset: + type: string + description: 'CPU set of the database' + limits_cpu_shares: + type: integer + description: 'CPU shares of the database' + instant_deploy: + type: boolean + description: 'Instant deploy the database' + type: object + responses: + '200': + description: 'Database updated' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/databases/{uuid}/start': + get: + tags: + - Databases + summary: Start + description: 'Start database. `Post` request is also accepted.' + operationId: start-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Start database.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Database starting request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/databases/{uuid}/stop': + get: + tags: + - Databases + summary: Stop + description: 'Stop database. `Post` request is also accepted.' + operationId: stop-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Stop database.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Database stopping request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/databases/{uuid}/restart': + get: + tags: + - Databases + summary: Restart + description: 'Restart database. `Post` request is also accepted.' + operationId: restart-database-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the database.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Restart database.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Database restaring request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /deployments: + get: + tags: + - Deployments + summary: List + description: 'List currently running deployments' + operationId: list-deployments + responses: + '200': + description: 'Get all currently running deployments.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ApplicationDeploymentQueue' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/deployments/{uuid}': + get: + tags: + - Deployments + summary: Get + description: 'Get deployment by UUID.' + operationId: get-deployment-by-uuid + parameters: + - + name: uuid + in: path + description: 'Deployment Uuid' + required: true + schema: + type: string + responses: + '200': + description: 'Get deployment by UUID.' + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationDeploymentQueue' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /deploy: + get: + tags: + - Deployments + summary: Deploy + description: 'Deploy by tag or uuid. `Post` request also accepted.' + operationId: deploy-by-tag-or-uuid + parameters: + - + name: tag + in: query + description: 'Tag name(s). Comma separated list is also accepted.' + schema: + type: string + - + name: uuid + in: query + description: 'Resource UUID(s). Comma separated list is also accepted.' + schema: + type: string + - + name: force + in: query + description: 'Force rebuild (without cache)' + schema: + type: boolean + responses: + '200': + description: "Get deployment(s) Uuid's" + content: + application/json: + schema: + properties: + deployments: { type: array, items: { properties: { message: { type: string }, resource_uuid: { type: string }, deployment_uuid: { type: string } }, type: object } } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /version: + get: + summary: Version + description: 'Get Coolify version.' + operationId: version + responses: + '200': + description: 'Returns the version of the application' + content: + application/json: + schema: + type: string + example: v4.0.0 + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /enable: + get: + summary: 'Enable API' + description: 'Enable API (only with root permissions).' + operationId: enable-api + responses: + '200': + description: 'Enable API.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'API enabled.' } + type: object + '403': + description: 'You are not allowed to enable the API.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'You are not allowed to enable the API.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /disable: + get: + summary: 'Disable API' + description: 'Disable API (only with root permissions).' + operationId: disable-api + responses: + '200': + description: 'Disable API.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'API disabled.' } + type: object + '403': + description: 'You are not allowed to disable the API.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'You are not allowed to disable the API.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /healthcheck: + get: + summary: Healthcheck + description: 'Healthcheck endpoint.' + operationId: healthcheck + responses: + '200': + description: 'Healthcheck endpoint.' + content: + application/json: + schema: + type: string + example: OK + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + /projects: + get: + tags: + - Projects + summary: List + description: 'list projects.' + operationId: list-projects + responses: + '200': + description: 'Get all projects.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Project' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + post: + tags: + - Projects + summary: Create + description: 'Create Project.' + operationId: create-project + requestBody: + description: 'Project created.' + required: true + content: + application/json: + schema: + properties: + uuid: + type: string + description: 'The name of the project.' + description: + type: string + description: 'The description of the project.' + type: object + responses: + '201': + description: 'Project created.' + content: + application/json: + schema: + properties: + uuid: { type: string, example: og888os, description: 'The UUID of the project.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/projects/{uuid}': + get: + tags: + - Projects + summary: Get + description: 'Get project by Uuid.' + operationId: get-project-by-uuid + parameters: + - + name: uuid + in: path + description: 'Project UUID' + required: true + schema: + type: string + responses: + '200': + description: 'Project details' + content: + application/json: + schema: + $ref: '#/components/schemas/Project' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + description: 'Project not found.' + security: + - + bearerAuth: [] + delete: + tags: + - Projects + summary: Delete + description: 'Delete project by UUID.' + operationId: delete-project-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the application.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Project deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Project deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + patch: + tags: + - Projects + summary: Update + description: 'Update Project.' + operationId: update-project-by-uuid + requestBody: + description: 'Project updated.' + required: true + content: + application/json: + schema: + properties: + name: + type: string + description: 'The name of the project.' + description: + type: string + description: 'The description of the project.' + type: object + responses: + '201': + description: 'Project updated.' + content: + application/json: + schema: + properties: + uuid: { type: string, example: og888os } + name: { type: string, example: 'Project Name' } + description: { type: string, example: 'Project Description' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/projects/{uuid}/{environment_name}': + get: + tags: + - Projects + summary: Environment + description: 'Get environment by name.' + operationId: get-environment-by-name + parameters: + - + name: uuid + in: path + description: 'Project UUID' + required: true + schema: + type: string + - + name: environment_name + in: path + description: 'Environment name' + required: true + schema: + type: string + responses: + '200': + description: 'Project details' + content: + application/json: + schema: + $ref: '#/components/schemas/Environment' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /resources: + get: + tags: + - Resources + summary: List + description: 'Get all resources.' + operationId: list-resources + responses: + '200': + description: 'Get all resources' + content: + application/json: + schema: + type: string + example: 'Content is very complex. Will be implemented later.' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /security/keys: + get: + tags: + - 'Private Keys' + summary: List + description: 'List all private keys.' + operationId: list-private-keys + responses: + '200': + description: 'Get all private keys.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PrivateKey' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + post: + tags: + - 'Private Keys' + summary: Create + description: 'Create a new private key.' + operationId: create-private-key + requestBody: + required: true + content: + application/json: + schema: + required: + - private_key + properties: + name: + type: string + description: + type: string + private_key: + type: string + type: object + additionalProperties: false + responses: + '201': + description: "The created private key's UUID." + content: + application/json: + schema: + properties: + uuid: { type: string } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + patch: + tags: + - 'Private Keys' + summary: Update + description: 'Update a private key.' + operationId: update-private-key + requestBody: + required: true + content: + application/json: + schema: + required: + - private_key + properties: + name: + type: string + description: + type: string + private_key: + type: string + type: object + additionalProperties: false + responses: + '201': + description: "The updated private key's UUID." + content: + application/json: + schema: + properties: + uuid: { type: string } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/security/keys/{uuid}': + get: + tags: + - 'Private Keys' + summary: Get + description: 'Get key by UUID.' + operationId: get-private-key-by-uuid + parameters: + - + name: uuid + in: path + description: 'Private Key Uuid' + required: true + schema: + type: string + responses: + '200': + description: 'Get all private keys.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PrivateKey' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + description: 'Private Key not found.' + security: + - + bearerAuth: [] + delete: + tags: + - 'Private Keys' + summary: Delete + description: 'Delete a private key.' + operationId: delete-private-key-by-uuid + parameters: + - + name: uuid + in: path + description: 'Private Key Uuid' + required: true + schema: + type: string + responses: + '200': + description: 'Private Key deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Private Key deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + description: 'Private Key not found.' + security: + - + bearerAuth: [] + /servers: + get: + tags: + - Servers + summary: List + description: 'List all servers.' + operationId: list-servers + responses: + '200': + description: 'Get all servers.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Server' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + post: + tags: + - Servers + summary: Create + description: 'Create Server.' + operationId: create-server + requestBody: + description: 'Server created.' + required: true + content: + application/json: + schema: + properties: + name: + type: string + example: 'My Server' + description: 'The name of the server.' + description: + type: string + example: 'My Server Description' + description: 'The description of the server.' + ip: + type: string + example: 127.0.0.1 + description: 'The IP of the server.' + port: + type: integer + example: 22 + description: 'The port of the server.' + user: + type: string + example: root + description: 'The user of the server.' + private_key_uuid: + type: string + example: og888os + description: 'The UUID of the private key.' + is_build_server: + type: boolean + example: false + description: 'Is build server.' + instant_validate: + type: boolean + example: false + description: 'Instant validate.' + type: object + responses: + '201': + description: 'Server created.' + content: + application/json: + schema: + properties: + uuid: { type: string, example: og888os, description: 'The UUID of the server.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/servers/{uuid}': + get: + tags: + - Servers + summary: Get + description: 'Get server by UUID.' + operationId: get-server-by-uuid + parameters: + - + name: uuid + in: path + description: "Server's Uuid" + required: true + schema: + type: string + responses: + '200': + description: 'Get server by UUID' + content: + application/json: + schema: + $ref: '#/components/schemas/Server' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + delete: + tags: + - Servers + summary: Delete + description: 'Delete server by UUID.' + operationId: delete-server-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the server.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Server deleted.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Server deleted.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + patch: + tags: + - Servers + summary: Update + description: 'Update Server.' + operationId: update-server-by-uuid + requestBody: + description: 'Server updated.' + required: true + content: + application/json: + schema: + properties: + name: + type: string + description: 'The name of the server.' + description: + type: string + description: 'The description of the server.' + ip: + type: string + description: 'The IP of the server.' + port: + type: integer + description: 'The port of the server.' + user: + type: string + description: 'The user of the server.' + private_key_uuid: + type: string + description: 'The UUID of the private key.' + is_build_server: + type: boolean + description: 'Is build server.' + instant_validate: + type: boolean + description: 'Instant validate.' + type: object + responses: + '201': + description: 'Server updated.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Server' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/servers/{uuid}/resources': + get: + tags: + - Servers + summary: Resources + description: 'Get resources by server.' + operationId: get-resources-by-server-uuid + parameters: + - + name: uuid + in: path + description: "Server's Uuid" + required: true + schema: + type: string + responses: + '200': + description: 'Get resources by server' + content: + application/json: + schema: + type: array + items: + properties: { id: { type: integer }, uuid: { type: string }, name: { type: string }, type: { type: string }, created_at: { type: string }, updated_at: { type: string }, status: { type: string } } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/servers/{uuid}/domains': + get: + tags: + - Servers + summary: Domains + description: 'Get domains by server.' + operationId: get-domains-by-server-uuid + parameters: + - + name: uuid + in: path + description: "Server's Uuid" + required: true + schema: + type: string + responses: + '200': + description: 'Get domains by server' + content: + application/json: + schema: + type: array + items: + properties: { ip: { type: string }, domains: { type: array, items: { type: string } } } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/servers/{uuid}/validate': + get: + tags: + - Servers + summary: Validate + description: 'Validate server by UUID.' + operationId: validate-server-by-uuid + parameters: + - + name: uuid + in: path + description: 'Server UUID' + required: true + schema: + type: string + responses: + '201': + description: 'Server validation started.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Validation started.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /services: + get: + tags: + - Services + summary: List + description: 'List all services.' + operationId: list-services + responses: + '200': + description: 'Get all services' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Service' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + post: + tags: + - Services + summary: Create + description: 'Create a one-click service' + operationId: create-service + requestBody: + required: true + content: + application/json: + schema: + required: + - server_uuid + - project_uuid + - environment_name + - type + properties: + type: + description: 'The one-click service type' + type: string + enum: [activepieces, appsmith, appwrite, authentik, babybuddy, budge, changedetection, chatwoot, classicpress-with-mariadb, classicpress-with-mysql, classicpress-without-database, cloudflared, code-server, dashboard, directus, directus-with-postgresql, docker-registry, docuseal, docuseal-with-postgres, dokuwiki, duplicati, emby, embystat, fider, filebrowser, firefly, formbricks, ghost, gitea, gitea-with-mariadb, gitea-with-mysql, gitea-with-postgresql, glance, glances, glitchtip, grafana, grafana-with-postgresql, grocy, heimdall, homepage, jellyfin, kuzzle, listmonk, logto, mediawiki, meilisearch, metabase, metube, minio, moodle, n8n, n8n-with-postgresql, next-image-transformation, nextcloud, nocodb, odoo, openblocks, pairdrop, penpot, phpmyadmin, pocketbase, posthog, reactive-resume, rocketchat, shlink, slash, snapdrop, statusnook, stirling-pdf, supabase, syncthing, tolgee, trigger, trigger-with-external-database, twenty, umami, unleash-with-postgresql, unleash-without-database, uptime-kuma, vaultwarden, vikunja, weblate, whoogle, wordpress-with-mariadb, wordpress-with-mysql, wordpress-without-database] + name: + type: string + maxLength: 255 + description: 'Name of the service.' + description: + type: string + nullable: true + description: 'Description of the service.' + project_uuid: + type: string + description: 'Project UUID.' + environment_name: + type: string + description: 'Environment name.' + server_uuid: + type: string + description: 'Server UUID.' + destination_uuid: + type: string + description: 'Destination UUID. Required if server has multiple destinations.' + instant_deploy: + type: boolean + default: false + description: 'Start the service immediately after creation.' + type: object + responses: + '201': + description: 'Create a service.' + content: + application/json: + schema: + properties: + uuid: { type: string, description: 'Service UUID.' } + domains: { type: array, items: { type: string }, description: 'Service domains.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/services/{uuid}': + get: + tags: + - Services + summary: Get + description: 'Get service by UUID.' + operationId: get-service-by-uuid + parameters: + - + name: uuid + in: path + description: 'Service UUID' + required: true + schema: + type: string + responses: + '200': + description: 'Get a service by Uuid.' + content: + application/json: + schema: + $ref: '#/components/schemas/Service' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + delete: + tags: + - Services + summary: Delete + description: 'Delete service by UUID.' + operationId: delete-service-by-uuid + parameters: + - + name: uuid + in: path + description: 'Service UUID' + required: true + schema: + type: string + responses: + '200': + description: 'Delete a service by Uuid' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Service deletion request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/services/{uuid}/start': + get: + tags: + - Services + summary: Start + description: 'Start service. `Post` request is also accepted.' + operationId: start-service-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the service.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Start service.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Service starting request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/services/{uuid}/stop': + get: + tags: + - Services + summary: Stop + description: 'Stop service. `Post` request is also accepted.' + operationId: stop-service-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the service.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Stop service.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Service stopping request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/services/{uuid}/restart': + get: + tags: + - Services + summary: Restart + description: 'Restart service. `Post` request is also accepted.' + operationId: restart-service-by-uuid + parameters: + - + name: uuid + in: path + description: 'UUID of the service.' + required: true + schema: + type: string + format: uuid + responses: + '200': + description: 'Restart service.' + content: + application/json: + schema: + properties: + message: { type: string, example: 'Service restaring request queued.' } + type: object + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /teams: + get: + tags: + - Teams + summary: List + description: 'Get all teams.' + operationId: list-teams + responses: + '200': + description: 'List of teams.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Team' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + '/teams/{id}': + get: + tags: + - Teams + summary: Get + description: 'Get team by TeamId.' + operationId: get-team-by-id + parameters: + - + name: id + in: path + description: 'Team ID' + required: true + schema: + type: integer + responses: + '200': + description: 'List of teams.' + content: + application/json: + schema: + $ref: '#/components/schemas/Team' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + '/teams/{id}/members': + get: + tags: + - Teams + summary: Members + description: 'Get members by TeamId.' + operationId: get-members-by-team-id + parameters: + - + name: id + in: path + description: 'Team ID' + required: true + schema: + type: integer + responses: + '200': + description: 'List of members.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + '404': + $ref: '#/components/responses/404' + security: + - + bearerAuth: [] + /teams/current: + get: + tags: + - Teams + summary: 'Authenticated Team' + description: 'Get currently authenticated team.' + operationId: get-current-team + responses: + '200': + description: 'Current Team.' + content: + application/json: + schema: + $ref: '#/components/schemas/Team' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] + /teams/current/members: + get: + tags: + - Teams + summary: 'Authenticated Team Members' + description: 'Get currently authenticated team members.' + operationId: get-current-team-members + responses: + '200': + description: 'Currently authenticated team members.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + '401': + $ref: '#/components/responses/401' + '400': + $ref: '#/components/responses/400' + security: + - + bearerAuth: [] +components: + schemas: + Application: + description: 'Application model' + properties: + id: + type: integer + description: 'The application identifier in the database.' + description: + type: string + nullable: true + description: 'The application description.' + repository_project_id: + type: integer + nullable: true + description: 'The repository project identifier.' + uuid: + type: string + description: 'The application UUID.' + name: + type: string + description: 'The application name.' + fqdn: + type: string + nullable: true + description: 'The application domains.' + config_hash: + type: string + description: 'Configuration hash.' + git_repository: + type: string + description: 'Git repository URL.' + git_branch: + type: string + description: 'Git branch.' + git_commit_sha: + type: string + description: 'Git commit SHA.' + git_full_url: + type: string + nullable: true + description: 'Git full URL.' + docker_registry_image_name: + type: string + nullable: true + description: 'Docker registry image name.' + docker_registry_image_tag: + type: string + nullable: true + description: 'Docker registry image tag.' + build_pack: + type: string + description: 'Build pack.' + enum: + - nixpacks + - static + - dockerfile + - dockercompose + static_image: + type: string + description: 'Static image used when static site is deployed.' + install_command: + type: string + description: 'Install command.' + build_command: + type: string + description: 'Build command.' + start_command: + type: string + description: 'Start command.' + ports_exposes: + type: string + description: 'Ports exposes.' + ports_mappings: + type: string + nullable: true + description: 'Ports mappings.' + base_directory: + type: string + description: 'Base directory for all commands.' + publish_directory: + type: string + description: 'Publish directory.' + health_check_enabled: + type: boolean + description: 'Health check enabled.' + health_check_path: + type: string + description: 'Health check path.' + health_check_port: + type: string + nullable: true + description: 'Health check port.' + health_check_host: + type: string + nullable: true + description: 'Health check host.' + health_check_method: + type: string + description: 'Health check method.' + health_check_return_code: + type: integer + description: 'Health check return code.' + health_check_scheme: + type: string + description: 'Health check scheme.' + health_check_response_text: + type: string + nullable: true + description: 'Health check response text.' + health_check_interval: + type: integer + description: 'Health check interval in seconds.' + health_check_timeout: + type: integer + description: 'Health check timeout in seconds.' + health_check_retries: + type: integer + description: 'Health check retries count.' + health_check_start_period: + type: integer + description: 'Health check start period in seconds.' + limits_memory: + type: string + description: 'Memory limit.' + limits_memory_swap: + type: string + description: 'Memory swap limit.' + limits_memory_swappiness: + type: integer + description: 'Memory swappiness.' + limits_memory_reservation: + type: string + description: 'Memory reservation.' + limits_cpus: + type: string + description: 'CPU limit.' + limits_cpuset: + type: string + nullable: true + description: 'CPU set.' + limits_cpu_shares: + type: integer + description: 'CPU shares.' + status: + type: string + description: 'Application status.' + preview_url_template: + type: string + description: 'Preview URL template.' + destination_type: + type: string + description: 'Destination type.' + destination_id: + type: integer + description: 'Destination identifier.' + source_id: + type: integer + nullable: true + description: 'Source identifier.' + private_key_id: + type: integer + nullable: true + description: 'Private key identifier.' + environment_id: + type: integer + description: 'Environment identifier.' + dockerfile: + type: string + nullable: true + description: 'Dockerfile content. Used for dockerfile build pack.' + dockerfile_location: + type: string + description: 'Dockerfile location.' + custom_labels: + type: string + nullable: true + description: 'Custom labels.' + dockerfile_target_build: + type: string + nullable: true + description: 'Dockerfile target build.' + manual_webhook_secret_github: + type: string + nullable: true + description: 'Manual webhook secret for GitHub.' + manual_webhook_secret_gitlab: + type: string + nullable: true + description: 'Manual webhook secret for GitLab.' + manual_webhook_secret_bitbucket: + type: string + nullable: true + description: 'Manual webhook secret for Bitbucket.' + manual_webhook_secret_gitea: + type: string + nullable: true + description: 'Manual webhook secret for Gitea.' + docker_compose_location: + type: string + description: 'Docker compose location.' + docker_compose: + type: string + nullable: true + description: 'Docker compose content. Used for docker compose build pack.' + docker_compose_raw: + type: string + nullable: true + description: 'Docker compose raw content.' + docker_compose_domains: + type: string + nullable: true + description: 'Docker compose domains.' + docker_compose_custom_start_command: + type: string + nullable: true + description: 'Docker compose custom start command.' + docker_compose_custom_build_command: + type: string + nullable: true + description: 'Docker compose custom build command.' + swarm_replicas: + type: integer + nullable: true + description: 'Swarm replicas. Only used for swarm deployments.' + swarm_placement_constraints: + type: string + nullable: true + description: 'Swarm placement constraints. Only used for swarm deployments.' + custom_docker_run_options: + type: string + nullable: true + description: 'Custom docker run options.' + post_deployment_command: + type: string + nullable: true + description: 'Post deployment command.' + post_deployment_command_container: + type: string + nullable: true + description: 'Post deployment command container.' + pre_deployment_command: + type: string + nullable: true + description: 'Pre deployment command.' + pre_deployment_command_container: + type: string + nullable: true + description: 'Pre deployment command container.' + watch_paths: + type: string + nullable: true + description: 'Watch paths.' + custom_healthcheck_found: + type: boolean + description: 'Custom healthcheck found.' + redirect: + type: string + nullable: true + description: 'How to set redirect with Traefik / Caddy. www<->non-www.' + enum: + - www + - non-www + - both + created_at: + type: string + format: date-time + description: 'The date and time when the application was created.' + updated_at: + type: string + format: date-time + description: 'The date and time when the application was last updated.' + deleted_at: + type: string + format: date-time + nullable: true + description: 'The date and time when the application was deleted.' + compose_parsing_version: + type: string + description: 'How Coolify parse the compose file.' + type: object + ApplicationDeploymentQueue: + description: 'Project model' + properties: + id: + type: integer + application_id: + type: string + deployment_uuid: + type: string + pull_request_id: + type: integer + force_rebuild: + type: boolean + commit: + type: string + status: + type: string + is_webhook: + type: boolean + is_api: + type: boolean + created_at: + type: string + updated_at: + type: string + logs: + type: string + current_process_id: + type: string + restart_only: + type: boolean + git_type: + type: string + server_id: + type: integer + application_name: + type: string + server_name: + type: string + deployment_url: + type: string + destination_id: + type: string + only_this_server: + type: boolean + rollback: + type: boolean + commit_message: + type: string + type: object + Environment: + description: 'Environment model' + properties: + id: + type: integer + name: + type: string + project_id: + type: integer + created_at: + type: string + updated_at: + type: string + description: + type: string + type: object + EnvironmentVariable: + description: 'Environment Variable model' + properties: + id: + type: integer + uuid: + type: string + application_id: + type: integer + service_id: + type: integer + database_id: + type: integer + is_build_time: + type: boolean + is_literal: + type: boolean + is_multiline: + type: boolean + is_preview: + type: boolean + is_shared: + type: boolean + is_shown_once: + type: boolean + key: + type: string + value: + type: string + real_value: + type: string + version: + type: string + created_at: + type: string + updated_at: + type: string + type: object + PrivateKey: + description: 'Private Key model' + properties: + id: + type: integer + uuid: + type: string + name: + type: string + description: + type: string + private_key: + type: string + format: private-key + is_git_related: + type: boolean + team_id: + type: integer + created_at: + type: string + updated_at: + type: string + type: object + Project: + description: 'Project model' + properties: + id: + type: integer + uuid: + type: string + name: + type: string + environments: + description: 'The environments of the project.' + type: array + items: + $ref: '#/components/schemas/Environment' + type: object + Server: + description: 'Server model' + properties: + id: + type: integer + uuid: + type: string + name: + type: string + description: + type: string + ip: + type: string + user: + type: string + port: + type: integer + proxy: + type: object + high_disk_usage_notification_sent: + type: boolean + unreachable_notification_sent: + type: boolean + unreachable_count: + type: integer + validation_logs: + type: string + log_drain_notification_sent: + type: boolean + swarm_cluster: + type: string + type: object + ServerSetting: + description: 'Server Settings model' + properties: + id: + type: integer + concurrent_builds: + type: integer + dynamic_timeout: + type: integer + force_disabled: + type: boolean + force_server_cleanup: + type: boolean + is_build_server: + type: boolean + is_cloudflare_tunnel: + type: boolean + is_jump_server: + type: boolean + is_logdrain_axiom_enabled: + type: boolean + is_logdrain_custom_enabled: + type: boolean + is_logdrain_highlight_enabled: + type: boolean + is_logdrain_newrelic_enabled: + type: boolean + is_metrics_enabled: + type: boolean + is_reachable: + type: boolean + is_server_api_enabled: + type: boolean + is_swarm_manager: + type: boolean + is_swarm_worker: + type: boolean + is_usable: + type: boolean + logdrain_axiom_api_key: + type: string + logdrain_axiom_dataset_name: + type: string + logdrain_custom_config: + type: string + logdrain_custom_config_parser: + type: string + logdrain_highlight_project_id: + type: string + logdrain_newrelic_base_uri: + type: string + logdrain_newrelic_license_key: + type: string + metrics_history_days: + type: integer + metrics_refresh_rate_seconds: + type: integer + metrics_token: + type: string + docker_cleanup_frequency: + type: string + docker_cleanup_threshold: + type: integer + server_id: + type: integer + wildcard_domain: + type: string + created_at: + type: string + updated_at: + type: string + type: object + Service: + description: 'Service model' + properties: + id: + type: integer + description: 'The unique identifier of the service. Only used for database identification.' + uuid: + type: string + description: 'The unique identifier of the service.' + name: + type: string + description: 'The name of the service.' + environment_id: + type: integer + description: 'The unique identifier of the environment where the service is attached to.' + server_id: + type: integer + description: 'The unique identifier of the server where the service is running.' + description: + type: string + description: 'The description of the service.' + docker_compose_raw: + type: string + description: 'The raw docker-compose.yml file of the service.' + docker_compose: + type: string + description: 'The docker-compose.yml file that is parsed and modified by Coolify.' + destination_type: + type: string + description: 'Destination type.' + destination_id: + type: integer + description: 'The unique identifier of the destination where the service is running.' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' + is_container_label_escape_enabled: + type: boolean + description: 'The flag to enable the container label escape.' + is_container_label_readonly_enabled: + type: boolean + description: 'The flag to enable the container label readonly.' + config_hash: + type: string + description: 'The hash of the service configuration.' + service_type: + type: string + description: 'The type of the service.' + created_at: + type: string + description: 'The date and time when the service was created.' + updated_at: + type: string + description: 'The date and time when the service was last updated.' + deleted_at: + type: string + description: 'The date and time when the service was deleted.' + type: object + Team: + description: 'Team model' + properties: + id: + type: integer + description: 'The unique identifier of the team.' + name: + type: string + description: 'The name of the team.' + description: + type: string + description: 'The description of the team.' + personal_team: + type: boolean + description: 'Whether the team is personal or not.' + created_at: + type: string + description: 'The date and time the team was created.' + updated_at: + type: string + description: 'The date and time the team was last updated.' + smtp_enabled: + type: boolean + description: 'Whether SMTP is enabled or not.' + smtp_from_address: + type: string + description: 'The email address to send emails from.' + smtp_from_name: + type: string + description: 'The name to send emails from.' + smtp_recipients: + type: string + description: 'The email addresses to send emails to.' + smtp_host: + type: string + description: 'The SMTP host.' + smtp_port: + type: string + description: 'The SMTP port.' + smtp_encryption: + type: string + description: 'The SMTP encryption.' + smtp_username: + type: string + description: 'The SMTP username.' + smtp_password: + type: string + description: 'The SMTP password.' + smtp_timeout: + type: string + description: 'The SMTP timeout.' + smtp_notifications_test: + type: boolean + description: 'Whether to send test notifications via SMTP.' + smtp_notifications_deployments: + type: boolean + description: 'Whether to send deployment notifications via SMTP.' + smtp_notifications_status_changes: + type: boolean + description: 'Whether to send status change notifications via SMTP.' + smtp_notifications_scheduled_tasks: + type: boolean + description: 'Whether to send scheduled task notifications via SMTP.' + smtp_notifications_database_backups: + type: boolean + description: 'Whether to send database backup notifications via SMTP.' + discord_enabled: + type: boolean + description: 'Whether Discord is enabled or not.' + discord_webhook_url: + type: string + description: 'The Discord webhook URL.' + discord_notifications_test: + type: boolean + description: 'Whether to send test notifications via Discord.' + discord_notifications_deployments: + type: boolean + description: 'Whether to send deployment notifications via Discord.' + discord_notifications_status_changes: + type: boolean + description: 'Whether to send status change notifications via Discord.' + discord_notifications_database_backups: + type: boolean + description: 'Whether to send database backup notifications via Discord.' + discord_notifications_scheduled_tasks: + type: boolean + description: 'Whether to send scheduled task notifications via Discord.' + show_boarding: + type: boolean + description: 'Whether to show the boarding screen or not.' + resend_enabled: + type: boolean + description: 'Whether to enable resending or not.' + resend_api_key: + type: string + description: 'The resending API key.' + use_instance_email_settings: + type: boolean + description: 'Whether to use instance email settings or not.' + telegram_enabled: + type: boolean + description: 'Whether Telegram is enabled or not.' + telegram_token: + type: string + description: 'The Telegram token.' + telegram_chat_id: + type: string + description: 'The Telegram chat ID.' + telegram_notifications_test: + type: boolean + description: 'Whether to send test notifications via Telegram.' + telegram_notifications_deployments: + type: boolean + description: 'Whether to send deployment notifications via Telegram.' + telegram_notifications_status_changes: + type: boolean + description: 'Whether to send status change notifications via Telegram.' + telegram_notifications_database_backups: + type: boolean + description: 'Whether to send database backup notifications via Telegram.' + telegram_notifications_test_message_thread_id: + type: string + description: 'The Telegram test message thread ID.' + telegram_notifications_deployments_message_thread_id: + type: string + description: 'The Telegram deployment message thread ID.' + telegram_notifications_status_changes_message_thread_id: + type: string + description: 'The Telegram status change message thread ID.' + telegram_notifications_database_backups_message_thread_id: + type: string + description: 'The Telegram database backup message thread ID.' + custom_server_limit: + type: string + description: 'The custom server limit.' + telegram_notifications_scheduled_tasks: + type: boolean + description: 'Whether to send scheduled task notifications via Telegram.' + telegram_notifications_scheduled_tasks_thread_id: + type: string + description: 'The Telegram scheduled task message thread ID.' + members: + description: 'The members of the team.' + type: array + items: + $ref: '#/components/schemas/User' + type: object + User: + description: 'User model' + properties: + id: + type: integer + description: 'The user identifier in the database.' + name: + type: string + description: 'The user name.' + email: + type: string + description: 'The user email.' + email_verified_at: + type: string + description: 'The date when the user email was verified.' + created_at: + type: string + description: 'The date when the user was created.' + updated_at: + type: string + description: 'The date when the user was updated.' + two_factor_confirmed_at: + type: string + description: 'The date when the user two factor was confirmed.' + force_password_reset: + type: boolean + description: 'The flag to force the user to reset the password.' + marketing_emails: + type: boolean + description: 'The flag to receive marketing emails.' + type: object + responses: + '400': + description: 'Invalid token.' + content: + application/json: + schema: + properties: + message: + type: string + example: 'Invalid token.' + type: object + '401': + description: Unauthenticated. + content: + application/json: + schema: + properties: + message: + type: string + example: Unauthenticated. + type: object + '404': + description: 'Resource not found.' + content: + application/json: + schema: + properties: + message: + type: string + example: 'Resource not found.' + type: object + securitySchemes: + bearerAuth: + type: http + description: 'Go to `Keys & Tokens` / `API tokens` and create a new token. Use the token as the bearer token.' + scheme: bearer +tags: + - + name: Applications + description: Applications + - + name: Databases + description: Databases + - + name: Deployments + description: Deployments + - + name: Projects + description: Projects + - + name: Resources + description: Resources + - + name: 'Private Keys' + description: 'Private Keys' + - + name: Servers + description: Servers + - + name: Services + description: Services + - + name: Teams + description: Teams diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a55abf5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8030 @@ +{ + "name": "coolify-new-docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "coolify-new-docs", + "version": "0.0.1", + "dependencies": { + "@astrojs/sitemap": "^3.1.6", + "@astrojs/starlight": "^0.26.1", + "@astrojs/starlight-tailwind": "^2.0.3", + "astro": "^4.10.2", + "sharp": "^0.32.5", + "starlight-image-zoom": "^0.8.0", + "starlight-links-validator": "^0.11.0", + "starlight-openapi": "^0.7.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, + "node_modules/@astrojs/compiler": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", + "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.2.0.tgz", + "integrity": "sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==", + "dependencies": { + "@astrojs/prism": "3.1.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.1", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "remark-smartypants": "^3.0.2", + "shiki": "^1.10.3", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.2" + } + }, + "node_modules/@astrojs/mdx": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.5.tgz", + "integrity": "sha512-Fu6oShqcDpi0D1b2/3Pg3ao1I+Q2YqKhFsSsuDzn0YhdGrry5oUyABUyCyGq/OayP2P/34Vwj+GCQ/n9h8FlTQ==", + "dependencies": { + "@astrojs/markdown-remark": "5.2.0", + "@mdx-js/mdx": "^3.0.1", + "acorn": "^8.12.1", + "es-module-lexer": "^1.5.4", + "estree-util-visit": "^2.0.0", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^9.0.2", + "kleur": "^4.1.5", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.0", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "astro": "^4.8.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", + "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.6.tgz", + "integrity": "sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==", + "dependencies": { + "sitemap": "^7.1.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.23.8" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.26.1.tgz", + "integrity": "sha512-0qNYWZJ+ZOdSfM7du6fGuwUhyTHtAeRIl0zYe+dF0TxDvcakplO1SYLbGGX6lEVYE3PdBne7dcJww85bXZJIIQ==", + "dependencies": { + "@astrojs/mdx": "^3.1.3", + "@astrojs/sitemap": "^3.1.6", + "@pagefind/default-ui": "^1.0.3", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.35.6", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.0.3", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^4.8.6" + } + }, + "node_modules/@astrojs/starlight-tailwind": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@astrojs/starlight-tailwind/-/starlight-tailwind-2.0.3.tgz", + "integrity": "sha512-ZwbdXS/9rxYlo3tKZoTZoBPUnaaqek02b341dHwOkmMT0lIR2w+8k0mRUGxnRaYtPdMcaL+nYFd8RUa8sjdyRg==", + "peerDependencies": { + "@astrojs/starlight": ">=0.9.0", + "@astrojs/tailwind": "^5.0.0", + "tailwindcss": "^3.3.3" + } + }, + "node_modules/@astrojs/tailwind": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.0.tgz", + "integrity": "sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==", + "peer": true, + "dependencies": { + "autoprefixer": "^10.4.15", + "postcss": "^8.4.28", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0", + "tailwindcss": "^3.0.24" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "dependencies": { + "ci-info": "^4.0.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", + "engines": { + "node": ">=14" + } + }, + "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==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.35.6.tgz", + "integrity": "sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.35.6.tgz", + "integrity": "sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==", + "dependencies": { + "@expressive-code/core": "^0.35.6" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.35.6.tgz", + "integrity": "sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==", + "dependencies": { + "@expressive-code/core": "^0.35.6", + "shiki": "^1.1.7" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.35.6.tgz", + "integrity": "sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==", + "dependencies": { + "@expressive-code/core": "^0.35.6" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "peer": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "peer": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "peer": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "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==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oslojs/encoding": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-0.4.1.tgz", + "integrity": "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.1.0.tgz", + "integrity": "sha512-SLsXNLtSilGZjvqis8sX42fBWsWAVkcDh1oerxwqbac84HbiwxpxOC2jm8hRwcR0Z55HPZPWO77XeRix/8GwTg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.1.0.tgz", + "integrity": "sha512-QjQSE/L5oS1C8N8GdljGaWtjCBMgMtfrPAoiCmINTu9Y9dp0ggAyXvF8K7Qg3VyIMYJ6v8vg2PN7Z3b+AaAqUA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.1.0.tgz", + "integrity": "sha512-+XiAJAK++C64nQcD7s3Prdmd5S92lT05fwjOxm0L1jj80jbL+tmvcqkkFnPpoqhnicIPgcAX/Y5W0HRZnBt35w==" + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.1.0.tgz", + "integrity": "sha512-8zjYCa2BtNEL7KnXtysPtBELCyv5DSQ4yHeK/nsEq6w4ToAMTBl0K06khqxdSGgjMSwwrxvLzq3so0LC5Q14dA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.1.0.tgz", + "integrity": "sha512-4lsg6VB7A6PWTwaP8oSmXV4O9H0IHX7AlwTDcfyT+YJo/sPXOVjqycD5cdBgqNLfUk8B9bkWcTDCRmJbHrKeCw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.1.0.tgz", + "integrity": "sha512-OboCM76BcMKT9IoSfZuFhiqMRgTde8x4qDDvKulFmycgiJrlL5WnIqBHJLQxZq+o2KyZpoHF97iwsGAm8c32sQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@readme/better-ajv-errors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz", + "integrity": "sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/runtime": "^7.21.0", + "@humanwhocodes/momoa": "^2.0.3", + "chalk": "^4.1.2", + "json-to-ast": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@readme/better-ajv-errors/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@readme/better-ajv-errors/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@readme/better-ajv-errors/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==" + }, + "node_modules/@readme/better-ajv-errors/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@readme/json-schema-ref-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@readme/json-schema-ref-parser/-/json-schema-ref-parser-1.2.0.tgz", + "integrity": "sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@readme/openapi-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.5.0.tgz", + "integrity": "sha512-IbymbOqRuUzoIgxfAAR7XJt2FWl6n2yqN09fF5adacGm7W03siA3bj1Emql0X9D2T+RpBYz3x9zDsMhuoMP62A==", + "dependencies": { + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "@readme/better-ajv-errors": "^1.6.0", + "@readme/json-schema-ref-parser": "^1.2.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/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==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.16.1.tgz", + "integrity": "sha512-aI0hBtw+a6KsJp2jcD4YuQqKpeCbURMZbhHVozDknJpm+KJqeMRkEnfBC8BaKE/5XC+uofPgCLsa/TkTk0Ba0w==", + "dependencies": { + "@shikijs/vscode-textmate": "^9.2.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.0.tgz", + "integrity": "sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==" + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "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==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "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==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", + "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/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==" + }, + "node_modules/ansi-align/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.15.1.tgz", + "integrity": "sha512-XvKZ2GaDbCsMfcJess4o+4D4cCKja45GJ/9o6EJ6n96xaen8HZMRoJn3YKL9TOjIrL2NuU4mBFMG2JivPJ0foA==", + "dependencies": { + "@astrojs/compiler": "^2.10.3", + "@astrojs/internal-helpers": "0.4.1", + "@astrojs/markdown-remark": "5.2.0", + "@astrojs/telemetry": "3.1.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/types": "^7.25.4", + "@oslojs/encoding": "^0.4.1", + "@rollup/pluginutils": "^5.1.0", + "@types/babel__core": "^7.20.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.12.1", + "aria-query": "^5.3.0", + "axobject-query": "^4.1.0", + "boxen": "7.1.1", + "ci-info": "^4.0.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.6.0", + "cssesc": "^3.0.0", + "debug": "^4.3.6", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.0.0", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "es-module-lexer": "^1.5.4", + "esbuild": "^0.21.5", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "fastq": "^1.17.1", + "flattie": "^1.1.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.11", + "magicast": "^0.3.5", + "micromatch": "^4.0.8", + "mrmime": "^2.0.0", + "neotraverse": "^0.6.18", + "ora": "^8.1.0", + "p-limit": "^6.1.0", + "p-queue": "^8.0.1", + "path-to-regexp": "^6.2.2", + "preferred-pm": "^4.0.0", + "prompts": "^2.4.2", + "rehype": "^13.0.1", + "semver": "^7.6.3", + "shiki": "^1.14.1", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "tinyexec": "^0.3.0", + "tsconfck": "^3.1.1", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "vite": "^5.4.2", + "vitefu": "^0.2.5", + "which-pm": "^3.0.0", + "xxhash-wasm": "^1.0.2", + "yargs-parser": "^21.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.2", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.35.6.tgz", + "integrity": "sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==", + "dependencies": { + "rehype-expressive-code": "^0.35.6" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "peer": true + }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.3.tgz", + "integrity": "sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.2.tgz", + "integrity": "sha512-HZoJwzC+rZ9lqEemTMiO0luOePoGYNBgsLLgegKR/cljiJvcDNhDZQkzC+NC5Oh0aHbdBNSOHpghwMuB5tqhjg==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.2.0.tgz", + "integrity": "sha512-+o9MG5bPRRBlkVSpfFlMag3n7wMaIZb4YZasU2+/96f+3HTQ4F9DKQeu3K/Sjz1W0umu6xvVq1ON0ipWdMlr3A==", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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==" + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "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==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/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==" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-selector-parser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.5.tgz", + "integrity": "sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", + "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "peer": true + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dset": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + }, + "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==", + "hasInstallScript": true, + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expressive-code": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.35.6.tgz", + "integrity": "sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==", + "dependencies": { + "@expressive-code/core": "^0.35.6", + "@expressive-code/plugin-frames": "^0.35.6", + "@expressive-code/plugin-shiki": "^0.35.6", + "@expressive-code/plugin-text-markers": "^0.35.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "peer": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.2.tgz", + "integrity": "sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz", + "integrity": "sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", + "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.2.tgz", + "integrity": "sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "not": "^0.1.0", + "nth-check": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.2.tgz", + "integrity": "sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.7.tgz", + "integrity": "sha512-uSjr59G5u6fbxUfKbb8GcqMGT3Xs9v5IbPkjb0S16GyOeBLAzSRK0CixBv5YrYvzO6TDLzIS6QCn78tkqWngPw==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", + "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz", + "integrity": "sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "peer": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "peer": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "dependencies": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "peer": true + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.1.tgz", + "integrity": "sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/not": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", + "integrity": "sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==" + }, + "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==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, + "node_modules/ora": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", + "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/p-limit": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", + "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "peer": true + }, + "node_modules/pagefind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.1.0.tgz", + "integrity": "sha512-1nmj0/vfYcMxNEQj0YDRp6bTVv9hI7HLdPhK/vBBYlrnwjATndQvHyicj5Y7pUHrpCFZpFnLVQXIF829tpFmaw==", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.1.0", + "@pagefind/darwin-x64": "1.1.0", + "@pagefind/linux-arm64": "1.1.0", + "@pagefind/linux-x64": "1.1.0", + "@pagefind/windows-x64": "1.1.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "peer": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "peer": true + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "peer": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "peer": true + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/preferred-pm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", + "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", + "dependencies": { + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.0" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "peer": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/rehype": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", + "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.35.6.tgz", + "integrity": "sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==", + "dependencies": { + "expressive-code": "^0.35.6" + } + }, + "node_modules/rehype-format": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.0.tgz", + "integrity": "sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "rehype-minify-whitespace": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-minify-whitespace": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz", + "integrity": "sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.1.1.tgz", + "integrity": "sha512-onsHf34i/GzgElJgtT1K2V+31yEhWs7NJboKNxXJcmVMMPxLpgxZ9iADoMdydd6j/bHic5F/aNq0CGqElEtu2g==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "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.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.16.1.tgz", + "integrity": "sha512-tCJIMaxDVB1mEIJ5TvfZU7kCPB5eo9fli5+21Olc/bmyv+w8kye3JOp+LZRmGkAyT71hrkefQhTiY+o9mBikRQ==", + "dependencies": { + "@shikijs/core": "1.16.1", + "@shikijs/vscode-textmate": "^9.2.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/starlight-image-zoom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/starlight-image-zoom/-/starlight-image-zoom-0.8.0.tgz", + "integrity": "sha512-+YDqCyihQescGs9hJoyTQt+KHEq9s6zIv8ksBMjPjwOrVicXtY0pM4hHj8yO1r2znud4gTytyGt25kAOmRyP9A==", + "dependencies": { + "rehype-raw": "7.0.0", + "unist-util-visit": "5.0.0", + "unist-util-visit-parents": "6.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.22.0" + } + }, + "node_modules/starlight-links-validator": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/starlight-links-validator/-/starlight-links-validator-0.11.0.tgz", + "integrity": "sha512-7mKiP0xAS8ItKy8QAIkmeNYbzI4w0WD0pOYoTPa1xMNbz+qYr/QWT+a40QO/Z2XYJLzzQn47yomupUfI89wheg==", + "dependencies": { + "github-slugger": "2.0.0", + "hast-util-from-html": "2.0.1", + "hast-util-has-property": "3.0.0", + "is-absolute-url": "4.0.1", + "kleur": "4.1.5", + "mdast-util-to-string": "4.0.0", + "picomatch": "4.0.2", + "unist-util-visit": "5.0.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.15.0", + "astro": ">=4.0.0" + } + }, + "node_modules/starlight-links-validator/node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/starlight-links-validator/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/starlight-openapi": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/starlight-openapi/-/starlight-openapi-0.7.0.tgz", + "integrity": "sha512-+aqVVqmoFZTb3ibXM6mfl3nmKY/bCZOn5+FTRzOGulEOtG4R8Y8NGwj9HN+6vxLZSPlAPfKwb3ipcAdDbVBuCg==", + "dependencies": { + "@readme/openapi-parser": "2.5.0", + "github-slugger": "2.0.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@astrojs/markdown-remark": ">=4.2.0", + "@astrojs/starlight": ">=0.26.0", + "astro": ">=4.8.6" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" + }, + "node_modules/streamx": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.0.tgz", + "integrity": "sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": 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-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "peer": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "peer": true + }, + "node_modules/tsconfck": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", + "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "optional": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.41", + "rollup": "^4.20.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": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", + "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", + "dependencies": { + "load-yaml-file": "^0.2.0" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": 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-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "peer": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", + "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", + "peerDependencies": { + "zod": "^3.23.3" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..96acda8 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "coolify-new-docs", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/sitemap": "^3.1.6", + "@astrojs/starlight": "^0.26.1", + "@astrojs/starlight-tailwind": "^2.0.3", + "astro": "^4.10.2", + "sharp": "^0.32.5", + "starlight-image-zoom": "^0.8.0", + "starlight-links-validator": "^0.11.0", + "starlight-openapi": "^0.7.0" + } +} diff --git a/public/coolify.png b/public/coolify.png new file mode 100644 index 0000000..8c9f071 Binary files /dev/null and b/public/coolify.png differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..b0e1315 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://coolify.io/docs/sitemap-index.xml \ No newline at end of file diff --git a/src/assets/images/aws-s3/1-bucket.jpeg b/src/assets/images/aws-s3/1-bucket.jpeg new file mode 100644 index 0000000..c8178b1 Binary files /dev/null and b/src/assets/images/aws-s3/1-bucket.jpeg differ diff --git a/src/assets/images/aws-s3/1-coolify.jpeg b/src/assets/images/aws-s3/1-coolify.jpeg new file mode 100644 index 0000000..222964b Binary files /dev/null and b/src/assets/images/aws-s3/1-coolify.jpeg differ diff --git a/src/assets/images/aws-s3/1-iam.jpeg b/src/assets/images/aws-s3/1-iam.jpeg new file mode 100644 index 0000000..e9af7c7 Binary files /dev/null and b/src/assets/images/aws-s3/1-iam.jpeg differ diff --git a/src/assets/images/aws-s3/1-policy.jpeg b/src/assets/images/aws-s3/1-policy.jpeg new file mode 100644 index 0000000..8f1e717 Binary files /dev/null and b/src/assets/images/aws-s3/1-policy.jpeg differ diff --git a/src/assets/images/aws-s3/2-bucket.jpeg b/src/assets/images/aws-s3/2-bucket.jpeg new file mode 100644 index 0000000..3e6f4f0 Binary files /dev/null and b/src/assets/images/aws-s3/2-bucket.jpeg differ diff --git a/src/assets/images/aws-s3/2-coolify.jpeg b/src/assets/images/aws-s3/2-coolify.jpeg new file mode 100644 index 0000000..5ecda9f Binary files /dev/null and b/src/assets/images/aws-s3/2-coolify.jpeg differ diff --git a/src/assets/images/aws-s3/2-iam.jpeg b/src/assets/images/aws-s3/2-iam.jpeg new file mode 100644 index 0000000..0fd9edf Binary files /dev/null and b/src/assets/images/aws-s3/2-iam.jpeg differ diff --git a/src/assets/images/aws-s3/2-policy.jpeg b/src/assets/images/aws-s3/2-policy.jpeg new file mode 100644 index 0000000..ed26aec Binary files /dev/null and b/src/assets/images/aws-s3/2-policy.jpeg differ diff --git a/src/assets/images/aws-s3/3-iam.jpeg b/src/assets/images/aws-s3/3-iam.jpeg new file mode 100644 index 0000000..ea5b483 Binary files /dev/null and b/src/assets/images/aws-s3/3-iam.jpeg differ diff --git a/src/assets/images/aws-s3/3-policy.jpeg b/src/assets/images/aws-s3/3-policy.jpeg new file mode 100644 index 0000000..0763319 Binary files /dev/null and b/src/assets/images/aws-s3/3-policy.jpeg differ diff --git a/src/assets/images/aws-s3/4-iam.jpeg b/src/assets/images/aws-s3/4-iam.jpeg new file mode 100644 index 0000000..4af249c Binary files /dev/null and b/src/assets/images/aws-s3/4-iam.jpeg differ diff --git a/src/assets/images/aws-s3/5-iam.jpeg b/src/assets/images/aws-s3/5-iam.jpeg new file mode 100644 index 0000000..a5c3506 Binary files /dev/null and b/src/assets/images/aws-s3/5-iam.jpeg differ diff --git a/src/assets/images/aws-s3/6-iam.jpeg b/src/assets/images/aws-s3/6-iam.jpeg new file mode 100644 index 0000000..8bc42ca Binary files /dev/null and b/src/assets/images/aws-s3/6-iam.jpeg differ diff --git a/src/assets/images/aws-s3/7-iam.jpeg b/src/assets/images/aws-s3/7-iam.jpeg new file mode 100644 index 0000000..47ccdcc Binary files /dev/null and b/src/assets/images/aws-s3/7-iam.jpeg differ diff --git a/src/assets/images/cloudflare/cf-one-public-hostname.png b/src/assets/images/cloudflare/cf-one-public-hostname.png new file mode 100644 index 0000000..9ef374c Binary files /dev/null and b/src/assets/images/cloudflare/cf-one-public-hostname.png differ diff --git a/src/assets/images/cloudflare/cf-ssl-full.png b/src/assets/images/cloudflare/cf-ssl-full.png new file mode 100644 index 0000000..fc44d80 Binary files /dev/null and b/src/assets/images/cloudflare/cf-ssl-full.png differ diff --git a/src/assets/images/cloudflare/cf-tunnel-id.png b/src/assets/images/cloudflare/cf-tunnel-id.png new file mode 100644 index 0000000..efbe77a Binary files /dev/null and b/src/assets/images/cloudflare/cf-tunnel-id.png differ diff --git a/src/assets/images/cloudflare/cf-tunnels-connector.png b/src/assets/images/cloudflare/cf-tunnels-connector.png new file mode 100644 index 0000000..b5892bd Binary files /dev/null and b/src/assets/images/cloudflare/cf-tunnels-connector.png differ diff --git a/src/assets/images/cloudflare/cf-tunnels-notice-me.png b/src/assets/images/cloudflare/cf-tunnels-notice-me.png new file mode 100644 index 0000000..5aeea6d Binary files /dev/null and b/src/assets/images/cloudflare/cf-tunnels-notice-me.png differ diff --git a/src/assets/images/cloudflare/cf-tunnels-ssh.png b/src/assets/images/cloudflare/cf-tunnels-ssh.png new file mode 100644 index 0000000..7b5b1ba Binary files /dev/null and b/src/assets/images/cloudflare/cf-tunnels-ssh.png differ diff --git a/src/assets/images/cloudflare/cf-tunnels-token.png b/src/assets/images/cloudflare/cf-tunnels-token.png new file mode 100644 index 0000000..ff570dd Binary files /dev/null and b/src/assets/images/cloudflare/cf-tunnels-token.png differ diff --git a/src/assets/images/cloudflare/cf-wildcard-public-hostname.png b/src/assets/images/cloudflare/cf-wildcard-public-hostname.png new file mode 100644 index 0000000..2cb2af6 Binary files /dev/null and b/src/assets/images/cloudflare/cf-wildcard-public-hostname.png differ diff --git a/src/assets/images/cloudflare/coolify-add-server.png b/src/assets/images/cloudflare/coolify-add-server.png new file mode 100644 index 0000000..5a8b0aa Binary files /dev/null and b/src/assets/images/cloudflare/coolify-add-server.png differ diff --git a/src/assets/images/cloudflare/coolify-set-cf-token.png b/src/assets/images/cloudflare/coolify-set-cf-token.png new file mode 100644 index 0000000..e0158df Binary files /dev/null and b/src/assets/images/cloudflare/coolify-set-cf-token.png differ diff --git a/src/assets/images/cloudflare/coolify-set-domains.png b/src/assets/images/cloudflare/coolify-set-domains.png new file mode 100644 index 0000000..f74a651 Binary files /dev/null and b/src/assets/images/cloudflare/coolify-set-domains.png differ diff --git a/src/assets/images/cloudflare/coolify-set-port-mappings.png b/src/assets/images/cloudflare/coolify-set-port-mappings.png new file mode 100644 index 0000000..76bbc42 Binary files /dev/null and b/src/assets/images/cloudflare/coolify-set-port-mappings.png differ diff --git a/src/assets/images/database-logos/clickhouse.png b/src/assets/images/database-logos/clickhouse.png new file mode 100644 index 0000000..53e3fb7 Binary files /dev/null and b/src/assets/images/database-logos/clickhouse.png differ diff --git a/src/assets/images/database-logos/dragonfly-dark.svg b/src/assets/images/database-logos/dragonfly-dark.svg new file mode 100644 index 0000000..dd0f8d6 --- /dev/null +++ b/src/assets/images/database-logos/dragonfly-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/database-logos/dragonfly-light.svg b/src/assets/images/database-logos/dragonfly-light.svg new file mode 100644 index 0000000..6ede4c1 --- /dev/null +++ b/src/assets/images/database-logos/dragonfly-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/database-logos/keydb.png b/src/assets/images/database-logos/keydb.png new file mode 100644 index 0000000..f0399d6 Binary files /dev/null and b/src/assets/images/database-logos/keydb.png differ diff --git a/src/assets/images/database-logos/mariadb.svg b/src/assets/images/database-logos/mariadb.svg new file mode 100644 index 0000000..ddbe283 --- /dev/null +++ b/src/assets/images/database-logos/mariadb.svg @@ -0,0 +1,15 @@ + + + + + + MDB-VLogo_RGB + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/database-logos/mongodb.png b/src/assets/images/database-logos/mongodb.png new file mode 100644 index 0000000..4e5019d Binary files /dev/null and b/src/assets/images/database-logos/mongodb.png differ diff --git a/src/assets/images/database-logos/mysql.png b/src/assets/images/database-logos/mysql.png new file mode 100644 index 0000000..73b55bd Binary files /dev/null and b/src/assets/images/database-logos/mysql.png differ diff --git a/src/assets/images/database-logos/postgresql.png b/src/assets/images/database-logos/postgresql.png new file mode 100644 index 0000000..b38b473 Binary files /dev/null and b/src/assets/images/database-logos/postgresql.png differ diff --git a/src/assets/images/database-logos/redis.svg b/src/assets/images/database-logos/redis.svg new file mode 100644 index 0000000..a8de68d --- /dev/null +++ b/src/assets/images/database-logos/redis.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/screenshots/Docker-compose-environment-variables-UI.png b/src/assets/images/screenshots/Docker-compose-environment-variables-UI.png new file mode 100644 index 0000000..5ee5764 Binary files /dev/null and b/src/assets/images/screenshots/Docker-compose-environment-variables-UI.png differ diff --git a/src/assets/images/screenshots/How-to-add-a-database.png b/src/assets/images/screenshots/How-to-add-a-database.png new file mode 100644 index 0000000..6576300 Binary files /dev/null and b/src/assets/images/screenshots/How-to-add-a-database.png differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.jpeg new file mode 100644 index 0000000..520a981 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.jpeg new file mode 100644 index 0000000..2e392d9 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.jpeg new file mode 100644 index 0000000..cd2cd25 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.jpeg new file mode 100644 index 0000000..af58d9e Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.jpeg new file mode 100644 index 0000000..e28f8b6 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.jpeg new file mode 100644 index 0000000..690d1c5 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.jpeg new file mode 100644 index 0000000..1eeb417 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.jpeg new file mode 100644 index 0000000..55cf018 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.jpeg new file mode 100644 index 0000000..06b8d09 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.jpeg new file mode 100644 index 0000000..fa42bbb Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.jpeg new file mode 100644 index 0000000..4cb9d2f Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.jpeg new file mode 100644 index 0000000..c29a821 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.jpeg new file mode 100644 index 0000000..2e87654 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.jpeg new file mode 100644 index 0000000..43fbb3c Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.jpeg new file mode 100644 index 0000000..3717878 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.jpeg new file mode 100644 index 0000000..ae88952 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.jpeg new file mode 100644 index 0000000..2fa08a3 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.jpeg differ diff --git a/src/assets/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.jpeg b/src/assets/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.jpeg new file mode 100644 index 0000000..4e2a780 Binary files /dev/null and b/src/assets/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.jpeg differ diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..45f60b0 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,6 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), +}; diff --git a/src/content/docs/api-reference/authorization.mdx b/src/content/docs/api-reference/authorization.mdx new file mode 100644 index 0000000..5bf4d02 --- /dev/null +++ b/src/content/docs/api-reference/authorization.mdx @@ -0,0 +1,52 @@ +--- +title: Authorization +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to authorize API requests in Coolify" +description: "Learn how to authorize your API requests." +--- + +import { Aside } from '@astrojs/starlight/components'; + +API request requires a `Bearer` token in `Authorization` header, which could be generated from the UI. + +## Generate + +1. Go to `Keys & Tokens` / `API tokens`. +2. Define a name for your token and click `Create New Token`. + + + +## Scope + +The token will only be able to access resources that are owned by the team that the token is scoped to. + +```php +# Sample token +3|WaobqX9tJQshKPuQFHsyApxuOOggg4wOfvGc9xa233c376d7 +``` + +## Permissions + +Currently there are three types of permissions: + +- read-only `(default)` +- view:sensitive +- `*` (all permissions) + +### `read-only` + +With this permission, you can only read data from the API, but you can't create, update, or delete any resources. Also you can't see sensitive data. + +### `view:sensitive` + +Without this permission, passwords, api keys, and other sensitive data will be redacted from the API response. + +### `*` + +Full access to all resources and sensitive data. diff --git a/src/content/docs/contact.mdx b/src/content/docs/contact.mdx new file mode 100644 index 0000000..cedf171 --- /dev/null +++ b/src/content/docs/contact.mdx @@ -0,0 +1,17 @@ +--- +title: Contact +head: + - tag: "meta" + attrs: + property: "og:title" + content: Contact us +description: "Ways to contact us." +--- + +The preferred way to contact us by email at hi@coollabs.io. + +But you can reach us over: + +- Twitter/X: [@heyandras](https://twitter.com/heyandras) or [@coolifyio](https://twitter.com/coolifyio) +- Mastodon: [@andrasbacsai](https://fosstodon.org/@andrasbacsai) +- Discord: [Invitation](https://coollabs.io/discord) diff --git a/src/content/docs/downgrade.mdx b/src/content/docs/downgrade.mdx new file mode 100644 index 0000000..3823f17 --- /dev/null +++ b/src/content/docs/downgrade.mdx @@ -0,0 +1,35 @@ +--- +title: Downgrade - Self-hosted +head: + - tag: "meta" + attrs: + property: "og:title" + content: How to downgrade the self-hosted version of Coolify +description: "A guide on how to downgrade the self-hosted version of Coolify." +sidebar: + order: 8 +--- + +import { Steps, Aside } from '@astrojs/starlight/components'; + +If you have any issues with the latest version, you can simple downgrade to the previous version. Here is how you can do it: + + + 1. Disable Auto Update + Login as the `root` user (or any user that is in the `root` (initial) team), + go to your `Settings` menu and disable the `Auto Update` feature. + + 2. Login to your server via SSH + Login to your server via SSH and execute the following command: + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.0.0-beta.277 + ``` + + Where `4.0.0-beta.277` is the version you want to downgrade to. + + + + diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx new file mode 100644 index 0000000..8d21a6d --- /dev/null +++ b/src/content/docs/index.mdx @@ -0,0 +1,81 @@ +--- +title: Introduction +head: + - tag: "meta" + attrs: + property: "og:title" + content: What is exactly Coolify and what are the core features? +description: "What is Coolify?" +sidebar: + order: 1 +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +Coolify is an all-in one PaaS that helps you to self-host your own applications, databases or services (like Wordpress, Plausible Analytics, Ghost) without managing your servers, also known as an **open-source & self-hostable Heroku / Netlify / Vercel alternative**. + +## Features + + + Coolify is compatible with a wide range of programming languages and + frameworks, enabling you to launch static websites, APIs, backends, + databases, services, and other types of applications. + + + You can deploy your resources to any server, including your own servers, + VPS, Raspberry Pi, EC2, DigitalOcean, Linode, Hetzner + (referral link), + and more. All you need is an SSH connection. + + + You can deploy your resources to a single server, multiple servers, or + Docker Swarm clusters according to your requirements. +
+
+ (Support for Kubernetes is on the way!) +
+ + Nowadays, Git integration is considered the norm. We provide integration + with both hosted and self-hosted platforms like GitHub, GitLab, Bitbucket, + Gitea, and others. + + + Coolify takes care of automatically setting up and renewing Let's Encrypt + SSL certificates for your custom domains, so you can relax and not have to + deal with it. + + + Your data is automatically backed up to any S3 compatible solution, allowing + you to easily restore it with just a few clicks if any problems occur. + + + Integrate into your CI/CD pipelines or create custom integrations using + GitHub Actions, Gitlab CI, Bitbucket Pipelines, or any other CI/CD tool of + your choice. + + + Coolify offers a robust API that enables you to automate deployments, manage + resources, and integrate with your current tools, providing limitless + possibilities. + + + Share your projects with your team members and work together on them. You + can also control permissions and roles for each member. + + + Automagically deploy new commits and pull requests separately to quickly + review contributions and speed up your teamwork! + + + Once your server is connected, Coolify will handle numerous tasks + automatically, allowing you to concentrate on your code. + + + Coolify will keep an eye on your deployments, servers, disk usage, and other + aspects, and notify you if any issues arise. + + + Coolify will notify you through your chosen channels like Discord, Telegram, + and email in case of any events on your server or with your deployments. + +
diff --git a/src/content/docs/installation.mdx b/src/content/docs/installation.mdx new file mode 100644 index 0000000..d442d35 --- /dev/null +++ b/src/content/docs/installation.mdx @@ -0,0 +1,234 @@ +--- +title: Installation - Self-hosted +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to install self-hosted version of Coolify" +description: "A guide to install self-hosted version of Coolify on your server." +sidebar: + order: 5 +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +To get started, you need a server, it can be a VPS, a Raspberry Pi, or any other server that you have SSH access to. + + + + + + + +## Requirements +### Supported Operating Systems + +- Debian based Linux distributions (Debian, Ubuntu, etc.) +- Redhat based Linux distributions (CentOS, Fedora, Redhat, AlmaLinux, Rocky etc.) +- SUSE based Linux distributions (SLES, SUSE, openSUSE, etc.) +- Arch Linux +- Raspberry Pi OS (Raspbian) + +### Supported Architectures + +- AMD64 +- ARM64 + +### Minimum Required Server + +#### For Coolify + +- 2 CPUs +- 2 GBs memory +- 30+ GB of storage for the images. + +#### For Your Resources + +Choosing your server resources depends on your usage. If you are planning to run a lot of things, you should consider buying a server with more resources. + +Hosting `Supabase`, `Appwrite` or `Posthog` requires more resources than hosting a static site (waay more). + + + +## Installation + +### Automated + +This works with Docker Engine **(not Docker Desktop, for that, go [here](#docker-desktop))** on any supported Linux distribution. + + +1. SSH Enabled + Make sure SSH is enabled and you can connect to your server with SSH from your local machine with root user: [more details here](/docs/knowledge-base/server/openssh). + + + +2. Curl Installed + Make sure `curl` command is available on your server. + +3. Install + Execute the following command on your server with `root` user. + + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash + ``` + > You can find the source code of this script [here](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh). + +4. Open Coolify's UI + Now you can access Coolify on port `http://:8000` of your server. + + +**What it does?** +The script will do the following on your operating system. + +- Install basic commands: `curl wget git jq` +- `Docker Engine` (24+). +- Configures proper logging for `Docker Engine`. +- Creates directory structure at `/data/coolify` for all the configuration files. +- Creates an SSH key for Coolify to be able to manage this server from itself at `/data/coolify/ssh/keys/id.root@host.docker.internal`. +- Install and start dockerized `Coolify`. + +### Manually + + +1. SSH Enabled + Make sure SSH is enabled and you can connect to your server with SSH from your local machine with root user: [more details here](/docs/knowledge-base/server/openssh). + +2. Curl Installed + Make sure `curl` command is available on your server. + +3. Install Docker Engine (24+) + Follow the official documentation to install Docker Engine on your server: [Docker Engine Installation](https://docs.docker.com/engine/install/#server). + +4. Create Directories + Create the base configuration directories under `/data/coolify`. + + ```bash + mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance} + mkdir -p /data/coolify/ssh/{keys,mux} + mkdir -p /data/coolify/proxy/dynamic + ``` + +5. Generate SSH Key + Generate an SSH key for Coolify to be able to manage this server from itself. + + ```bash + + ssh-keygen -f /data/coolify/ssh/keys/id.root@host.docker.internal -t ed25519 -N '' -C root@coolify + ``` + +6. Setup Your SSH Key + Add your public SSH key to `~/.ssh/authorized_keys`. This will allow Coolify to connect to this server from itself. + + ```bash + cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >>~/.ssh/authorized_keys + chmod 600 ~/.ssh/authorized_keys + ``` + + +7. Setup Configuration Files + Copy the `docker-compose.yml`, `docker-compose.prod.yml`, `.env.production` & `upgrade.sh` files from Coolify's CDN to `/data/coolify/source`. + + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/docker-compose.yml -o /data/coolify/source/docker-compose.yml + curl -fsSL https://cdn.coollabs.io/coolify/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml + curl -fsSL https://cdn.coollabs.io/coolify/.env.production -o /data/coolify/source/.env + curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o /data/coolify/source/upgrade.sh + ``` + +8. Set Permissions + Set permissions for all the files and directories. + ```bash + chown -R 9999:root /data/coolify + chmod -R 700 /data/coolify + ``` + +9. Generate Values + Generate values for the following variables in `/data/coolify/source/.env`. + ```bash + sed -i "s|APP_ID=.*|APP_ID=$(openssl rand -hex 16)|g" /data/coolify/source/.env + sed -i "s|APP_KEY=.*|APP_KEY=base64:$(openssl rand -base64 32)|g" /data/coolify/source/.env + sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=$(openssl rand -base64 32)|g" /data/coolify/source/.env + sed -i "s|REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -base64 32)|g" /data/coolify/source/.env + sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" /data/coolify/source/.env + sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" /data/coolify/source/.env + sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" /data/coolify/source/.env + ``` + + +10. Default Docker Network + Make sure the default `coolify` Docker network is available. + ```bash + docker network create --attachable coolify + ``` + +11. Start Coolify + ```bash + docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --pull always --remove-orphans --force-recreate + ``` + +12. Open Coolify's UI + Now you can access Coolify on port `http://:8000` of your server. + + +### Docker Desktop + + + +- Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for Windows. +- Create a directory that will hold all your Coolify related data. For example in your User directory: `C:\Users\yourusername\coolify`. +- Copy `docker-compose.windows.yml` and `.env.windows-docker-desktop.example` to the directory you created in the previous step. +- Rename `docker-compose.windows.yml` to `docker-compose.yml`. +- Rename `.env.windows-docker-desktop.example` to `.env`. +- Create a `coolify` docker network with `docker network create coolify`. +- Optional: Change the values in `.env` file. +- Start Coolify with `docker compose up` command. +- You can access Coolify on port `localhost:8000` of your machine. + +> Coolify Proxy is still not working on Windows. diff --git a/src/content/docs/knowledge-base/add-a-service.mdx b/src/content/docs/knowledge-base/add-a-service.mdx new file mode 100644 index 0000000..4671586 --- /dev/null +++ b/src/content/docs/knowledge-base/add-a-service.mdx @@ -0,0 +1,61 @@ +--- +title: "Add a service" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to add a new service to Coolify" +description: "Here you can find the documentation for adding new services to Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +Services in Coolify are templates made from normal [docker-compose](https://docs.docker.com/reference/compose-file/) files + a bit of magic. +See [Coolify's docker-compose specs](/docs/knowledge-base/docker/compose) to learn how to benefit from generated variables and storage handling. + +## Metadata + +You need to add extra metadata to the top of the `docker-compose` file, like: + +- documentation link +- a slogan +- additional tags (for better searching) +- logo (local icon, could be svg, png, etc) +- port (always use the port which is the main entrypoint - like frontend - of the service) + + + +Example: + +``` +# documentation: https://docs.n8n.io/hosting/ +# slogan: n8n is an extendable workflow automation tool which enables you to connect anything to everything via its open, fair-code model. +# tags: n8n,workflow,automation,open,source,low,code +# logo: svgs/n8n.svg +# port: 5678 + +... rest of the compose file ... + +``` + +## Add a new service + +Official templates stored [here](https://github.com/coollabsio/coolify/blob/main/templates/compose). They are just normal docker-compose files with a bit of magic. + +To add a new service, you can easily test your templates with `Docker Compose` deployments inside Coolify. It uses the same process to parse, generate and deploy as the one-click services. + +If you are done with tests and everything works, open a [PR](https://github.com/coollabsio/coolify/compare), that have the new `.yaml` compose file under `/templates/compose`. + + + +### Request a new service + +If there is a service template you'd like to see: +1. Search GitHub discussions [here](https://github.com/coollabsio/coolify/discussions/categories/new-service-integrations). +2. If it has already been requested, upvote it. If not, create a new request. \ No newline at end of file diff --git a/src/content/docs/knowledge-base/applications/django.mdx b/src/content/docs/knowledge-base/applications/django.mdx new file mode 100644 index 0000000..ecafc51 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/django.mdx @@ -0,0 +1,22 @@ +--- +title: Django +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy Django application with Coolify" +description: "A guide on how to deploy Django application with Coolify." +--- + +Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. + +## Requirements + +1. Set the base directory where your `requirements.txt` and `manage.py` files are located. + +> In the example repository, it is `/coolify`. + +2. Add `gunicorn` to the `requirements.txt` file, [official docs](https://docs.gunicorn.org/en/stable/install.html). +3. Add `localhost` and your `domain` to `ALLOWED_HOSTS` in `settings.py` file, [ official docs](https://docs.djangoproject.com/en/4.2/ref/settings/#allowed-hosts). + +> `Localhost` is required for health checks to work properly. diff --git a/src/content/docs/knowledge-base/applications/index.mdx b/src/content/docs/knowledge-base/applications/index.mdx new file mode 100644 index 0000000..d1be3bc --- /dev/null +++ b/src/content/docs/knowledge-base/applications/index.mdx @@ -0,0 +1,216 @@ +--- +title: Applications +head: + - tag: "meta" + attrs: + property: "og:title" + content: "General Application Configurations with Coolify" +description: "A general guide to configure your application with Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +Application could be any type of web application. It could be a static site, a NodeJS application, a PHP application, etc. + +For complex applications, you can use Docker Compose based deployments or the one-click services. + +## Examples + + +- [Vite](/docs/knowledge-base/applications/vite) +- [Django](/docs/knowledge-base/applications/django) +- [Jekyll](/docs/knowledge-base/applications/jekyll) +- [Vue.js](/docs/knowledge-base/applications/vuejs) +- [Next.js](/docs/knowledge-base/applications/nextjs) +- [Nuxt](/docs/knowledge-base/applications/nuxt) +- [Laravel](/docs/knowledge-base/applications/laravel) +- [Symfony](/docs/knowledge-base/applications/symfony) +- [Ruby on Rails](/docs/knowledge-base/applications/rails) +- [SvelteKit](/docs/knowledge-base/applications/svelte-kit) + + +## General Configuration + +### Commands + +You can overwrite the default commands by setting a custom value on the UI. + +- Build +- Install +- Start + + + +### Base Directory + +It is useful for monorepos. You can set the base directory for all the commands that will be executed by Coolify. + +### Public Directory + +If you are building a static site, it is important to set the public directory, so the builder will know which directory to serve. + +### Port Exposes + +Port exposes are required for Docker Engine to know which ports to expose. The first port will be the default port for health checks. + +Examples: + +If you have a NodeJS application that listens on port 3000, you can set it like this: `3000`. +If you have a PHP-FPM application that listens on port 9000, you can set it like this: `9000`. +If you have a Nginx server that listens on port 80, you can set it like this: `80`. + +### Port Mappings + + + +If you would like to map a port to the host system (server), you can do it here like this: `8080:80`. + +This will map the port 8080 on the host system to the port 80 inside the container. + + + +## Advanced + +### Static Site (Is it a static site?) + +> This feature is only available for Nixpacks buildpacks. + +If you need to serve a static site (SPA, HTML, etc), you can set this to `true`. It will be served by Nginx. `Disabled by default`. + +### Force HTTPS + +If you would like to force HTTPS, so no HTTP connections allowed, you can set this to `true`. `Enabled by default`. + +### Auto Deploy + +> This feature is only available for GitHub App based repositories. + +If you would like to deploy automatically when a new commit is pushed to the repository, you can set this to `true`. `Enabled by default`. + +### Preview Deployments + +Preview deployments are a great way to test your application before merging it into the main branch. Imagine it like a staging environment. + +#### URL Template + +You can setup your preview URL with a custom template. Default is `{{pr_id}}.{{domain}}`. + +This means that if you open a Pull Request with the ID `123`, and you resource domain is `example.com` the preview URL will be `123.example.com`. + + + +#### Automated Preview Deployments + +> This feature is only available for GitHub App based repositories. + +If you would like to deploy a preview version of your application (based on a Pull Requests), you can set this to `true`. `Disabled by default`. + +If set to `true`, all PR's that are opened against the resource's configured branch, will be deployed to a unique URL. + +#### Manually Triggered Preview Deployments + +You can manually deploy a Pull Request to a unique URL by clicking on the `Deploy` button on the Pull Request page. + +### Git Submodules + +If you are using git submodules, you can set this to `true`. `Enabled by default`. + +### Git LFS + +If you are using git lfs, you can set this to `true`. `Enabled by default`. + +### Environment Variables + +[Read here](/docs/knowledge-base/environment-variables) + +### Persistent Storage + +[Read here](/docs/knowledge-base/persistent-storage) + +### Health Checks + +By default, all containers are checked for liveness. + + + +### Rollbacks + +You can rollback to a previous version of your resource. At the moment, only local images are supported, so you can only rollback to a locally available docker image. + +### Resource Limits + +By default, the container won't have any resource limits. You can set the limits here. For more details, read the [Docker documentation](https://docs.docker.com/compose/compose-file/compose-file-v2/#cpu_count-cpu_percent-cpu_shares-cpu_period-cpu_quota-cpus-cpuset-domainname-hostname-ipc-mac_address-mem_limit-memswap_limit-mem_swappiness-mem_reservation-oom_kill_disable-oom_score_adj-privileged-read_only-shm_size-stdin_open-tty-user-working_dir). + +## Deployment Types + +There are several types of application deployments available. + +- Public Git Repository +- Private Git Repository ([GitHub App](https://docs.github.com/en/apps/using-github-apps/about-using-github-apps)) +- Private Git Repository ([Deploy Key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys)) +- Based on a Dockerfile +- Based on a Docker Compose +- Based on a Docker Image + +## Build Packs + +These are the supported build packs: + +- Nixpacks +- Dockerfile +- Docker Image +- Docker Compose + +### Nixpacks + +Coolify uses [Nixpacks](https://nixpacks.com) as build pack by default. Nixpacks detect what kind of application are you trying to deploy and builds it accordingly. + +But if needed, you can customize it by adding a `nixpacks.toml` file to your repository or setting the right environment variables. + +For example, if you are using a NodeJS application, you can set the `NIXPACKS_NODE_VERSION` to control the NodeJS version. + + + +### Dockerfile + +Dockerfile based build packs are useful if you have a custom dockerfile inside your Git repository. + +#### Custom Dockerfile Location + +You can always set your custom dockerfile location. By default, it is set to `/Dockerfile`. + +### Docker Image + +You can deploy any docker images from any Docker compatible repository. For example, you can deploy images from Docker Hub, GitHub Container Registry, etc. + +### Docker Compose + +Docker Compose based deployments are useful for complex applications. You can define multiple services in a single `docker-compose.yml` file and deploy them together. + +- [Languages/Frameworks](/docs/knowledge-base/applications/) +- [Services](/docs/knowledge-base/services/) diff --git a/src/content/docs/knowledge-base/applications/jekyll.mdx b/src/content/docs/knowledge-base/applications/jekyll.mdx new file mode 100644 index 0000000..eaf6c56 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/jekyll.mdx @@ -0,0 +1,43 @@ +--- +title: Jekyll +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy Jekyll site with Coolify" +description: "A guide on how to deploy Jekyll site with Coolify" +--- + +Jekyll is a simple, blog-aware, static site generator for personal, project, or organization sites. + +## Deploy with Nixpacks + +Nixpacks needs a few prerequisites in your source code to deploy your Jekyll application. More info [here](https://nixpacks.com/docs/providers/ruby). + +## Deploy with Dockerfile + +If you want simplicity, you can use a Dockerfile to deploy your Jekyll application. + +### Prerequisites + +1. Set `Ports Exposes` field to `80`. +2. Create a `Dockerfile` in the root of your project with the following content: + +```Dockerfile +FROM ruby:3.1.1 AS builder +RUN apt-get update -qq && apt-get install -y build-essential nodejs +WORKDIR /srv/jekyll +COPY Gemfile Gemfile.lock ./ +RUN bundle install +COPY . . +RUN chown 1000:1000 -R /srv/jekyll +RUN bundle exec jekyll build -d /srv/jekyll/_site + +FROM nginx:alpine +COPY --from=builder /srv/jekyll/_site /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] +``` + +3. Make sure you have a `Gemfile` and `Gemfile.lock` in the root of your project. +4. Set the buildpack to `Dockerfile`. diff --git a/src/content/docs/knowledge-base/applications/laravel.mdx b/src/content/docs/knowledge-base/applications/laravel.mdx new file mode 100644 index 0000000..3252b01 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/laravel.mdx @@ -0,0 +1,46 @@ +--- +title: Laravel +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy Laravel with Coolify" +description: "A guide on how to deploy Laravel with Coolify" +--- + +import { Aside } from '@astrojs/starlight/components'; + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. + +Example repository [here](https://github.com/coollabsio/coolify-examples/tree/main/laravel). + +## Requirements + +- Set `Build Pack` to `nixpacks` +- Set `APP_KEY` +- Set `Ports Exposes` to `80` + + + +### Other components + +If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard. + +You will receive the connection strings which you can use in your application and set them as environment variables: + +```bash +DB_CONNECTION=mysql +DB_HOST= +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +REDIS_HOST= +REDIS_PASSWORD=null +REDIS_PORT=6379 +``` diff --git a/src/content/docs/knowledge-base/applications/nextjs.mdx b/src/content/docs/knowledge-base/applications/nextjs.mdx new file mode 100644 index 0000000..93a2361 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/nextjs.mdx @@ -0,0 +1,23 @@ +--- +title: NextJS +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a NextJS app with Coolify" +description: "A guide on how to deploy a NextJS app with Coolify." +--- + +NextJS is a React framework that enables functionality such as server-side rendering and generating static websites. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/nextjs) + +## Server build (NodeJS) + +- Set `Build Pack` to `nixpacks`. + +## Static build (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `out`. diff --git a/src/content/docs/knowledge-base/applications/nuxt.mdx b/src/content/docs/knowledge-base/applications/nuxt.mdx new file mode 100644 index 0000000..cad01f5 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/nuxt.mdx @@ -0,0 +1,34 @@ +--- +title: Nuxt +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a Nuxt app with Coolify" +description: "A guide on how to deploy a Nuxt app with Coolify." +--- + +Nuxt is an open source framework that makes web development intuitive and powerful. +Create performant and production-grade full-stack web apps and websites with confidence. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/nuxt) + +## Server build (Nuxt, using `nuxt build`) + +- Set `Build Pack` to `nixpacks`. +- Set Start Command to `node .output/server/index.mjs` + +Alternatively, you can set the `start` script inside package.json to `node .output/server/index.mjs`. Then Nixpacks will automatically use it as the start command. + +## Static build (Nuxt, using `nuxt generate`) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. + +## Nitro server build (Nitro, using `nitro build`) + +- Set `Build Pack` to `nixpacks`. +- Set Start Command to `node .output/server/index.mjs` + +Alternatively, you can set the `start` script inside package.json to `node .output/server/index.mjs`. Then Nixpacks will automatically use it as the start command. diff --git a/src/content/docs/knowledge-base/applications/rails.mdx b/src/content/docs/knowledge-base/applications/rails.mdx new file mode 100644 index 0000000..3585970 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/rails.mdx @@ -0,0 +1,19 @@ +--- +title: Ruby on Rails +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy Ruby on Rails apps with Coolify" +description: "A guide on how to deploy Ruby on Rails apps with Coolify" +--- + +Ruby on Rails is a web-application framework that includes everything needed to create database-backend web applications according to the Model-View-Controller (MVC) pattern. + +## Requirements + +If you would like to migrate the database during the deployment with `NIXPACKS` build pack, you need to set the following `Start Command`: + +```bash +bundle exec rake db:migrate && bundle exec bin/rails server -b 0.0.0.0 -p ${PORT:-3000} -e $RAILS_ENV +``` diff --git a/src/content/docs/knowledge-base/applications/svelte-kit.mdx b/src/content/docs/knowledge-base/applications/svelte-kit.mdx new file mode 100644 index 0000000..f318114 --- /dev/null +++ b/src/content/docs/knowledge-base/applications/svelte-kit.mdx @@ -0,0 +1,25 @@ +--- +title: SvelteKit +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy SvelteKit app with Coolify" +description: "A guide on how to deploy SvelteKit app with Coolify." +--- + +Svelte Kit is a framework for building web applications of all sizes, with a beautiful development experience and flexible filesystem-based routing. + +## Static build (`adapter-static`) + +You need to use `@sveltejs/adapter-static` ([docs](https://kit.svelte.dev/docs/adapter-static)) adapter to build a static site. + +1. Set your site to static `on` (under `Build Pack` section). +2. Set your `Publish Directory` to `/build` + +## Node server (`adapter-node`) + +You need to use `@sveltejs/adapter-node` ([docs](https://kit.svelte.dev/docs/adapter-node)) adapter to build a node server based SvelteKit app. + +1. Set your site to static to `off` (under `Build Pack` section). +2. Set your `Start Command` to `node build`. diff --git a/src/content/docs/knowledge-base/applications/symfony.mdx b/src/content/docs/knowledge-base/applications/symfony.mdx new file mode 100644 index 0000000..74e4ade --- /dev/null +++ b/src/content/docs/knowledge-base/applications/symfony.mdx @@ -0,0 +1,55 @@ +--- +title: Symfony +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy Symfony with Coolify" +description: "A guide on how to deploy Symfony with Coolify" +--- + +Symfony is the leading PHP framework to create websites and web applications. Built on top of the Symfony Components. + +## Requirements + +- Set `Build Pack` to `nixpacks` +- Set `APP_ENV` +- Set `APP_SECRET` +- Set `NIXPACKS_PHP_FALLBACK_PATH` to `/index.php` +- Set `NIXPACKS_PHP_ROOT_DIR` to `/app/public` +- Set `Ports Exposes` to `80` + +### Database migrations + +If you use Doctrine, you can add the following `Post-deployment script` : + +`php bin/console doctrine:migrations:migrate --all-or-nothing --no-interaction` + +### Other components + +If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard. + +You will receive the connection strings which you can use in your application and set them as environment variables: + +```bash +DATABASE_URL=postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8 + +REDIS_HOST= +REDIS_PASSWORD=null +REDIS_PORT=6379 +``` + +### Trusted proxy + +You might need to configure the [trusted proxy](https://symfony.com/doc/current/deployment/proxies.html) : + +- Set the environment variable `TRUSTED_PROXIES` with the IP of your server +- Add the following Symfony configuration : + +```yaml +# config/packages/framework.yaml + +framework: + trusted_proxies: "%env(TRUSTED_PROXIES)%" + trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-prefix'] +``` \ No newline at end of file diff --git a/src/content/docs/knowledge-base/applications/vite.mdx b/src/content/docs/knowledge-base/applications/vite.mdx new file mode 100644 index 0000000..5f99cee --- /dev/null +++ b/src/content/docs/knowledge-base/applications/vite.mdx @@ -0,0 +1,26 @@ +--- +title: Vite +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a Vite app with Coolify" +description: "A guide on how to deploy a Vite app with Coolify." +--- + +Vite is a is a build tool that aims to provide a faster and leaner development experience for modern web projects. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/vite) + +## Vanilla TypeScript build (Static) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. + + +## Vanilla JavaScript build (Static) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. diff --git a/src/content/docs/knowledge-base/applications/vuejs.mdx b/src/content/docs/knowledge-base/applications/vuejs.mdx new file mode 100644 index 0000000..83ba14d --- /dev/null +++ b/src/content/docs/knowledge-base/applications/vuejs.mdx @@ -0,0 +1,30 @@ +--- +title: Vue +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a Vue app with Coolify" +description: "A guide on how to deploy a Vue app with Coolify." +--- + +Vue.js is an approachable, performant and versatile framework for building web user interfaces. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/vue) + +## Server build (NodeJS|Express) + +- Set `Build Pack` to `nixpacks`. +- Set 'Start Command` to `node server.js`. + +## Static build (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. + +## Static build with Router (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. \ No newline at end of file diff --git a/src/content/docs/knowledge-base/cloudflare/tunnels.mdx b/src/content/docs/knowledge-base/cloudflare/tunnels.mdx new file mode 100644 index 0000000..9e41805 --- /dev/null +++ b/src/content/docs/knowledge-base/cloudflare/tunnels.mdx @@ -0,0 +1,190 @@ +--- +title: "Cloudflare Tunnels" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use Cloudflare Tunnels with Coolify." +description: "A guide on how to use Cloudflare Tunnels with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +You can run Coolify on your local machine (like old laptop/Raspberry PI) and expose it to the internet without opening any ports on your router with Cloudflare Tunnels. + +> For more details about CF Tunnels, please visit [this page](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/). + +## Setup Cloudflared + +You have at least two ways to setup Cloudflare Tunnels with Coolify. + +- [Automated](#automated) +- [Manual](#manual) + +### Automated + + +1. Setup Tunnels on Cloudflare + 1. Go to `https://one.dash.cloudflare.com/`. + + 2. Select your account. + + 3. Open `Networks`-> `Tunnels`-> `Create a Tunnel` + + 4. Connector: `Cloudflared` + ![connector](../../../../assets/images/cloudflare/cf-tunnels-connector.png) + + 5. Choose any name you like. + ![notice](../../../../assets/images/cloudflare/cf-tunnels-notice-me.png) + + 6. Copy your `Cloudflare Tunnel Token` from any of the commands. + + + ![token](../../../../assets/images/cloudflare/cf-tunnels-token.png) + + 7. On the `Route Tunnel` tab, add the following tunnels: + + + + ![ssh](../../../../assets/images/cloudflare/cf-tunnels-ssh.png) + +2. Setup Tunnels on Coolify + 1. Add a new server with your server's `IP Address` - it will be reconfigured later on. + ![addserver](../../../../assets/images/cloudflare/coolify-add-server.png) + + 2. Validate the server. + + 2. After the server is validated, click on `Configure` in the `Cloudflare Tunnels` section. + + 3. Paste `Cloudflare Tunnel Token` from the previous step and set the `SSH Domain` to the domain you set in the previous step. + ![setcftoken](../../../../assets/images/cloudflare/coolify-set-cf-token.png) + + + +### Manual + +WIP + +## Setup Resources in Coolify + +You have several options to use Cloudflare Tunnels with Coolify. + +1. One domain -> One resource. +2. Wildcard subdomain -> All resources. + +### One domain -> One resource + +In this case, you need to add a public domain every time you would like to expose a new resource through Cloudflare Tunnels. + + + +1. Go to your tunnel settings on Cloudflare. (https://one.dash.cloudflare.com/ -> Networks -> Tunnels -> Select your tunnel) +2. Switch to `Public Hostname` tab. +3. Add a new `Public Hostname`. + ![onepublic](../../../../assets/images/cloudflare/cf-one-public-hostname.png) +4. Go to Coolify and to your resource settings: - Remove any `Domains` settings. - Set `Port Mappings` to the same port that you set in the `Public Hostname` settings. + +5. Deploy & enjoy. + +### Wildcard subdomain -> All resources + +In this case, you only need to setup a wildcard domain once and you can expose all your resources through it. + + + +1. Go to your tunnel settings on Cloudflare. (https://one.dash.cloudflare.com/ -> Networks -> Tunnels -> Select your tunnel) +2. Switch to `Public Hostname` tab. +3. Add a new wildcard `Public Hostname`. + ![wildcard-cf](../../../../assets/images/cloudflare/cf-wildcard-public-hostname.png) +4. In Cloudflare go to ` Networks -> Tunnels` and click on your tunnel name. From the sidebar copy the `Tunnel ID`. + ![cf-tunnel-id](../../../../assets/images/cloudflare/cf-tunnel-id.png) +5. In Cloudflare go to your `DNS` settings and add a new `CNAME` record with the following settings: + - `Name`: `*` + - `Target`: `.cfargotunnel.com` + - `TTL`: `Auto` +6. Go to Coolify and to your resource settings. + +Set the `Domains` to any subdomain of the wildcard domain you set in the previous step. + +![wildcard-coolify](../../../../assets/images/cloudflare/coolify-set-domains.png) + + + +7. Deploy & enjoy. + + + +## Post Setup + +After everything is setup, you can fully disable direct access to your server by disabling all the ports (except `SSH (port:22 by default)`) on your firewall. + +## Setup self-hosted Coolify + +You can use the [one domain](/docs/knowledge-base/cloudflare/tunnels/#one-domain---one-resource) without `Coolify Proxy` or [wildcard](/docs/knowledge-base/cloudflare/tunnels/#wildcard-subdomain---all-resources) setup with `Coolify Proxy` to expose your self-hosted Coolify instance to the internet. + +With the `wildcard` setup, you have nothing to do. + +With the `one domain` setup, you need a bit more setup with Coolify to make it work. + +Let's say you configured the following `Public Hostnames` in Cloudflare: + +- `app.coolify.io` mapped to `localhost:8000` +- `realtime.coolify.io` mapped to `localhost:6001` + +After you installed Coolify, you need to add 3 lines your `.env` file, located in `/data/coolify/source` folder. + +```bash +APP_ID= +APP_KEY= +APP_NAME=Coolify +DB_PASSWORD= +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +REDIS_PASSWORD= + +########### +# Add these lines +PUSHER_HOST=realtime.coolify.io +PUSHER_PORT=443 +########### +``` + +This tells Coolify how to connect to it's realtime server through Cloudflare Tunnels. + +Restart Coolify with the installation script. + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash +``` + +> If you have a firewall, you also need to allow the [following ports](/docs/knowledge-base/server/firewall). + +### Verify + +1. Navigate to your Coolify instance, as in the example: `https://app.coolify.io`. +2. Login with the root user (the first user you created after installation). +3. Open another tab/window and navigate to `https://app.coolify.io/realtime`. On the other tab (opened in point 2), you should see a notification about the test event. +4. If you know what are you doing, you can check the network tab as well. Search for a websocket connection. diff --git a/src/content/docs/knowledge-base/commands.mdx b/src/content/docs/knowledge-base/commands.mdx new file mode 100644 index 0000000..909d683 --- /dev/null +++ b/src/content/docs/knowledge-base/commands.mdx @@ -0,0 +1,38 @@ +--- +title: Commands +head: + - tag: "meta" + attrs: + property: "og:title" + content: "What commands are available to manage my Coolify server" +description: A list of commands that you can use to manage your Coolify server. +--- + + +## Root password reset without SMTP +You can use the following method to reset the root user's password, in case you forgot and do not have an SMTP server set, so you cannot request a forgot password. + +Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify bash -c "php artisan root:reset-password" +``` + +## Root email change +You can change root user's email. + +Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify bash -c "php artisan root:change-email" +``` + +## Delete a stuck service + You can easily delete a stucked service. + + Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify bash -c "php artisan services:delete" +``` + diff --git a/src/content/docs/knowledge-base/databases/backups.mdx b/src/content/docs/knowledge-base/databases/backups.mdx new file mode 100644 index 0000000..f1b59e5 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/backups.mdx @@ -0,0 +1,75 @@ +--- +title: "Backups" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure database backups in Coolify" +description: "A guide how backups work in Coolify." +--- +import { Aside } from '@astrojs/starlight/components'; + +Scheduled database backups could be configured for PostgreSQL and for Coolify itself. + +This schedules are based on cron expressions, so you can configure them to run as often as you want. + +You can also use simple cron expressions like: + +```js +const VALID_CRON_STRINGS = [ + 'every_minute' => '* * * * *', + 'hourly' => '0 * * * *', + 'daily' => '0 0 * * *', + 'weekly' => '0 0 * * 0', + 'monthly' => '0 0 1 * *', + 'yearly' => '0 0 1 1 *', +]; +``` + +## PostgreSQL + +Coolify creates a full backup of your PostgreSQL databases. You can specify which database to backup, with a comma separated list. + + + +### Backup command + +```bash +pg_dump --format=custom --no-acl --no-owner --username +``` + +### Restore command + +The backup has custom format, so you can restore it using the following command (or with any equivalent tool): + +```bash +pg_restore --verbose --clean -h localhost -U postgres -d postgres pg-dump-postgres-1697207547.dmp +``` + +## MySQL + +```bash +mysqldump -u root -p +``` + +## MariaDB + +```bash +mariadb-dump -u root -p +``` + +## MongoDB + +```bash +mongodump --authenticationDatabase=admin --uri= --gzip --archive= +``` + +Or if you exclude some collections: + +```bash +mongodump --authenticationDatabase=admin --uri= --gzip --archive= --excludeCollection= --excludeCollection= +``` + +## S3 Backups + +You can also define your own [S3 compatible](/docs/knowledge-base/s3) storage to store your backups. diff --git a/src/content/docs/knowledge-base/databases/clickhouse.mdx b/src/content/docs/knowledge-base/databases/clickhouse.mdx new file mode 100644 index 0000000..002e483 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/clickhouse.mdx @@ -0,0 +1,26 @@ +--- +title: ClickHouse +head: + - tag: "meta" + attrs: + property: "og:title" + content: "ClickHouse with Coolify" +description: "Here you find an introduction to ClickHouse" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + + ![clickhouse](../../../../assets/images/database-logos/clickhouse.png) + +## What is ClickHouse + +ClickHouse is an open-source column-oriented database management system designed for online analytical processing (OLAP). It's known for its exceptional query performance on large datasets, making it ideal for real-time analytics and data warehousing applications. + +ClickHouse uses a column-oriented storage format and employs various optimizations like vectorized query execution to achieve high performance. It supports SQL with extensions and can handle both batch and stream data ingestion, making it versatile for various analytical workloads. + +## Links + +- [The official website โ€บ](https://clickhouse.com/) +- [GitHub โ€บ](https://github.com/ClickHouse/ClickHouse) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/dragonfly.mdx b/src/content/docs/knowledge-base/databases/dragonfly.mdx new file mode 100644 index 0000000..97cd4b8 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/dragonfly.mdx @@ -0,0 +1,27 @@ +--- +title: DragonFly +head: + - tag: "meta" + attrs: + property: "og:title" + content: "DragonFly with Coolify" +description: "Here you find an introduction to DragonFly" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + + +![dragonfly](../../../../assets/images/database-logos/dragonfly-dark.svg) + +## What is DragonFly + +DragonFly is a modern in-memory datastore, designed as a Redis alternative with better scalability and resource efficiency. It offers a Redis-compatible API while providing improved performance on multi-core systems. DragonFly is built to handle high-throughput scenarios and large datasets more efficiently than traditional in-memory datastores. + +With its multi-threaded architecture and advanced data structures, DragonFly aims to provide enhanced scalability and performance for applications that require Redis-like functionality on modern hardware. + +## Links + +- [The official website โ€บ](https://dragonflydb.io/) +- [GitHub โ€บ](https://github.com/dragonflydb/dragonfly) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/index.mdx b/src/content/docs/knowledge-base/databases/index.mdx new file mode 100644 index 0000000..8556970 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/index.mdx @@ -0,0 +1,66 @@ +--- +title: Introduction +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Databases you can host with Coolify" +description: "An overview of the databases supported by Coolify and their characteristics." +--- + +import { Aside } from '@astrojs/starlight/components'; + +Coolify supports a variety of databases to suit different application needs. Even if you don't see your favorite database here, you can still host it with Coolify, using Docker. + +Coolify offers one-click setup for the following databases: + +- [PostgreSQL](/docs/knowledge-base/databases/postgresql) +- [Redis](/docs/knowledge-base/databases/redis) +- [DragonFly](/docs/knowledge-base/databases/dragonfly) +- [KeyDB](/docs/knowledge-base/databases/keydb) +- [Clickhouse](/docs/knowledge-base/databases/clickhouse) +- [MongoDB](/docs/knowledge-base/databases/mongodb) +- [MySQL](/docs/knowledge-base/databases/mysql) +- [MariaDB](/docs/knowledge-base/databases/mariadb) + +Each database has its own strengths and use cases. Click on a database to learn more about it. + +# Deploy a database + +When selecting a New Resource, you can select a database from the list. + + +![New Resource](../../../../assets/images/screenshots/How-to-add-a-database.png) + +You can configure a database with a simple click. Coolify supports the following databases: + +- PostgreSQL +- MySQL +- MariaDB +- MongoDB +- Redis +- DragonFly +- KeyDB +- Clickhouse + +## Ports Mapping vs Public Port + +### Ports Mapping + +Ports mapping is using the Docker [port mapping](https://docs.docker.com/network/#published-ports) feature. It is used to map the container port to the host port. For example, if you set the port mapping to `8080:80`, the container port `80` will be mapped to the host port `8080`. + +### Public Port + +Public port is used to expose the container port to the internet, by starting an Nginx TCP proxy. + +### Which one should I use? + +- Port mappings makes the connection/port permanent (you need to restart your database to change it). +- The public port makes the connection/port dynamic (you can change it without restarting the database, Coolify will restart the Nginx TCP proxy for you). + +## Access database during builds + +If you are using `Nixpacks` build pack, you have two ways to access your database during builds: + +1. Database & your application are `in the same network`: You can reach it using the `internal URL` provided by Coolify. +2. Database & your application `are not in the same network`: You need to set your database to be `Accessible over the internet` and use the `public URL` provided by Coolify. diff --git a/src/content/docs/knowledge-base/databases/keydb.mdx b/src/content/docs/knowledge-base/databases/keydb.mdx new file mode 100644 index 0000000..6b3125c --- /dev/null +++ b/src/content/docs/knowledge-base/databases/keydb.mdx @@ -0,0 +1,26 @@ +--- +title: KeyDB +head: + - tag: "meta" + attrs: + property: "og:title" + content: "KeyDB with Coolify" +description: "Here you find an introduction to KeyDB" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![KeyDB](../../../../assets/images/database-logos/keydb.png) + +## What is KeyDB + +KeyDB is a high-performance fork of Redis, focusing on multithreading, memory efficiency, and high availability. It maintains API compatibility with Redis while offering improved performance, especially on multi-core systems. KeyDB introduces features like active replication, FLASH storage support, and subkey expires to enhance the capabilities of the traditional Redis model. + +Designed to be a drop-in replacement for Redis, KeyDB aims to provide better resource utilization and scalability for applications requiring high-throughput in-memory data storage and processing. + +## Links + +- [The official website โ€บ](https://keydb.dev/) +- [GitHub โ€บ](https://github.com/EQ-Alpha/KeyDB) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/mariadb.mdx b/src/content/docs/knowledge-base/databases/mariadb.mdx new file mode 100644 index 0000000..86e3133 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/mariadb.mdx @@ -0,0 +1,26 @@ +--- +title: MariaDB +head: + - tag: "meta" + attrs: + property: "og:title" + content: "MariaDB with Coolify" +description: "Here you find an introduction to MariaDB" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Mariadb](../../../../assets/images/database-logos/mariadb.svg) + +## What is MariaDB + +MariaDB is an open-source fork of MySQL, designed to remain free and open-source. It aims to be a drop-in replacement for MySQL with enhanced features and performance. MariaDB maintains high compatibility with MySQL while offering additional storage engines, performance improvements, and features. + +Started by core members of MySQL, MariaDB provides a robust and scalable database solution suitable for a wide range of applications. + +## Links + +- [The official website โ€บ](https://mariadb.org/) +- [GitHub โ€บ](https://github.com/MariaDB/server) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/mongodb.mdx b/src/content/docs/knowledge-base/databases/mongodb.mdx new file mode 100644 index 0000000..4327d6b --- /dev/null +++ b/src/content/docs/knowledge-base/databases/mongodb.mdx @@ -0,0 +1,26 @@ +--- +title: MongoDB +head: + - tag: "meta" + attrs: + property: "og:title" + content: "MongoDB with Coolify" +description: "Here you find an introduction to MongoDB" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![MongoDB](../../../../assets/images/database-logos/mongodb.png) + +## What is MongoDB + +MongoDB is a popular, open-source document-oriented NoSQL database designed for scalability and flexibility. It stores data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. + +MongoDB is known for its horizontal scalability, powerful query language, and ability to handle large volumes of unstructured or semi-structured data. It's widely used in modern web applications, content management systems, and other scenarios where flexible data models and scalability are crucial. + +## Links + +- [The official website โ€บ](https://www.mongodb.com/) +- [GitHub โ€บ](https://github.com/mongodb/mongo) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/mysql.mdx b/src/content/docs/knowledge-base/databases/mysql.mdx new file mode 100644 index 0000000..ce7156a --- /dev/null +++ b/src/content/docs/knowledge-base/databases/mysql.mdx @@ -0,0 +1,26 @@ +--- +title: MySQL +head: + - tag: "meta" + attrs: + property: "og:title" + content: "MySQL with Coolify" +description: "Here you find an introduction to MySQL" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![MySQL](../../../../assets/images/database-logos/mysql.png) + +## What is MySQL + +MySQL is a widely-used, open-source relational database management system (RDBMS) known for its reliability, ease of use, and performance. It's an essential component of the popular LAMP (Linux, Apache, MySQL, PHP/Python/Perl) stack used for web development. + +MySQL provides a robust, ACID-compliant database solution suitable for a wide range of applications, from small websites to large-scale enterprise systems. It offers features like replication, partitioning, and full-text indexing, making it versatile for various use cases. + +## Links + +- [The official website โ€บ](https://www.mysql.com/) +- [GitHub โ€บ](https://github.com/mysql/mysql-server) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/postgresql.mdx b/src/content/docs/knowledge-base/databases/postgresql.mdx new file mode 100644 index 0000000..6c5c973 --- /dev/null +++ b/src/content/docs/knowledge-base/databases/postgresql.mdx @@ -0,0 +1,26 @@ +--- +title: PostgreSQL +head: + - tag: "meta" + attrs: + property: "og:title" + content: "PostgreSQL with Coolify" +description: "Here you find an introduction to PostgreSQL" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![PostgreSQL](../../../../assets/images/database-logos/postgresql.png) + +## What is PostgreSQL + +PostgreSQL is an advanced, open-source object-relational database system known for its reliability, feature robustness, and performance. It has more than 30 years of development and is widely used in the industry. + +PostgreSQL, often simply "Postgres", uses and extends the SQL language combined with many features that safely store and scale the most complicated data workloads. + +## Links + +- [The official website โ€บ](https://www.postgresql.org/) +- [GitHub โ€บ](https://github.com/postgres/postgres) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/databases/redis.mdx b/src/content/docs/knowledge-base/databases/redis.mdx new file mode 100644 index 0000000..fd3e1be --- /dev/null +++ b/src/content/docs/knowledge-base/databases/redis.mdx @@ -0,0 +1,24 @@ +--- +title: Redis +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Redis with Coolify" +description: "Here you find an introduction to Redis" +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Redis](../../../../assets/images/database-logos/redis.svg) + +## What is Redis + +Redis is an in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker. Redis has built-in replication and different levels of on-disk persistence. It supports complex data types (for example, strings, hashes, lists, sets, sorted sets, and JSON), with atomic operations defined on those data types. + +## Links + +- [The official website โ€บ](https://redis.io/) +- [GitHub โ€บ](https://github.com/redis/redis) \ No newline at end of file diff --git a/src/content/docs/knowledge-base/delete-user.mdx b/src/content/docs/knowledge-base/delete-user.mdx new file mode 100644 index 0000000..2e827cd --- /dev/null +++ b/src/content/docs/knowledge-base/delete-user.mdx @@ -0,0 +1,48 @@ +--- +title: Delete User +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Delete User" +description: "How to delete a user from the self-hosted Coolify instance." +--- + +import { Aside } from '@astrojs/starlight/components'; + +This guide will show you how to delete a user from the self-hosted Coolify instance. + + + +Only users who are in the `root` team can delete users from the UI. + +- Go to the `Team` page. +- Switch to `Admin View` tab. + +Here you can see all the users registered in Coolify. Click on the `Delete` button next to the user you want to delete. + +## Deletion process + + + +Coolify iterate over all the teams of a user and decide of the followings: + +### The user is alone in the team + +The team and all resources from the server and from Coolify's database are deleted. + +### The user is not alone in the team + +1. The user is the owner/admin of the team and no other owners/admins found, but the team **has members**: + - The ownership is transferred to the first user in the team who is not the owner/admin. + - The user is removed from the team. No resources are deleted. + +2. The user is the owner/admin of the team and no other owners/admins found, but the team has **no members**: + - The team and all resources from the server and from Coolify's database are deleted. + +3. The user is not the owner/admin of the team: + - The user is removed from the team. No resources are deleted. diff --git a/src/content/docs/knowledge-base/dns-configuration.mdx b/src/content/docs/knowledge-base/dns-configuration.mdx new file mode 100644 index 0000000..3bbbc16 --- /dev/null +++ b/src/content/docs/knowledge-base/dns-configuration.mdx @@ -0,0 +1,59 @@ +--- +title: "DNS Configuration" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure DNS for your domains with Coolify." +description: "A guide on how to configure DNS for your domains with Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +In general you need an `A` record for all the domains or subdomains you want to use, pointing to the IP address of your server where you would like to deploy your application. + +Note that you can use the same IP address for multiple domains and subdomains. + +**In the examples, `1.1.1.1` is your server's IP address.** + +## Single Domain + +Let's say you want deploy your resource to `example.com` with the IP address `1.1.1.1`. + +- You need to set an `A` record for `example.com` pointing to `1.1.1.1`. + + + +Then you can use `https://example.com` as a FQDN (Fully Qualified Domain Name) for any of your resources, even for your Coolify instance. + +## Wildcard Domains + +Let's say you want deploy your resource to `*.example.com` with the IP address `1.1.1.1`. + +- You need to set an `A` record for `*.example.com` pointing to `1.1.1.1`. + +This allows you to use any subdomain of `example.com` as a FQDN (Fully Qualified Domain Name) for any of your resources, even for your Coolify instance. + +For example, you can use `https://app.example.com` or `https://api.example.com` as a FQDN. + +## Autogenerated Domains + +If you set a wildcard domain in your DNS settings, you can also use Coolify to autogenerate domains for your resources. +You just need to go to the `Server` settings and set the `Wildcard Domain` field to your domain, for example `https://example.com`. + +Then if you create a new resource: + +- You will get a random subdomain for your application, for example `https://random.example.com`. +- Also for your Preview Deployments, for example `https://.random.example.com`. + + + +## Instance Domain + +If you self-host Coolify, you can set your Coolify instance a custom domain in the `/settings` page. diff --git a/src/content/docs/knowledge-base/docker/compose.mdx b/src/content/docs/knowledge-base/docker/compose.mdx new file mode 100644 index 0000000..feb1349 --- /dev/null +++ b/src/content/docs/knowledge-base/docker/compose.mdx @@ -0,0 +1,156 @@ +--- +title: "Docker Compose" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use Docker Compose deployments with Coolify." +description: "A guide on how to use Docker Compose deployments with Coolify." +--- +import { Aside, Steps } from '@astrojs/starlight/components'; + +If you are using `Docker Compose` based deployments, you need to understand how Docker Compose works with Coolify. + +In all cases the Docker Compose (`docker-compose.y[a]ml`) file is the single source of truth. + +## Defining environment variables + +Coolify will notice the environment variables you mention in your compose file and will display it in its UI. + +```yaml +services: + myservice: + environment: + - SOME_HARDCODED_VALUE=hello # Gets passed to the container but will not be visible in Coolify's UI + - SOME_VARIABLE=${SOME_VARIABLE_IN_COOLIFY_UI} # Creates an uninitialized environment variable editable in Coolify's UI + - SOME_DEFAULT_VARIABLE=${OTHER_NAME_IN_COOLIFY:-hello} # Creates an environment variable of value "hello" editable in Coolify's UI +``` + + +![Coolify's UI for environment variables](../../../../assets/images/screenshots/Docker-compose-environment-variables-UI.png) + +Additionally, Coolify can generate some dynamic variables for you. +The syntax is `SERVICE__`. +Type may be one of: + +- **FQDN**: This will [generate](/docs/knowledge-base/server/introduction#wildcard-domain) an FQDN for the service. The example below shows how you can add paths and ports. +- **URL**: Generates an URL based on the FQDN you have defined. +- **USER**: Generates a random string using `Str::random(16)`. You might want to use it as a username in your service. +- **PASSWORD**: Generates a password using `Str::password(symbols: false)`. Use `PASSWORD_64` to generate a 64 bit long password with `Str::password(length: 64, symbols: false)`. +- **BASE64**: Generates a random string using `Str::random(32)`. For longer strings, use `BASE64_64` or `BASE64_128`. +- **REALBASE64**: Encodes a randomly generated string using `base64_encode(Str::random(32))`. For longer strings, use `REALBASE64_64` or `REALBASE64_128`. + +Every generated variable can be reused and will always have the same value for every service. +All generated variables are displayed in Coolify's UI for environment variables and can be edited there (except FQDN and URl). + +As an example, imagine an application with UUID `vgsco4o` (generated by Coolify on creation). +It uses a compose file deploying Appwrite on the [wildcard](/docs/knowledge-base/server/introduction#wildcard-domain) domain `http://example.com` . + +```yaml +services: + appwrite: + environment: + # http://appwrite-vgsco4o.example.com/v1/realtime + - SERVICE_FQDN_APPWRITE=/v1/realtime + # _APP_URL will have the FQDN because SERVICE_FQDN_APPWRITE is just a simple environment variable + - _APP_URL=$SERVICE_FQDN_APPWRITE + # http://appwrite-vgsco4o.example.com/ will be proxied to port 3000 + - SERVICE_FQDN_APPWRITE_3000 + # http://api-vgsco4o.example.com/api will be proxied to port 2000 + - SERVICE_FQDN_API_2000=/api + # Coolify generates password and injects it as SERVICE_SPECIFIC_PASSWORD into the container + - SERVICE_SPECIFIC_PASSWORD=${SERVICE_PASSWORD_APPWRITE} + not-appwrite: + environment: + # Same value as in Appwrite service + - APPWRITE_PASSWORD=${SERVICE_PASSWORD_APPWRITE} + # As SERVICE_FQDN_API is not the same as SERVICE_FQDN_APPWRITE + # Coolify will generate a new FQDN + # http://not-appwrite-vgsco4o.example.com/api + - SERVICE_FQDN_API=/api +``` + +--- + +## Storage + +You can predefine storage normally in your compose file, but there are a few extra options that you can set to tell Coolify what to do with the storage. + +### Create an empty directory + +```yaml +# Predefine directories with host binding +services: + filebrowser: + image: filebrowser/filebrowser:latest + volumes: + - type: bind + source: ./srv + target: /srv + is_directory: true # This will tell Coolify to create the directory (this is not available in a normal docker-compose) +``` + +### Create a file with content + +Here you can see how to add a file with content and a dynamic value that is coming from an environment variable. + +```yaml +services: + filebrowser: + image: filebrowser/filebrowser:latest + environment: + - POSTGRES_PASSWORD=password + volumes: + - type: bind + source: ./srv/99-roles.sql + target: /docker-entrypoint-initdb.d/init-scripts/99-roles.sql + content: | + -- NOTE: change to your own passwords for production environments + \set pgpass `echo "$POSTGRES_PASSWORD"` + + ALTER USER authenticator WITH PASSWORD :'pgpass'; + ALTER USER pgbouncer WITH PASSWORD :'pgpass'; +``` + + +## Connect to Predefined Networks + +By default, each compose stack is deployed to a separate network, with the name of your resource uuid. This will allow to each service in your stack to communicate with each other. + +But in some cases, you would like to communicate with other resources in your account. For example, you would like to connect your application to a database, which is deployed in another stack. + +To do this you need to enable `Connect to Predefined Network` option on your `Service Stack` page, but this will make the internal Docker DNS not work as expected. + +Here is an example. You have a stack with a `postgres` database and a `laravel` application. Coolify will rename your `postgres` stack to `postgres-` and your `laravel` stack to `laravel-` to prevent name collisions. + +If you set `Connect to Predefined Network` option on your `laravel` stack, your `laravel` application will be able to connect to your `postgres` database, but you need to use the `postgres-` as your database host. + + +## Raw Docker Compose Deployment + +You can set with docker compose build pack to deploy your compose file directly without most of Coolify's magic. It is called `Raw Compose Deployment`. + + + +### Labels + +Coolify will still add the following labels (if they are not set) to your application: + +```yaml +labels: + - coolify.managed=true + - coolify.applicationId=5 + - coolify.type=application +``` + +To use Coolify's Proxy (Traefik), you need to set the following labels to your application: + +```yaml +labels: + - traefik.enable=true + - "traefik.http.routers..rule=Host(`coolify.io`) && PathPrefix(`/`)" + - traefik.http.routers..entryPoints=http +``` diff --git a/src/content/docs/knowledge-base/docker/custom-commands.mdx b/src/content/docs/knowledge-base/docker/custom-commands.mdx new file mode 100644 index 0000000..a6c4e4b --- /dev/null +++ b/src/content/docs/knowledge-base/docker/custom-commands.mdx @@ -0,0 +1,41 @@ +--- +title: "Custom Commands" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use custom commands for your Docker deployments with Coolify." +description: "A guide on how to use custom commands for your Docker deployments with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + + +For deploying your resources, you can add custom options to the final docker command, which is used to run your container. + + + +## Supported Options + +- `--ip` +- `--ip6` +- `--shm-size` +- `--cap-add` +- `--cap-drop` +- `--security-opt` +- `--sysctl` +- `--device` +- `--ulimit` +- `--init` +- `--ulimit` +- `--privileged` + +## Usage + +You can simply add the options to the `Custom Docker Options` field on the `General` tab of your resource. + +Example: `--cap-add SYS_ADMIN --privileged` diff --git a/src/content/docs/knowledge-base/docker/registry.mdx b/src/content/docs/knowledge-base/docker/registry.mdx new file mode 100644 index 0000000..431aeda --- /dev/null +++ b/src/content/docs/knowledge-base/docker/registry.mdx @@ -0,0 +1,72 @@ +--- +title: "Docker Registry" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure a Docker Registry with Coolify." +description: "A guide on how to configure a Docker Registry with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +You can easily push your built docker images to any docker registries with Coolify. + +You just need to fill the `Docker Registry` fields in your service `General` configurations. + +## Configuration + +### Docker Image + +If this field is set, Coolify will automatically push your built docker image to the specified docker registry. + +> If the image is empty, Coolify won't push your built image. + +### Docker Image Tag + +If this field is set, Coolify will automatically push your built docker image with the specified tag to the specified docker registry + the git commit sha tag. + +> If the tag is empty, Coolify only push your built image with the git commit sha tag. + +## Docker Credentials + +Docker credentials (from v4.0.0-beta.88) are used to authenticate with Docker registries to pull/push images. + +If you want to authenticate Coolify with a Docker Registry: + + +1. Login to your server + Login on the server through SSH with the same user that configured for your server. + +2. Authenticate to Docker Registry + Login to the Docker Registry, normally execute `docker login` command. + + > You will be prompted to enter your Docker registry username and password/token - this can be varied depending on the Docker registry you are using. + +Once you logged in, Coolify will automatically detect your credentials and use them. + +## Swarm Mode + +If you are deploying to a Swarm cluster, you need to make sure that your Docker Registry is accessible from all nodes in the cluster, workers and managers. + +## Host your own registry + +You can easily host your own registry, however, it will consume a lot of storages as by default it stores images locally on the server. + +More info on how to set other storage drivers can be found in the [official documentation](https://distribution.github.io/distribution/storage-drivers/). + +You can find the one-click service in Coolify. + +### Setup + +You need to generate an user / password for the registry. + +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +Then go to `Storages` menu, and in the `/auth/registry.password` file, simply add the generated user / password. One line per user. + + diff --git a/src/content/docs/knowledge-base/docker/swarm.mdx b/src/content/docs/knowledge-base/docker/swarm.mdx new file mode 100644 index 0000000..ec24a32 --- /dev/null +++ b/src/content/docs/knowledge-base/docker/swarm.mdx @@ -0,0 +1,134 @@ +--- +title: "Docker Swarm" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use Docker Swarm with Coolify." +description: "A guide on how to use Docker Swarm with Coolify." +--- +import { Aside, Steps } from '@astrojs/starlight/components'; + + + + +## Setup in Coolify + +If you would like to use a Swarm to deploy your resources, you need to add the `Swarm Manager` to Coolify. + +Optionally, you can add the `Swarm Workers` to Coolify. This will allow Coolify to do cleanups and other stuff on the `Swarm Workers`. + +### Docker Registry + +You need to have an external Docker Registry available to use a Swarm, as all workers need to be able to pull the images you built with Coolify. + +- The Swarm Manager needs to push the image to the Docker Registry. +- The Swarm Workers need to pull the image from the Docker Registry. + +So set your docker login credentials accordingly. More information [here](/docs/knowledge-base/docker/registry). + +## Install Swarm Cluster + +> WIP +> This is just a brief guide to install a simple Docker Swarm cluster. For more information, please refer to the [official documentation](https://docs.docker.com/engine/swarm/). + +### Prerequisites + +- I will use [Hetzner](https://coolify.io/hetzner) (referral link) for this guide. You can use any other provider. +- You need at least 3 servers to create a Docker Swarm cluster with the same architecture (ARM or AMD64). +- 1 server for the manager node. +- 2 servers for the worker nodes (you can add more worker nodes if you want). +- Add private networking to all servers if possible. + +### Install Docker + +Install Docker on all servers. You can follow the [official documentation](https://docs.docker.com/engine/install/) or: + +1. Install with Rancher script + +```bash +curl https://releases.rancher.com/install-docker/24.0.sh | sh +``` + +2. Install with Docker script + +```bash +curl https://get.docker.com | sh -s -- --version 24.0 +``` + +> You only need to use one of the above commands. + +### Configure Docker + +On `all servers`, run the following command to start Docker. + +```bash +systemctl start docker +systemctl enable docker +``` + + + +### Create a Swarm cluster + +`On the manager node`, run the following command to create a new cluster. + +```bash +# MANAGER_IP = IP of the manager node. If you have private networking, use the private IP, like 10.0.0.x. +docker swarm init --advertise-addr + +``` + +This command will output a command to join the cluster on the `worker nodes`. + +It should look like something like this: + +```bash +# DO NOT RUN THIS COMMAND, IT IS JUST AN EXAMPLE, HELLO! +docker swarm join --token SWMTKN-1-24zvxeydjarchy7z68mdawichvf684qvf8zalx3rmwfgi6pzm3-4ftqn9n8v98kx3phfqjimtkzx 10.0.0.2:2377 +``` + +### Verify the cluster + +Run the following command on the manager node to verify the cluster. + +```bash +docker node ls +``` + +You should see something like this: + +```bash +ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION +ua38ijktbid70em257ymxufif * swarm-manager Ready Active Leader 24.0.2 +7rss9rvaqpe9fddt5ol1xucmu swarm-worker Ready Active 24.0.2 +12239rvaqp43gddtgfsdxucm2 swarm-worker Ready Active 24.0.2 + +``` + +## Deploy with persistent storage + +To be able to deploy a service with persistent storage, you need to have a shared volume on the `swarm-workers`. So the Swarm service could move the resources between the `swarm-workers`. + +You can always use services like AWS EFS, NFS, GlusterFS, etc. + +> WIP diff --git a/src/content/docs/knowledge-base/domains.mdx b/src/content/docs/knowledge-base/domains.mdx new file mode 100644 index 0000000..a4f55f6 --- /dev/null +++ b/src/content/docs/knowledge-base/domains.mdx @@ -0,0 +1,27 @@ +--- +title: Domains +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to add domains to Coolify" +description: "A guide on how to add domains to Coolify" +--- + +You can easily add your own domains to Coolify or your resources. + +All domain fields are capable to generate your proxy configurations based on the following rules: + +1. You need to use FQDN (Fully Qualified Domain Name) format: `https://coolify.io` +2. You can give multiple domains, separated by comma: `https://coolify.io,https://www.coolify.io` +3. You can also add a port to the domain, so the proxy will know which port you would like to map to the domain: `https://coolify.io:8080,http://api.coolify.io:3000` + +## Wildcard Domain + +You can set a wildcard domain (`example: http://example.com`) to your server, so you can easily assign generated domains to all the resources connected to this server. [More details](/docs/knowledge-base/server/introduction#wildcard-domain) + +## DNS Validation + +Since version `beta.191`, Coolify will validates DNS records for your domains with `1.1.1.1` Cloudflare DNS server. + +If you want to use different DNS server, go to your `Settings` page and change the `DNS Servers` field (comma separated list). diff --git a/src/content/docs/knowledge-base/drain-logs.mdx b/src/content/docs/knowledge-base/drain-logs.mdx new file mode 100644 index 0000000..34d54df --- /dev/null +++ b/src/content/docs/knowledge-base/drain-logs.mdx @@ -0,0 +1,50 @@ +--- +title: Drain Logs +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure drain logs to third-party applications like Axiom or New Relic with Coolify" +description: "A guide how to drain logs to third-party applications like Axiom or New Relic." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +You can drain logs of your deployed services to a third-party applications like [Axiom](https://axiom.co/) or [New Relic](https://newrelic.com). + +> We will support more services in the future, like Signoz, HyperDX, etc. + +## How to enable? + + +1. Enable on your Server + First, you need to enable it on your `Server` settings. + + Go to your `Server` where you want to enable the `Drain Logs` and click on the `Log Drains` tab. + +2. Enable on your Resource + Go to your resource, `Advanced` tab and enable the `Drain Logs` for the resource. + + + + + +## How to configure? +### Axiom + +You need to have a `Dataset` and an `API key` from Axiom. + +More information [here](https://axiom.co/docs). + +## New Relic + +You need to have an `License key` from New Relic. + +More information [here](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#ingest-license-key). + +## Custom FluentBit configuration + +If you know how to configure FluentBit, you can use the `Custom FluentBit configuration` to configure the drain logs. diff --git a/src/content/docs/knowledge-base/environment-variables.mdx b/src/content/docs/knowledge-base/environment-variables.mdx new file mode 100644 index 0000000..898019a --- /dev/null +++ b/src/content/docs/knowledge-base/environment-variables.mdx @@ -0,0 +1,79 @@ +--- +title: "Environment Variables" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use environment variables with Coolify" +description: "A guide how to use environment variables in Coolify." +--- + +You can define environment variables for your resources, and they will be available in your application. + +> Preview Deployments could have different environment variables, so you can test your application as a staging environment for example. + +## Build Time Variables + +If you would like to set environment variables for the build process, you can do by setting `Build Variable` on the UI. + +## Shared Variables + +You could have 3 types of shared variables: + +1. Team Based +2. Project Based +3. Environment Based (production, staging, etc.) + +You can set shared variables on their respective pages. + +Then you can use these variables anywhere. For example: You defined `NODE_ENV` to `production`. + +### Team Based + +You can set them on the `Team` page and use it with `{{team.NODE_ENV}}`. + +### Project Based + +You can set them on the `Projects` page, under the gear icon and use it with `{{project.NODE_ENV}}`. + +### Environment Based + +You can set them on the `Environments` page (select a `Project`), under the gear icon and use it with `{{environment.NODE_ENV}}`. + +## Predefined Variables + +Coolify predefines some variables for you, so you can use them in your application. All you need to do is to add an environment variable like this to your application. + +```bash +# For example, you can use this variable in your application +MY_VARIABLE=$SOURCE_COMMIT +# You will have the commit hash of the source code in your application as an environment variable in MY_VARIABLE +``` + +### `COOLIFY_FQDN` + +Fully qualified domain name(s) of the application. + +### `COOLIFY_URL` + +URL(s) of the application. + +### `COOLIFY_BRANCH` + +Branch name of the source code. + +### `COOLIFY_CONTAINER_NAME` + +Name of the container generated by Coolify. + +### `SOURCE_COMMIT` + +Commit hash of the source code. + +### `PORT` + +If not set: it is set to the `Port Exposes`'s first port. + +### `HOST` + +If not set: it is set to `0.0.0.0`. diff --git a/src/content/docs/knowledge-base/faq.mdx b/src/content/docs/knowledge-base/faq.mdx new file mode 100644 index 0000000..ab5c1c8 --- /dev/null +++ b/src/content/docs/knowledge-base/faq.mdx @@ -0,0 +1,56 @@ +--- +title: FAQ +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Frequently Asked Questions (FAQ) with Coolify" +description: "Here you can find answers to the most common questions, errors and problems." +sidebar: + order: 1 +--- + +## Server + +### Permission denied (publickey). + Error: `Server is not reachable. Reason: root@host.docker.internal: Permission denied (publickey).` + + Your Coolify instance cannot reach the server it is running on. During installation, a public key is generated to `/data/coolify/ssh/keys/id.root@host.docker.internal.pub` and automatically added to `~/.ssh/authorized_keys`. + + If it is not added, you can add it manually by running the following command on your server: + + ```bash + cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >> ~/.ssh/authorized_keys +``` + +### Custom SSH Port + If you would like to use a custom SSH port, you can set it in the `Server` tab of your server. + +If you are self-hosting Coolify, you can simply set it after you installed Coolify on the `localhost` server. + +### Increase Concurrent Builds + If you would like to increase the number of concurrent builds, you can set it in the `Server` tab of your server. + +### Coolify Cloud Public IPs + If you need the public facing IPs to allow inbound connections to your servers, here is an up-to-date list of IPs that you can use to whitelist: + + - https://coolify.io/ipv4.txt + - https://coolify.io/ipv6.txt + +## Cloudflare + +### Configured but application is not reachable. +You need to set your SSL/TLS configuration to at least `Full` in your Cloudflare dashboard. + +Documentation: https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full/ + +### Too many redirections. +You need to set your SSL/TLS configuration to at least `Full` in your Cloudflare dashboard. + +Documentation: https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full/ + + +## Applications + +### How to map a port the server? +If you want to map a port the host system (server), you need to use [Ports Mappings](/docs/knowledge-base/applications#port-mappings) feature. diff --git a/src/content/docs/knowledge-base/git/bitbucket/integration.mdx b/src/content/docs/knowledge-base/git/bitbucket/integration.mdx new file mode 100644 index 0000000..9591ad4 --- /dev/null +++ b/src/content/docs/knowledge-base/git/bitbucket/integration.mdx @@ -0,0 +1,74 @@ +--- +title: "Integration" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure Bitbucket based Git deployments with Coolify" +description: "A guide on how to use Bitbucket based repositories with Coolify." +--- +import { Aside, Steps } from '@astrojs/starlight/components'; + + +This guide will show you how to use Bitbucket based repositories with Coolify. + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://bitbucket.com/coolify-test2/coolify-examples` + + + +1. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your Bitbucket repository in the `Repository Settings` / `Access Keys` menu. + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@bitbucket.org:coolify-test2/coolify-examples.git` + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your Bitbucket repository to trigger a new deployment when you push to your repository. + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your Bitbucket repository. + +1. Set a secret key in the `Bitbucket Webhook Secret` input field. +2. Go to your repository in Bitbucket and open the `Repository Settings` / `Webhooks` menu as `Repository hooks`. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push` option. +5. That's it! Now when you push to your repository, Bitbucket will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your Bitbucket repository to trigger a new deployment when you create a new merge request. + + + +The process is the same as the previous one. In the `Repository Settings` / `Webhooks` menu, you need to select the following events in the `Pull Request` option: + +- `Created` +- `Updated` +- `Merged` +- `Declined` diff --git a/src/content/docs/knowledge-base/git/gitea/integration.mdx b/src/content/docs/knowledge-base/git/gitea/integration.mdx new file mode 100644 index 0000000..6aea527 --- /dev/null +++ b/src/content/docs/knowledge-base/git/gitea/integration.mdx @@ -0,0 +1,75 @@ +--- +title: "Integration" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure Gitea based Git deployments with Coolify" +description: "A guide on how to use Gitea based repositories with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + + +This guide will show you how to use Gitea based repositories with Coolify. + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://gitea.com/heyandras/coolify-examples` + + + +1. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your Gitea repository in the `Repository Settings` / `Access Keys` menu. + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@gitea.com:heyandras/coolify-examples.git` + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your Gitea repository to trigger a new deployment when you push to your repository. + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your Gitea repository. + +1. Set a secret key in the `Gitea Webhook Secret` input field. +2. Go to your repository in Gitea and open the `Repository Settings` / `Webhooks` menu as `Repository hooks`. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push` option. +5. That's it! Now when you push to your repository, Gitea will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your Gitea repository to trigger a new deployment when you create a new merge request. + + + +The process is the same as the previous one. In the `Repository Settings` / `Webhooks` menu, you need to select the following events in the `Pull Request` option: + +- `Created` +- `Updated` +- `Merged` +- `Declined` diff --git a/src/content/docs/knowledge-base/git/github/github-actions.mdx b/src/content/docs/knowledge-base/git/github/github-actions.mdx new file mode 100644 index 0000000..7e8170b --- /dev/null +++ b/src/content/docs/knowledge-base/git/github/github-actions.mdx @@ -0,0 +1,29 @@ +--- +title: "GitHub Actions" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use GitHub Actions with Coolify" +description: "A guide on how to use GitHub Actions with Coolify to build and deploy your images." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + + +You can use GitHub Actions to build your image and deploy it to Coolify. + +Here is an [example repository](https://github.com/andrasbacsai/github-actions-with-coolify) and a [workflow file](https://github.com/andrasbacsai/github-actions-with-coolify/blob/main/.github/workflows/build.yaml) that you can check how it works. + +## Process Overview + +1. You need to create a [GitHub Action workflow](https://github.com/andrasbacsai/github-actions-with-coolify/blob/main/.github/workflows/build.yaml) file in your repository. +2. You need to build your image and push it to a Docker registry. In the example, I use ghcr.io, but you can use any other registry. +3. You need to create a [Coolify API Token](/docs/api-reference/authorization) and add it to your GitHub repository secrets. + - `COOLIFY_TOKEN` in the example. +4. In Coolify, you need to setup your deployment type. It could be a simple Dockerfile, Docker Compose or Docker Image based deployment. +5. Get the proper webhook endpoint from Coolify (Your resource / `Webhook` menu) and add it to your GitHub repository secrets. + - `COOLIFY_WEBHOOK` in the example. +6. Need to send a GET request to that webhook endpoint (authenticated with the token) to trigger the deployment + - Example: `curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}'` +7. That's it! Now you can push to your repository and the deployment will be triggered automatically. diff --git a/src/content/docs/knowledge-base/git/github/integration.mdx b/src/content/docs/knowledge-base/git/github/integration.mdx new file mode 100644 index 0000000..67c9e10 --- /dev/null +++ b/src/content/docs/knowledge-base/git/github/integration.mdx @@ -0,0 +1,89 @@ +--- +title: "Integration" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use GitHub based Git deployments." +description: "A guide on how to use GitHub based repositories with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + + +This guide will show you how to use GitHub based repositories with Coolify. + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://github.com/coollabsio/coolify-examples` + + + +3. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +### With GitHub App (Recommended) + +You can use private repositories with the GitHub App integration. You will get full integration with GitHub, like automatic commit deployments and pull request deployments. + +1. Create a new GitHub App in the `Sources` view. +2. Create a new resource and select the `Private Repository (with GitHub App)`. +3. Choose your repository from the list. +4. That's it! + +### With Deploy Keys + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your GitHub repository in the `Settings` / `Deploy Keys` menu. + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@github.com:coollabsio/coolify-examples.git` + + + +4. That's it! + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitHub repository to trigger a new deployment when you push to your repository. + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your GitHub repository. + +1. Set a secret key in the `GitHub Webhook Secret` input field. +2. Go to your repository on GitHub and open the `Settings` / `Webhooks` menu. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push events` option. +5. That's it! Now when you push to your repository, GitHub will send a webhook request to Coolify and it will trigger a new deployment. + +## Pull request deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitHub repository to trigger a new deployment when you create a new merge request. + + + +The process is the same as the previous one, but you need to select the `Pull Request` events option in the `Settings` / `Webhooks` menu. diff --git a/src/content/docs/knowledge-base/git/gitlab/integration.mdx b/src/content/docs/knowledge-base/git/gitlab/integration.mdx new file mode 100644 index 0000000..c41b280 --- /dev/null +++ b/src/content/docs/knowledge-base/git/gitlab/integration.mdx @@ -0,0 +1,66 @@ +--- +title: "Integration" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use Gitlab based Git deployments" +description: "A guide on how to use GitLab based repositories with Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://gitlab.com/andrasbacsai/coolify-examples` + {" "} +3. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your GitLab repository in the `Settings` / `Repository` / `Deploy Keys` menu. + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@gitlab.com:andrasbacsai/coolify-examples.git` + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitLab repository to trigger a new deployment when you push to your repository. + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your GitLab repository. + +1. Set a secret key in the `GitLab Webhook Secret` input field. +2. Go to your repository in GitLab and open the `Settings` / `Webhooks` menu. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push events` option. +5. That's it! Now when you push to your repository, GitLab will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitLab repository to trigger a new deployment when you create a new merge request. + + + +The process is the same as the previous one, but you need to select the `Merge request events` option in the `Settings` / `Webhooks` menu. diff --git a/src/content/docs/knowledge-base/health-checks.mdx b/src/content/docs/knowledge-base/health-checks.mdx new file mode 100644 index 0000000..1aebe70 --- /dev/null +++ b/src/content/docs/knowledge-base/health-checks.mdx @@ -0,0 +1,22 @@ +--- +title: Health checks +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Configure health checks for your application" +description: "A guide to configure health checks for your application with Coolify." +--- + +Health checks are important, but not mandatory for your application. It is a way to check if your application is started properly. Coolify provides a way to configure health checks for your application. + +## How it works + +If you set a health check, Coolify (and integrated proxy) will check the health of your application by sending a request to the health check endpoint. + +The integrated proxy only forwards the request to your application if the health check is successful. If the health check fails, the proxy will return a 502 Bad Gateway error. + +## What if I do not set a health check? + +You get a warning next to your application's status. It is not mandatory, but it is recommended to set a health check. +The integrated proxy will forward the request to your application without checking the health. diff --git a/src/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx b/src/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx new file mode 100644 index 0000000..5c6ddd7 --- /dev/null +++ b/src/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx @@ -0,0 +1,137 @@ +--- +title: "Load Balancing on Hetzner" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a loadbalanced application with Coolify on Hetzner" +description: "Here you can find the documentation for deploying a loadbalanced application with Coolify on Hetzner." +--- +import { Steps, Aside } from '@astrojs/starlight/components'; + +Hetzner Cloud is a cloud hosting provider that offers a wide range of services. In this guide, we will show you how to deploy a load-balanced application with Coolify on Hetzner Cloud. + +## Introduction + +Your application is growing, and you need to scale it. One of the most common ways to scale an application is to use a load balancer. A load balancer distributes incoming traffic across multiple servers, ensuring that no single server is overwhelmed. This can help improve the performance and reliability of your application. + +In this guide, we will show you how to deploy a load-balanced application with Coolify on Hetzner Cloud. We will use two (or more) servers to host our application and a load balancer to distribute incoming traffic. We will also show you how to set up a database server if you need one. + + + +## Requirements + +- A domain name managed by Hetzner Cloud +- 2 (or more) servers on Hetzner Cloud +- A load balancer on Hetzner Cloud +- Firewall rules to restrict access to your servers +- Optional: A database server on Hetzner Cloud + +## Steps + + +1. Buy Servers + First, you need to buy two (or more) servers on Hetzner Cloud. You can choose the server type and location based on your requirements. Make sure to choose servers with enough resources to run your application. + + ## Important + Make sure you create and attach a private network to your servers. This will allow your servers to communicate with each other using a private network. + + If you don't have an account on Hetzner Cloud, you can sign up with this [referral link](https://coolify.io/hetzner). + +2. Add & validate them in Coolify + Once you have bought the servers, you need to add them to Coolify. You can do this by clicking on the `Add Server` button in the Coolify dashboard and following the instructions. + + Coolify will automatically install the necessary software on your servers. + +3. Optional: Deploy your database + It is preferable to have a separate database server for your application. Not just for performance reasons, but also for security reasons. Also in this way you can connect your applications to a centralized database server. + + Skip this step if you don't need a database server or if you already have one hosted elsewhere. + + Once you have bought the database server, and added it to Coolify, deploy your preferable database type (MySQL, PostgreSQL, etc.) on it. + + ## Important + + Make sure you set the `Ports Mappings` correctly to allow your application servers to connect to the database server. + + - PostgreSQL: `5432:5432` + - MySQL: `3306:3306` + - MariaDB: `3306:3306` + - MongoDB: `27017:27017` + +4. Deploy your applications + Now it's time to deploy your application on the app servers. Details of deploying your application will depend on the type of application you are deploying. + + With Coolify, you can attach more than one server to the same application. This will allow you to deploy your application on multiple servers. + + ## Important + + Make sure you set the `Ports Mappings` correctly to forward your application ports to the public IP address of the server. + + If your application uses a database, make sure you update the database connection string to point to the database server. + + + Test if your application is working correctly by accessing the public IP address and port of the server in your browser. + +5. Add & configure the loadbalancer + Now it's time to add a load balancer to distribute incoming traffic across your servers. + + This loadbalancer will do the following: + - Distribute incoming traffic across your servers + - Terminates TLS connections (makes your application secure with HTTPS and forwards the traffic to your servers over HTTP) + - Health checks your servers and routes traffic to healthy servers + + Your application is running on `port 8000` on both servers and you have a domain name `example.com`. + + 1. Go to the Hetzner Cloud Console and click on `Load Balancers` in the left sidebar. + 2. Click on the `Create Load Balancer` button. + 3. Select a region where your servers are located. + 4. Select the private network that you have created for your servers. + 5. Select all servers in the targets section. **Important: `(use the private network)`.** + 6. In the services, delete the default service and add a `TLS Termination` predefined service. + 7. As `Destination Port` enter `8000` (source port should be `443`). + 8. Add a certificate for your domain name. It will generate a certificate for your domain name using Let's Encrypt. + 9. In the `health check` section, configure the health check endpoint to your application health check endpoint. (just an endpoint that returns `200 OK`). + 10. Optional: Sticky sessions can be enabled, which will make sure that a user is always routed to the same server for a time period, otherwise, the load balancer will distribute the traffic randomly across your servers. + 11. Choose an algorithm. + 12. And finally name your load balancer and click on `Create & Buy now`. + + Wait for the load balancer to be created and healthy. Once it's healthy, you can check if your application is accessible via the loadbalancer's IP address. + +6. Setup DNS + Now it's time to point your domain name to the `load balancer's IP address`. You can do this by adding an `A` record to your domain name provider's DNS settings. + + 1. Go to your DNS settings. + 2. Add an `A` record with the domain name and the value of the load balancer's IP address. + 3. Save the changes and wait for the DNS changes to propagate. + + Once the DNS changes have propagated, you should be able to access your application using your domain name. + +7. Setup Firewall + Hetzner Cloud offers a firewall feature that allows you to restrict access to your servers. We will use this feature to restrict access to your servers. + + As the load balancer communicates with your servers over the private network, we only need to add rules for the public IP addresses. + + The `Inbound` rules includes everything that is allowed. Everyting else is blocked by default. + + 1. Go to the Hetzner Cloud Console and click on `Firewalls` in the left sidebar. + 2. Click on the `Create Firewall` button. + 3. Add SSH access rule for your IP address to the `Inbound` rules. + 4. Add your servers to the `Apply rule` section. + 5. Name your firewall and click on `Create Firewall`. + + + + diff --git a/src/content/docs/knowledge-base/how-to/wordpress-multisite.mdx b/src/content/docs/knowledge-base/how-to/wordpress-multisite.mdx new file mode 100644 index 0000000..13a47fa --- /dev/null +++ b/src/content/docs/knowledge-base/how-to/wordpress-multisite.mdx @@ -0,0 +1,45 @@ +--- +title: "Using WordPress Multisite with Coolify" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure WordPress Multisite with Coolify" +description: "Here you can find the documentation for configuring WordPress Multisite with Coolify." +--- +import { Steps } from '@astrojs/starlight/components'; + +## Introduction + + +1. Add Wordpress with one-click installation + Add a Wordpress service with the one-click installation feature in Coolify. + +2. Persist Wordpress files on the host machine + Change the following lines in your `docker-compose.yml` file from the UI to persist the Wordpress files on the host machine: + ```yaml + volumes: + - "wordpress-files:/var/www/html" + ``` + to: + ```yaml + volumes: + - "./wordpress:/var/www/html" + ``` + This will mount the `wordpress` directory in the default configuration directory (`/data/coolify/services//`) to the `/var/www/html` directory in the container. This way, you can edit the files on your host machine and see the changes reflected in the container. + +3. Configure Wordpress + Start the Wordpress service and configure it as you wish. + +4. Disable all plugins + - Go to your Wordpress admin panel. + - Go to `Plugins` -> `Installed Plugins`. + - Select all plugins and choose `Deactivate` from the dropdown menu. + +5. Enable Multisite + Open your `wp-config.php` file on the server and add the following lines: + ```php + define( 'WP_ALLOW_MULTISITE', true ); + ``` + Refresh your WordPress panel in your browser. You should now see a new menu item called `Network Setup` under the `Tools` menu. + diff --git a/src/content/docs/knowledge-base/monitoring.mdx b/src/content/docs/knowledge-base/monitoring.mdx new file mode 100644 index 0000000..1c2c5dd --- /dev/null +++ b/src/content/docs/knowledge-base/monitoring.mdx @@ -0,0 +1,18 @@ +--- +title: Monitoring +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How the built-in monitoring system works in Coolify" +description: "A guide on how the built-in monitoring system works in Coolify" +--- + +Coolify has a built-in monitoring system, which can be used to monitor your resources and send notifications to your team if something goes wrong. + +Currently Coolify monitors the following resources: + +- Disk usage - If your disk usage is above the configured threshold, it does an automatic cleanup. +- If any of your containers are stopped or restarted. +- Backup status. + diff --git a/src/content/docs/knowledge-base/notifications.mdx b/src/content/docs/knowledge-base/notifications.mdx new file mode 100644 index 0000000..20d3d5a --- /dev/null +++ b/src/content/docs/knowledge-base/notifications.mdx @@ -0,0 +1,49 @@ +--- +title: Notifications +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How the built-in notification system works in Coolify" +description: "A guide on how the built-in notification system works in Coolify" +--- + +## Notifications + +You can set up several types of notifications. Each team could have different notification settings. + +### Email + +Email notifications requires you to set up an SMTP server or supported service (Resend). + +#### System Wide (transactional) + +If you self-host Coolify, you can set up a system-wide SMTP server in the **Settings** menu. + +#### Team Wide + +To setup notifications, go to the **Team** tab and click on **Notifications** and then **Email**. + +If you have a System Wide Email settings, you can enable to use it for the team. Otherwise, you can set up a custom SMTP server/Resend for the team. + +### Telegram + +You need to create a bot token on Telegram. You can do that by talking to the [BotFather](https://t.me/botfather). + +More information on how to create a bot token can be found [here](https://core.telegram.org/bots/tutorial). + +> You can add your new bot to a group chat, so you can share these notifications with your team. + +### Discord + +You only need to add a Discord webhook endpoint to receive notifications. + +More information on how to create a webhook can be found [here](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). + +### Events + +You can subscribe to the following events: + +- Container Status Changed (Stopped, Started, Restarted). +- Application Deployments (Finished, Failed). +- Backup Status (Finished, Failed). diff --git a/src/content/docs/knowledge-base/persistent-storage.mdx b/src/content/docs/knowledge-base/persistent-storage.mdx new file mode 100644 index 0000000..a8307bb --- /dev/null +++ b/src/content/docs/knowledge-base/persistent-storage.mdx @@ -0,0 +1,58 @@ +--- +title: "Persistent Storage" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use persistent storage in Coolify" +description: "A guide how to use persistent storage in Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +You could add persistent storage to your resources, so you can preserve your data between deployments. + +This persistent storage could be different in different types of Destinations. + +## Docker Engine + +If you are using Docker Engine, persistent storage could be a `volume` or a `bind mount` (a file/directory from the host system - your server). + +### Volume + +To create a volume, you need to define: + +- `Name` of the volume. +- `Destination Path` where the volume will be mounted inside the container. + + + + + +### Bind Mount + +To create a bind mount, you need to define: + +- `Name` of the volume, which will be used as a reference. +- `Source Path` from the host system. **No docker volume created in this case.** +- `Destination Path` where the volume will be mounted inside the container. + + + + diff --git a/src/content/docs/knowledge-base/s3/aws.mdx b/src/content/docs/knowledge-base/s3/aws.mdx new file mode 100644 index 0000000..ffcf2dd --- /dev/null +++ b/src/content/docs/knowledge-base/s3/aws.mdx @@ -0,0 +1,128 @@ +--- +title: "AWS S3" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure AWS S3 bucket in Coolify" +description: "Here you can find the documentation for configuring AWS S3 bucket in Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +# TLDR + +1. Create a bucket in AWS Console +2. Create a custom policy in AWS Console with the following permissions: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetObject", + "s3:DeleteObject", + "s3:GetObjectAcl", + "s3:PutObjectAcl", + "s3:PutObject" + ], + "Resource": [ + // rewrite your-bucket-name with your bucket name + "arn:aws:s3:::your-bucket-name", + "arn:aws:s3:::your-bucket-name/*" + ] + } + ] +} +``` + +3. Create an IAM user in AWS Console & attach the policy from the previous step. +4. Go to User settings & create an `Access Key` in AWS Console. +5. Add the `Access Key` and `Secret Key` in Coolify when you create a new S3 source. + + +# Detailed steps + +### Create a bucket + + +1. Create a bucket in AWS Console + Go to [AWS Console](https://us-east-1.console.aws.amazon.com/s3/buckets) and + create a new bucket. ![1](../../../../assets/images/aws-s3/1-bucket.jpeg) +2. Name your bucket. + ![2](../../../../assets/images/aws-s3/2-bucket.jpeg) + + +### Create a new policy + + +1. Create a new policy. + Go to [AWS Console](https://us-east-1.console.aws.amazon.com/iam/home) and create a new policy. + ![1](../../../../assets/images/aws-s3/1-policy.jpeg) +2. Name & configure your policy. + Add the following JSON permissions to your policy (replace `your-bucket-name` with your bucket name): + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetObject", + "s3:DeleteObject", + "s3:GetObjectAcl", + "s3:PutObjectAcl", + "s3:PutObject" + ], + "Resource": [ + "arn:aws:s3:::your-bucket-name", + "arn:aws:s3:::your-bucket-name/*" + ] + } + ] + } + ``` + ![2](../../../../assets/images/aws-s3/2-policy.jpeg) + ![3](../../../../assets/images/aws-s3/3-policy.jpeg) + + +### Create a new IAM user + + +1. Create a new IAM User. + Go to [AWS Console](https://us-east-1.console.aws.amazon.com/iam/home) and + create a new user. ![1](../../../../assets/images/aws-s3/1-iam.jpeg) +2. Name your user. + ![2](../../../../assets/images/aws-s3/2-iam.jpeg) +3. Attach the policy created in the previous step. + ![3](../../../../assets/images/aws-s3/3-iam.jpeg) +4. Go to your user settings. + ![4](../../../../assets/images/aws-s3/4-iam.jpeg) +5. Create a new `Access Key`. + ![5](../../../../assets/images/aws-s3/5-iam.jpeg +6. Set `Other` as use-case. + ![6](../../../../assets/images/aws-s3/6-iam.jpeg) +7. Copy the `Access Key` & `Secret Access Key`. + You will need it to configure this S3 storage in Coolify. + ![7](../../../../assets/images/aws-s3/7-iam.jpeg) + + +### Configure S3 in Coolify + + +1. Add new S3 Storage. + Go to your Coolify instance and create a new S3 storage. + ![1](../../../../assets/images/aws-s3/1-coolify.jpeg) +2. Add the details. + Make sure you use the S3 HTTP endpoint without the bucket name. For example, + `https://s3.eu-central-1.amazonaws.com`. ![2](../../../../assets/images/aws-s3/2-coolify.jpeg) + + +Well done! \ No newline at end of file diff --git a/src/content/docs/knowledge-base/s3/index.mdx b/src/content/docs/knowledge-base/s3/index.mdx new file mode 100644 index 0000000..cfbd762 --- /dev/null +++ b/src/content/docs/knowledge-base/s3/index.mdx @@ -0,0 +1,31 @@ +--- +title: "Introduction" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure S3 compatible storage for Coolify" +description: "A guide how to configure S3 compatible storage for Coolify." +--- + +Currently supported S3 compatible storages are: + +- AWS +- DigitalOcean Spaces +- MinIO +- Cloudflare's R2 +- Backblaze B2 +- Scaleway Object Storage + +Other's could work, but not tested yet. If you test it, please let us know. + +## S3 Client + +Coolify uses MinIO's client, called [`mc`](https://min.io/docs/minio/linux/reference/minio-mc.html), to copy the backup files to your S3 compatible storage. + +## Verification + +To be able to use your S3 compatible storage, you need to verify it first. Verification done with `ListObjectsV2` request to your specified bucket. + +So you need to create a bucket first, and then you can verify it. + diff --git a/src/content/docs/knowledge-base/s3/r2.mdx b/src/content/docs/knowledge-base/s3/r2.mdx new file mode 100644 index 0000000..d23105d --- /dev/null +++ b/src/content/docs/knowledge-base/s3/r2.mdx @@ -0,0 +1,24 @@ +--- +title: "Cloudflare R2" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure Cloudflare R2 bucket in Coolify" +description: "Here you can find the documentation for configuring Cloudflare R2 bucket in Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +Cloudflare R2 is an S3 compatible storage. You can use it with Coolify to store your backups. + +# Configuration + +1. You need to create a bucket first in the Cloudflare R2 dashboard. +2. Then you need to create a R2 API token with `Object Read & Write` permission. +3. You can find the S3 client credentials when the token is created. + +4. You can use the details from the previous step to configure Coolify. diff --git a/src/content/docs/knowledge-base/self-hosted-admin/delete-user.mdx b/src/content/docs/knowledge-base/self-hosted-admin/delete-user.mdx new file mode 100644 index 0000000..2e827cd --- /dev/null +++ b/src/content/docs/knowledge-base/self-hosted-admin/delete-user.mdx @@ -0,0 +1,48 @@ +--- +title: Delete User +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Delete User" +description: "How to delete a user from the self-hosted Coolify instance." +--- + +import { Aside } from '@astrojs/starlight/components'; + +This guide will show you how to delete a user from the self-hosted Coolify instance. + + + +Only users who are in the `root` team can delete users from the UI. + +- Go to the `Team` page. +- Switch to `Admin View` tab. + +Here you can see all the users registered in Coolify. Click on the `Delete` button next to the user you want to delete. + +## Deletion process + + + +Coolify iterate over all the teams of a user and decide of the followings: + +### The user is alone in the team + +The team and all resources from the server and from Coolify's database are deleted. + +### The user is not alone in the team + +1. The user is the owner/admin of the team and no other owners/admins found, but the team **has members**: + - The ownership is transferred to the first user in the team who is not the owner/admin. + - The user is removed from the team. No resources are deleted. + +2. The user is the owner/admin of the team and no other owners/admins found, but the team has **no members**: + - The team and all resources from the server and from Coolify's database are deleted. + +3. The user is not the owner/admin of the team: + - The user is removed from the team. No resources are deleted. diff --git a/src/content/docs/knowledge-base/self-update.mdx b/src/content/docs/knowledge-base/self-update.mdx new file mode 100644 index 0000000..ec92507 --- /dev/null +++ b/src/content/docs/knowledge-base/self-update.mdx @@ -0,0 +1,47 @@ +--- +title: "Self-update" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure instance updates for Coolify (self-hosted)" +description: "An overview of the update settings for Coolify." +--- + +Within the `Settings` page, you can configure the update settings for your Coolify instance. + +## How it works + +By default Coolify checks for updates periodically based on the cron syntax that is provided. + +These settings are split in to two categories: + +- **Update Check Frequency**: Cron expression for update check frequency (check for new Coolify versions and pull new Service Templates from CDN). Default is every hour. +- **Auto Update Frequency**: Cron expression for auto update frequency (automatically update coolify). Default is every day at 00:00 + +By default on self hosted instances the `Auto Update Enabled` should be preticked. + +## Cron Syntax + +The cron syntax supports the base cron syntax as well as the following strings: + +```js +const VALID_CRON_STRINGS = [ + 'every_minute' => '* * * * *', + 'hourly' => '0 * * * *', + 'daily' => '0 0 * * *', + 'weekly' => '0 0 * * 0', + 'monthly' => '0 0 1 * *', + 'yearly' => '0 0 1 1 *', +]; +``` + +## Update Check Frequency + +This setting is used to check for new Coolify versions and pull new Service Templates from the CDN. The default value is every hour. + +Please note that disabling `Auto Update Enabled` will not disable the update check frequency, meaning you can control when to update Coolify. + +## Auto Update Frequency + +This setting is used to automatically update Coolify. The default value is every day at 00:00. diff --git a/src/content/docs/knowledge-base/server/automated-cleanup.mdx b/src/content/docs/knowledge-base/server/automated-cleanup.mdx new file mode 100644 index 0000000..57971c0 --- /dev/null +++ b/src/content/docs/knowledge-base/server/automated-cleanup.mdx @@ -0,0 +1,26 @@ +--- +title: "Automated Cleanup" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How automated cleanups work in Coolify" +description: "A guide on how automated cleanups work in Coolify" +--- + +Coolify automatically cleans up your servers to prevent them from running out of disk space. It will remove all the unused Docker images, containers, and volumes. + +## How it works + +- Coolify will run the cleanup script every 10 minutes. +- If there is an ongoing deployment, the cleanup script will be skipped - to prevent any issues, like deleting the image that is currently being used. +- The cleanup script will remove all the unused Docker images, containers, and volumes with the following commands: + +```bash +# This will remove all unused Docker images +docker image prune -af +# This will remove all coolify.managed containers that are not running +docker container prune -f --filter "label=coolify.managed=true" +# This will remove all unused Docker build caches +docker builder prune -af +``` diff --git a/src/content/docs/knowledge-base/server/build-server.mdx b/src/content/docs/knowledge-base/server/build-server.mdx new file mode 100644 index 0000000..99f7990 --- /dev/null +++ b/src/content/docs/knowledge-base/server/build-server.mdx @@ -0,0 +1,40 @@ +--- +title: "Build Server" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use a build server with Coolify" +description: "A guide on how to use a build server with Coolify" +--- + +import { Aside } from '@astrojs/starlight/components'; + + + +You could have a build server to build your projects on instead of building them on the server where you host your resources. + +This keeps the load separated, so it does not affect your application's performance. + +## Requirements + +- The built images needs to be pushed to a container registry. +- The server needs to be authenticated to the container registry. See [this](/docs/knowledge-base/docker/registry) for more information. +- The server needs to have access to the source code. +- The server needs Docker Engine installed. +- The server should be the same architecture as the deployment servers. + +If you have more than one build server, the used server will be chosen randomly. + +## How to use + +1. Add a new server to Coolify. +2. Enable the `Build Server` feature while creating a new resource. + +After this, Coolify will use this server to build your resources, in case you enabled the `Build Server` feature for them. + +## How to set a build server for a resource + +1. Create or go to a resource that you want to use a build server for. +2. Enable the `Build Server` feature on the `General` tab, `Build` section. +3. Make sure you set up a container registry for the resource. diff --git a/src/content/docs/knowledge-base/server/firewall.mdx b/src/content/docs/knowledge-base/server/firewall.mdx new file mode 100644 index 0000000..31db596 --- /dev/null +++ b/src/content/docs/knowledge-base/server/firewall.mdx @@ -0,0 +1,38 @@ +--- +title: "Firewall" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "What firewall rules are required for Coolify" +description: "A list of ports that need to be open on your firewall for Coolify to work properly." +--- + +import { Aside } from '@astrojs/starlight/components'; + +## Self-hosted version + +For self-hosting Coolify, you need to allow some ports on your firewall. + +- For Coolify: `8000` (http), `6001` (websocket) and `22` (SSH, or a custom port) (required) + + + +- Reverse Proxy: `80, 443` (optional) + + + +- For GitHub integration, check [this](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses). + +## Cloud version + +If you need the public facing IPs to allow inbound connections to your servers, here is an up-to-date list of IPs that you can use to whitelist: + +- https://coolify.io/ipv4.txt +- https://coolify.io/ipv6.txt diff --git a/src/content/docs/knowledge-base/server/introduction.mdx b/src/content/docs/knowledge-base/server/introduction.mdx new file mode 100644 index 0000000..ee28547 --- /dev/null +++ b/src/content/docs/knowledge-base/server/introduction.mdx @@ -0,0 +1,108 @@ +--- +title: "Introduction" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "What kind of servers can I connect to Coolify?" +description: "A guide to help you understand what kind of servers you can connect to Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +No matter what type of server you have (localhost or remote), you need the following requirements. + +- Connectivity + + - SSH connectivity between Coolify and the server with SSH key authentication. + + + +- Docker Engine (24+) + +## Types + +- **Localhost**: the server where Coolify is installed. +- **Remote Server**: could be any remote linux server. + +## Localhost + +To be able to manage the server where Coolify is running on, the docker container of Coolify should reach the host server through SSH. + +You can use localhost as a server where all your resources are running, but it is not recommended as high server usage could prevent to use Coolify. + + + +## Remote Server + +You can connect any type of servers to Coolify. It could be a VPS, a Raspberry PI or a laptop running Linux. + + + +### Cloudflare Tunnels + +You can also set to use Cloudflare Tunnels for your servers. + + + +## Features + +### Disk Cleanup threshold + +You can set a threshold in % for your / filesystem. If this percentage is reached, Coolify tries to cleanup a lot of unnecessary files from your server. + +- Unused Docker Images (`docker image prune -af'`) +- Unused Docker Build Images (`docker builder prune -af`) +- Stopped Docker Containers deployed by Coolify (`docker container prune -f --filter "label=coolify.managed=true"`) + +### Wildcard Domain + +You can set a wildcard domain (`example: http://example.com`) to your server, so you can easily assign generated domains to all the resources connected to this server. + +Example: Your application UUID is `vgsco4o`. + +If you have the example set, you will get the following FQDN: `http://vgsco4o.example.com` + +If you do not have any wildcard domain set, Coolify will generate a [sslip.io](https://sslip.io) domain, which is free & magical domain that you can use anywhere. + +In this case, it will be: `http://vgsco4o.127.0.0.1.sslip.io`, where `127.0.0.1` is your server's IP. + +## Proxy + +- **Traefik**: Automatically configure Traefik(v2) based on your deployed resources. +- **Custom/None**: You will configure a proxy manually (only for advanced users). + + + +### Traefik + +Coolify uses Traefik proxy by default to create a reverse proxy for your resources. + + + +#### Dynamic Configuration + +You can always add your own configuration to the proxy settings from Coolify's UI (`/server//proxy`). diff --git a/src/content/docs/knowledge-base/server/multiple-servers.mdx b/src/content/docs/knowledge-base/server/multiple-servers.mdx new file mode 100644 index 0000000..08aa9c2 --- /dev/null +++ b/src/content/docs/knowledge-base/server/multiple-servers.mdx @@ -0,0 +1,57 @@ +--- +title: "Multiple Servers" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to deploy a resource to multiple servers with Coolify" +description: "A guide on how to deploy a resource to multiple servers with Coolify" +--- + +import { Aside } from '@astrojs/starlight/components'; + + + +With this feature, You could deploy the same application to multiple servers, add a load balancer in front of them and you will get a highly available application. + +## Requirements + +- Each server should be added to Coolify, validated and reachable. +- Each server (and the optional build server) should be the same architecture (AMD64, ARM). +- You must push the built image to a Docker Registry. Coolify automates the process, you just need to [login to the registry](/docs/knowledge-base/docker/registry#docker-credentials) on the server. + +## How to use? + +When you configure (or already configured) an application, you selected a server / network where it deploys. This will be your main server. + +Any additional servers must be set in the `Servers` menu, simply by clicking on it. + +Now everytime you redeploy, restart or stop the application, the action will be done on all servers. + +If the deploy needs a build process, it will be executed on the main server (or on the build server if you have on). The deploy process will upload the built image to the Docker Registry and only after all other servers will be notified to pull and deploy this image. + +## How to configure a loadbalancer? + +At the moment, it is not automated. So you have to manually setup a loadbalancer. There are two ways to use. + +### Port mapping to host + +If you set `Ports Mappings` for your application, so one port from the docker container will mapped to a port on the host server, all you need to do is to: + +1. Set all the `IP:PORT` as a destination in your loadbalancer. +2. Remove any domains from the `Domains` field in Coolify. + +In this case, Coolify Proxy is not used as you can reach the application with IP:PORT + + + +### Using a domain + +In this case, you need to set the **loadbalancer domain with HTTP, (not HTTPS)** in the `Domains` field, and then set the proper configuration for your loadbalancer, with SSL termination. + +With this configuration, you can use several domains with one loadbalancer. diff --git a/src/content/docs/knowledge-base/server/non-root-user.mdx b/src/content/docs/knowledge-base/server/non-root-user.mdx new file mode 100644 index 0000000..788c300 --- /dev/null +++ b/src/content/docs/knowledge-base/server/non-root-user.mdx @@ -0,0 +1,38 @@ +--- +title: "Non-root user" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to use a server with a non-root user" +description: "A guide on how to use a server with a non-root user" +--- + +import { Aside } from '@astrojs/starlight/components'; + + + +You could have a server with a non-root user that will manage your resources instead of the root user. + +For this to work, you need to set up the server correctly. + +## Requirements + +- The non-root user needs to have the SSH key added to the server. +- Sudos permissions for the non-root user. + +## Sudo permissions + +You need to add the following lines to the `/etc/sudoers` file: + +```bash +# Allow the non-root user to run commands as root without a password +non-root-user ALL=(ALL) NOPASSWD: ALL +``` + +This will allow the non-root user to any command as root without a password. + + diff --git a/src/content/docs/knowledge-base/server/openssh.mdx b/src/content/docs/knowledge-base/server/openssh.mdx new file mode 100644 index 0000000..66356ec --- /dev/null +++ b/src/content/docs/knowledge-base/server/openssh.mdx @@ -0,0 +1,110 @@ +--- +title: "OpenSSH" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure OpenSSH for Coolify." +description: "A guide to configure OpenSSH for Coolify." +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +Coolify uses SSH to connect to your server and deploy your application, even if you are using only the `localhost` server - where Coolify is running on. + +To validate your configuration, make sure the followings are set on your server. + + + + + + +1. SSH Enabled + Make sure SSH is enabled and you can connect to your server with SSH from your local machine with root user. + + ```bash + # Ubuntu/Debian + + sudo apt install openssh-server + sudo systemctl status sshd + + # CentOS/RHEL + + sudo yum install openssh-server + sudo systemctl status sshd + + # Arch Linux + + sudo pacman -S openssh + sudo systemctl status sshd + + # Alpine Linux + + sudo apk add openssh + sudo rc-service sshd status + + # SLES/openSUSE + + sudo zypper install openssh + sudo systemctl status sshd + + ```` +2. Root Login + Make sure `PermitRootLogin` is set to `yes` or `without-password` or `prohibit-password` in `/etc/ssh/sshd_config` file. + + ```bash + # Check the current value + grep PermitRootLogin /etc/ssh/sshd_config + + # If the value is not `yes` or `without-password` or `prohibit-password`, change it and make sure it is not commented out. + # If it is commented out, remove the `#` character at the beginning of the line. + + sudo vi /etc/ssh/sshd_config + + # You can exit the editor by pressing `Esc` and then `:wq` and then `Enter` keys - thank me later. + + # Restart the SSH service + # Ubuntu/Debian/CentOS/RHEL/Arch Linux/SLES/openSUSE + sudo systemctl restart sshd + + # Alpine Linux + sudo rc-service sshd restart + + ```` +3. SSH Key set on the Server + Make sure an SSH key is added to the `~/.ssh/authorized_keys` file. + If you installed Coolify with the automated script, you don't need to do anything else. + + If you installed Coolify manually, you need to add an SSH key to the `~/.ssh/authorized_keys` file. + + + + ```bash + # Create a new SSH key pair ed25519 (recommended) or rsa (legacy) with the following command. + + # The key needs to be created in the `/data/coolify/ssh/keys` directory with, + # id.root@host.docker.internal name, + # no passphrase, + # root@coolify comment. + + ssh-keygen -t ed25519 -a 100 -f /data/coolify/ssh/keys/id.root@host.docker.internal -q -N "" -C root@coolify + chown 9999 /data/coolify/ssh/keys/id.root@host.docker.internal + + # Copy the public key to the `authorized_keys` file + cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >>~/.ssh/authorized_keys + + # Set the correct permissions + chmod 600 ~/.ssh/authorized_keys + chmod 700 ~/.ssh + ``` + +4. SSH Key set in Coolify + Add the private key to Coolify at `Keys & Tokens` menu -> `Private Keys` and set this new key in the localhost server settings. + + \ No newline at end of file diff --git a/src/content/docs/knowledge-base/server/oracle-cloud.mdx b/src/content/docs/knowledge-base/server/oracle-cloud.mdx new file mode 100644 index 0000000..698bd3f --- /dev/null +++ b/src/content/docs/knowledge-base/server/oracle-cloud.mdx @@ -0,0 +1,33 @@ +--- +title: "Oracle Cloud" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "What is required for Oracle Cloud servers to use in Coolify" +description: "A guide to use Oracle Cloud servers in Coolify" +--- + +If you are using `Oracle Cloud free ARM server`, you need to do a few extra steps to use it in Coolify, as a `Coolify instance` or just a `remote server`. + +## Normal user +Non-root user is in `experimental` mode and works with `sudo`. +- Make sure the ssh key is added to the user's `~/.ssh/authorized_keys` file. +- All configuration is set for sudo. Details [here](/docs/knowledge-base/server/non-root-user). + +## Setup Root User + +By default, you can't login as root user. You need to do the following steps to enable root user. + +1. Switch to root user `sudo su -` +2. Edit `/etc/ssh/sshd_config` and change `PermitRootLogin` to `without-password`. +3. Restart ssh service `service sshd restart` +4. Add a public key to `/root/.ssh/authorized_keys` file which is also defined in your Coolify instance. + +## Firewall Rules + +This is only required if you self-host Coolify on Oracle ARM server. + +By default, Oracle ARM server has a firewall enabled and you need to allow some ports to use Coolify. + +For more details, check [this](/docs/knowledge-base/server/firewall) page. diff --git a/src/content/docs/knowledge-base/server/proxies.mdx b/src/content/docs/knowledge-base/server/proxies.mdx new file mode 100644 index 0000000..b1ed3df --- /dev/null +++ b/src/content/docs/knowledge-base/server/proxies.mdx @@ -0,0 +1,31 @@ +--- +title: "Supported Proxy" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "Supported proxies with Coolify" +description: "A guide for Coolify supported proxies." +--- + +import { Aside } from '@astrojs/starlight/components'; + +Coolify supports `Traefik` (default) and `Caddy` (experimental) proxies. + +## Switch between proxies + +Since `beta.237`, we have added support for Caddy and Traefik as proxies. You can switch between them at any time. + +Before you switch proxies and if you have an application that was created before `beta.237`, you need to make sure of the following: + +1. You must have `caddy_*` or `traefik_*` labels on your resources. + + + +2. You need to restart your service so that the new labels will be applied. diff --git a/src/content/docs/knowledge-base/services/activepieces.mdx b/src/content/docs/knowledge-base/services/activepieces.mdx new file mode 100644 index 0000000..f9a22a1 --- /dev/null +++ b/src/content/docs/knowledge-base/services/activepieces.mdx @@ -0,0 +1,29 @@ +--- +title: ActivePieces +head: + - tag: "meta" + attrs: + property: "og:title" + content: How to host ActivePieces with Coolify +description: "Here you can find the documentation for hosting ActivePieces with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![ActivePieces](https://github.com/activepieces/activepieces/assets/1812998/76c97441-c285-4480-bc75-30a0c73ed340) + +## What is ActivePieces + +Your friendliest open source all-in-one automation tool, designed to be extensible through a type-safe pieces framework written in Typescript. + +## Screenshots + +![build](https://github.com/activepieces/activepieces/assets/1812998/e75616ce-7801-45b7-b3fa-eba778bebde3) +![templates](https://github.com/activepieces/activepieces/assets/1812998/2851f96e-3d9c-42b3-b021-b1cc5153df50) + +## Links + +- [The official website โ€บ](https://www.activepieces.com/) +- [GitHub โ€บ](https://github.com/activepieces/activepieces) diff --git a/src/content/docs/knowledge-base/services/appsmith.mdx b/src/content/docs/knowledge-base/services/appsmith.mdx new file mode 100644 index 0000000..3c0c02f --- /dev/null +++ b/src/content/docs/knowledge-base/services/appsmith.mdx @@ -0,0 +1,46 @@ +--- +title: Appsmith +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Appsmith with Coolify" +description: "Here you can find the documentation for hosting Appsmith with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Appsmith](https://raw.githubusercontent.com/appsmithorg/appsmith/release/static/images/appsmith-in-100-seconds.png) + +## What is Appsmith + +Organizations build internal applications such as dashboards, database GUIs, admin panels, approval apps, customer support tools, etc. to help improve their business operations. Appsmith is an open-source developer tool that enables the rapid development of these applications. You can drag and drop pre-built widgets to build UI. Connect securely to your databases & APIs using its datasources. Write business logic to read & write data using queries & JavaScript. + +## Why Appsmith + +Appsmith makes it easy to build a UI that talks to any datasource. You can create anything from simple CRUD apps to complicated multi-step workflows with a few simple steps: + +- Connect Datasource: Integrate with a database or API. Appsmith supports the most popular databases and REST APIs. +- Build UI: Use built-in widgets to build your app layout. +- Write Logic: Express your business logic using queries and JavaScript anywhere in the editor. +- Collaborate, Deploy, Share: Appsmith supports version control using Git to build apps in collaboration using branches to track and roll back changes. Deploy the app and share it with other users. + +## Learning Resources + +- [Documentation](https://docs.appsmith.com?utm_source=github&utm_medium=organic&utm_campaign=readme) +- [Tutorials](https://docs.appsmith.com/getting-started/tutorials?utm_source=github&utm_medium=organic&utm_campaign=readme) +- [Videos](https://www.youtube.com/appsmith?utm_source=github&utm_medium=organic&utm_campaign=readme) +- [Templates](https://www.appsmith.com/templates?utm_source=github&utm_medium=organic&utm_campaign=readme&utm_content=support) + +## Need Help? + +- [Discord](https://discord.gg/rBTTVJp?utm_source=github&utm_medium=organic&utm_campaign=readme) +- [Community Portal](https://community.appsmith.com/?utm_source=github&utm_medium=organic&utm_campaign=readme) +- [support@appsmith.com](mailto:support@appsmith.com) + +## Links + +- [The official website โ€บ](https://www.appsmith.com) +- [GitHub โ€บ](https://github.com/appsmithorg/appsmith) diff --git a/src/content/docs/knowledge-base/services/appwrite.mdx b/src/content/docs/knowledge-base/services/appwrite.mdx new file mode 100644 index 0000000..ec8a4df --- /dev/null +++ b/src/content/docs/knowledge-base/services/appwrite.mdx @@ -0,0 +1,27 @@ +--- +title: Appwrite +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Appwrite with Coolify" +description: "Here you can find the documentation for hosting Appwrite with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Appwrite](https://raw.githubusercontent.com/appwrite/appwrite/main/public/images/banner.png) + +## What is Appwrite? + +Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster. + +Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and +file management, image manipulation, Cloud Functions, and [more services](https://appwrite.io/docs). + +## Links + +- [The official website โ€บ](https://appwrite.io) +- [GitHub โ€บ](https://github.com/appwrite/appwrite) diff --git a/src/content/docs/knowledge-base/services/authentik.mdx b/src/content/docs/knowledge-base/services/authentik.mdx new file mode 100644 index 0000000..3298478 --- /dev/null +++ b/src/content/docs/knowledge-base/services/authentik.mdx @@ -0,0 +1,31 @@ +--- +title: Authentik +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Authentik with Coolify" +description: "Here you can find the documentation for hosting Authentik with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Authentik](https://goauthentik.io/img/icon_top_brand_colour.svg) + +## What is authentik? + +Authentik is an open-source Identity Provider that emphasizes flexibility and versatility. It can be seamlessly integrated into existing environments to support new protocols. authentik is also a great solution for implementing sign-up, recovery, and other similar features in your application, saving you the hassle of dealing with them. + +## Screenshots + +| Light | Dark | +| ----------------------------------------------------------- | ---------------------------------------------------------- | +| ![](https://docs.goauthentik.io/img/screen_apps_light.jpg) | ![](https://docs.goauthentik.io/img/screen_apps_dark.jpg) | +| ![](https://docs.goauthentik.io/img/screen_admin_light.jpg) | ![](https://docs.goauthentik.io/img/screen_admin_dark.jpg) | + +## Links + +- [The official website โ€บ](https://goauthentik.io) +- [GitHub โ€บ](https://github.com/goauthentik/authentik) diff --git a/src/content/docs/knowledge-base/services/babybuddy.mdx b/src/content/docs/knowledge-base/services/babybuddy.mdx new file mode 100644 index 0000000..cc058a2 --- /dev/null +++ b/src/content/docs/knowledge-base/services/babybuddy.mdx @@ -0,0 +1,37 @@ +--- +title: BabyBuddy +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host BabyBuddy with Coolify" +description: "Here you can find the documentation for hosting BabyBuddy with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![BabyBuddy](https://raw.githubusercontent.com/babybuddy/babybuddy/master/babybuddy/static_src/logo/icon.png) + +## What is BabyBuddy? + +A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (_as much_) guess work. + +## Screenshots + +![Baby Buddy desktop view](https://raw.githubusercontent.com/babybuddy/babybuddy/master/screenshot.png) +![Baby Buddy mobile views](https://raw.githubusercontent.com/babybuddy/babybuddy/master/screenshot_mobile.png) + +## Demo + +A [demo of Baby Buddy](https://demo.baby-buddy.net) is available. The demo instance +resets every hour. Login credentials are: + +- Username: `admin` +- Password: `admin` + +## Links + +- [The official website โ€บ](https://docs.baby-buddy.net/) +- [GitHub โ€บ](https://github.com/babybuddy/babybuddy) diff --git a/src/content/docs/knowledge-base/services/budge.mdx b/src/content/docs/knowledge-base/services/budge.mdx new file mode 100644 index 0000000..3029b4a --- /dev/null +++ b/src/content/docs/knowledge-base/services/budge.mdx @@ -0,0 +1,41 @@ +--- +title: BudgE +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host BudgE with Coolify" +description: "Here you can find the documentation for hosting BudgE with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +## What is BudgE? + +BudgE (pronounced "budgie", like the bird) is an open source "budgeting with envelopes" personal finance app, taking inspiration from other tools such as [Aspire Budgeting](https://www.aspirebudget.com/), [budgetzero](https://budgetzero.io/), and [Buckets](https://www.budgetwithbuckets.com/). + +## Current Features + +- Multi user support +- Envelope budgeting with monthly rollover +- Transaction management for accounts +- Standard bank account management +- Credit card management with payment handling +- Tracking accounts +- Export account transactions +- CSV transaction import + +## Screenshots + +![screenshot1](https://raw.githubusercontent.com/linuxserver/budge/main/images/budget.png) +![screenshot2](https://raw.githubusercontent.com/linuxserver/budge/main/images/account.png) + +## Support + +- [Discord](https://discord.gg/hKJWjDqCBz) + +## Links + +- [GitHub โ€บ](https://github.com/linuxserver/budge) diff --git a/src/content/docs/knowledge-base/services/changedetection.mdx b/src/content/docs/knowledge-base/services/changedetection.mdx new file mode 100644 index 0000000..4f2915e --- /dev/null +++ b/src/content/docs/knowledge-base/services/changedetection.mdx @@ -0,0 +1,67 @@ +--- +title: Change Detection +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Change Detection with Coolify" +description: "Here you can find the documentation for hosting Change Detection with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Change Detection](https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/docs/screenshot.png) + +## What is Change Detection? + +Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more. + +Live your data-life pro-actively. + +## Example use cases + +- Products and services have a change in pricing +- _Out of stock notification_ and _Back In stock notification_ +- Monitor and track PDF file changes, know when a PDF file has text changes. +- Governmental department updates (changes are often only on their websites) +- New software releases, security advisories when you're not on their mailing list. +- Festivals with changes +- Discogs restock alerts and monitoring +- Realestate listing changes +- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else +- COVID related news from government websites +- University/organisation news from their website +- Detect and monitor changes in JSON API responses +- JSON API monitoring and alerting +- Changes in legal and other documents +- Trigger API calls via notifications when text appears on a website +- Glue together APIs using the JSON filter and JSON notifications +- Create RSS feeds based on changes in web content +- Monitor HTML source code for unexpected changes, strengthen your PCI compliance +- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product) +- Get notified when certain keywords appear in Twitter search results +- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords. +- Get alerts when new job positions are open on Bamboo HR and other job platforms +- Website defacement monitoring +- Pokรฉmon Card Restock Tracker / Pokรฉmon TCG Tracker +- RegTech - stay ahead of regulatory changes, regulatory compliance + +## Key Features + +- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions! +- Target elements with xPath(1.0) and CSS Selectors, Easily monitor complex JSON with JSONPath or jq +- Switch between fast non-JS and Chrome JS based "fetchers" +- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums) +- Easily specify how often a site should be checked +- Execute JS before extracting text (Good for logging in, see examples in the UI!) +- Override Request Headers, Specify `POST` or `GET` and other methods +- Use the "Visual Selector" to help target specific elements +- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration) +- Send a screenshot with the notification when a change is detected in the web page. + +## Links + +- [The official website โ€บ](https://changedetection.io) +- [GitHub โ€บ](https://github.com/dgtlmoon/changedetection.io) diff --git a/src/content/docs/knowledge-base/services/classicpress.mdx b/src/content/docs/knowledge-base/services/classicpress.mdx new file mode 100644 index 0000000..c2a4da0 --- /dev/null +++ b/src/content/docs/knowledge-base/services/classicpress.mdx @@ -0,0 +1,26 @@ +--- +title: ClassicPress +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host ClassicPress with Coolify" +description: "Here you can find the documentation for hosting ClassicPress with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![ClassicPress](https://raw.githubusercontent.com/ClassicPress/ClassicPress/develop/src/wp-admin/images/classicpress-logo.png) + +## What is ClassicPress? + +ClassicPress is a community-led open source content management system for creators. It is a fork of WordPress 6.2 that preserves the TinyMCE classic editor as the default option. It is half the size of WordPress, contains less bloat improving performance, and has no block editor (Gutenberg/Full Site Editing). + +For more information, see: + +- [The official website โ€บ](https://www.classicpress.net/) +- [The ClassicPress documentation โ€บ](https://docs.classicpress.net/) +- [The ClassicPress governance โ€บ](https://www.classicpress.net/governance/) +- [Suggest features โ€บ](https://github.com/ClassicPress/ClassicPress/issues/) diff --git a/src/content/docs/knowledge-base/services/code-server.mdx b/src/content/docs/knowledge-base/services/code-server.mdx new file mode 100644 index 0000000..b3a6505 --- /dev/null +++ b/src/content/docs/knowledge-base/services/code-server.mdx @@ -0,0 +1,41 @@ +--- +title: Code Server +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Code Server with Coolify" +description: "Here you can find the documentation for hosting Code Server with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Code Server1](https://github.com/coder/code-server/raw/main/docs/assets/screenshot-1.png) +![Code Server2](https://github.com/coder/code-server/raw/main/docs/assets/screenshot-2.png) + +## What is Code Server? + +Run [VS Code](https://github.com/Microsoft/vscode) on any machine anywhere and access it in the browser. + +## Highlights + +- Code on any device with a consistent development environment +- Use cloud servers to speed up tests, compilations, downloads, and more +- Preserve battery life when you're on the go; all intensive tasks run on your server + +## Requirements + +See [requirements](https://coder.com/docs/code-server/latest/requirements) for minimum specs + +**TL;DR:** Linux machine with WebSockets enabled, 1 GB RAM, and 2 vCPUs + +## Questions? + +See answers to [frequently asked questions](https://coder.com/docs/code-server/latest/FAQ). + +## Links + +- [The official website โ€บ](https://coder.com/docs/code-server/) +- [GitHub โ€บ](https://github.com/coder/code-server) diff --git a/src/content/docs/knowledge-base/services/dashboard.mdx b/src/content/docs/knowledge-base/services/dashboard.mdx new file mode 100644 index 0000000..6131cdd --- /dev/null +++ b/src/content/docs/knowledge-base/services/dashboard.mdx @@ -0,0 +1,32 @@ +--- +title: Dashboard +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Dashboard with Coolify" +description: "Here you can find the documentation for hosting Dashboard with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![dashboard](https://github.com/phntxx/dashboard/blob/master/screenshot.png?raw=true) + +## What is Dashboard? + +Dashboard is just that - a dashboard. It's inspired by [SUI](https://github.com/jeroenpardon/sui) and has all the same features as SUI, such as simple customization through JSON-files and a handy search bar to search the internet more efficiently. + +## Features + +So what makes this project different from (or even better than) SUI? + +- "Display URL" functionality (The URL displayed for apps can differ from the actual URL) +- Categorization for apps +- Themes and search providers can be changed using JSON +- Imprint functionality + +## Links + +- [GitHub โ€บ](https://github.com/phntxx/dashboard/) diff --git a/src/content/docs/knowledge-base/services/directus.mdx b/src/content/docs/knowledge-base/services/directus.mdx new file mode 100644 index 0000000..e0794ee --- /dev/null +++ b/src/content/docs/knowledge-base/services/directus.mdx @@ -0,0 +1,43 @@ +--- +title: Directus +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Directus with Coolify" +description: "Here you can find the documentation for hosting Directus with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![directus](https://user-images.githubusercontent.com/522079/158864859-0fbeae62-9d7a-4619-b35e-f8fa5f68e0c8.png) + +## What is Directus? + +Directus is a real-time API and App dashboard for managing SQL database content. + +- **Open Source.** No artificial limitations, vendor lock-in, or hidden paywalls. +- **REST & GraphQL API.** Instantly layers a blazingly fast Node.js API on top of any SQL database. +- **Manage Pure SQL.** Works with new or existing SQL databases, no migration required. +- **Choose your Database.** Supports PostgreSQL, MySQL, SQLite, OracleDB, CockroachDB, MariaDB, and MS-SQL. +- **On-Prem or Cloud.** Run locally, install on-premises, or use our + [self-service Cloud service](https://directus.io/pricing). +- **Completely Extensible.** Built to white-label, it is easy to customize our modular platform. +- **A Modern Dashboard.** Our no-code Vue.js app is safe and intuitive for non-technical users, no training required. + +## Community Help + +[The Directus Documentation](https://docs.directus.io) is a great place to start, or explore these other channels: + +- [Discord](https://directus.chat) (Questions, Live Discussions) +- [GitHub Issues](https://github.com/directus/directus/issues) (Report Bugs) +- [GitHub Discussions](https://github.com/directus/directus/discussions) (Feature Requests) +- [Twitter](https://twitter.com/directus) (Latest News) +- [YouTube](https://www.youtube.com/c/DirectusVideos/featured) (Video Tutorials) + +## Links + +- [The official website โ€บ](https://directus.io) +- [GitHub โ€บ](https://github.com/directus/directus) diff --git a/src/content/docs/knowledge-base/services/dokuwiki.mdx b/src/content/docs/knowledge-base/services/dokuwiki.mdx new file mode 100644 index 0000000..3baf359 --- /dev/null +++ b/src/content/docs/knowledge-base/services/dokuwiki.mdx @@ -0,0 +1,46 @@ +--- +title: DokuWiki +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host DokuWiki with Coolify" +description: "Here you can find the documentation for hosting DokuWiki with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![DokuWiki](https://www.dokuwiki.org/lib/tpl/dokuwiki/images/logo.png) + +## What is DokuWiki? + +DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. + +## Why DokuWiki? + +DokuWiki is a popular choice when choosing a Wiki software and has many advantages over similar software. + +- Easy to install and use +- Low system requirements +- Built-in Access Control Lists +- Large variety of extensions +- Over 50 languages supported +- Device independent +- Open Source + +## Use Cases + +DokuWiki are quick to update and new pages are easily added. Designed for collaboration while maintaining a history of every change, DokuWiki could be used as: + +- Corporate Knowledge Base +- Private notebook +- Software manual +- Project workspace +- CMS โ€“ intranet + +## Links + +- [The official website โ€บ](https://www.dokuwiki.org) +- [GitHub โ€บ](https://github.com/splitbrain/dokuwiki) diff --git a/src/content/docs/knowledge-base/services/duplicati.mdx b/src/content/docs/knowledge-base/services/duplicati.mdx new file mode 100644 index 0000000..b6c4692 --- /dev/null +++ b/src/content/docs/knowledge-base/services/duplicati.mdx @@ -0,0 +1,24 @@ +--- +title: Duplicati +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Duplicati with Coolify" +description: "Here you can find the documentation for hosting Duplicati with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Duplicati](https://docs.duplicati.com/en/latest/duplicatilogo.png) + +## What is Duplicati? + +Free backup software to store encrypted backups online for Windows, macOS and Linux. + +## Links + +- [The official website โ€บ](https://www.duplicati.com/) +- [GitHub โ€บ](https://github.com/duplicati/duplicati) diff --git a/src/content/docs/knowledge-base/services/emby-stat.mdx b/src/content/docs/knowledge-base/services/emby-stat.mdx new file mode 100644 index 0000000..110c48b --- /dev/null +++ b/src/content/docs/knowledge-base/services/emby-stat.mdx @@ -0,0 +1,23 @@ +--- +title: Emby Stat +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Emby Stat with Coolify" +description: "Here you can find the documentation for hosting Emby Stat with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Emby Stat](https://raw.githubusercontent.com/mregni/EmbyStat/develop/branding/logo-color.png) + +## What is Emby Stat? + +EmbyStat is a personal web server that can calculate all kinds of statistics from your (local) Emby or Jellyfin server. Just install this on your server and let him calculate all kinds of fun stuff. + +## Links + +- [The official website โ€บ](https://github.com/mregni/EmbyStat) diff --git a/src/content/docs/knowledge-base/services/emby.mdx b/src/content/docs/knowledge-base/services/emby.mdx new file mode 100644 index 0000000..82c907d --- /dev/null +++ b/src/content/docs/knowledge-base/services/emby.mdx @@ -0,0 +1,46 @@ +--- +title: Emby +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Emby with Coolify" +description: "Here you can find the documentation for hosting Emby with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Emby](https://emby.media/support/images/logo.png) + +## What is Emby? + +Emby is a free personal media server. It is built with a number of popular open source technologies. + +## Requirements + +Windows, Mac, Linux, or FreeBSD computer + +### Minimum Requirements โ€” no transcoding + +- Intel Core 2 Duo processor 1.6 GHz or better +- At least 1GB RAM for Windows/Mac OS X +- At least 512MB RAM for Linux +- Windows: Vista or later +- OS X: MacOS 10.13 or later +- Ubuntu, Debian, Fedora, CentOS or SuSE Linux + +### Recommended Configuration โ€” transcoding HD Content + +- Intel Core 2 Duo processor 2.4 GHz or better +- If transcoding for multiple devices, a faster CPU may be required +- At least 2GB RAM +- Windows: Vista or later +- OS X: MacOS 10.13 or later +- Ubuntu, Debian, Fedora, CentOS or SuSE Linux + +## Community + +- [The official website โ€บ](https://emby.media/) +- [The Emby community โ€บ](https://emby.media/community/) diff --git a/src/content/docs/knowledge-base/services/fider.mdx b/src/content/docs/knowledge-base/services/fider.mdx new file mode 100644 index 0000000..2f55781 --- /dev/null +++ b/src/content/docs/knowledge-base/services/fider.mdx @@ -0,0 +1,23 @@ +--- +title: Fider +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Fider with Coolify" +description: "Here you can find the documentation for hosting Fider with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Fider](https://github.com/getfider/fider/raw/main/etc/homepage.png) + +## What is Fider? + +Fider is a feedback portal for feature requests and suggestions. Give your customers a voice and let them tell you what they need. Spend less time guessing and more time building the right product. + +## Links + +- [The official website โ€บ](https://fider.io/) diff --git a/src/content/docs/knowledge-base/services/filebrowser.mdx b/src/content/docs/knowledge-base/services/filebrowser.mdx new file mode 100644 index 0000000..623803e --- /dev/null +++ b/src/content/docs/knowledge-base/services/filebrowser.mdx @@ -0,0 +1,34 @@ +--- +title: Filebrowser +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Filebrowser with Coolify" +description: "Here you can find the documentation for hosting Filebrowser with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Filebrowser](https://raw.githubusercontent.com/filebrowser/logo/master/banner.png) + +## What is Filebrowser? + +Filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app. + +## Screenshots + +![gif](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif) + +## Demo + +Url: https://demo.filebrowser.org/ + +Credentials: demo/demo + +## Links + +- [The official Filebrowser website โ€บ](https://filebrowser.org/) +- [GitHub โ€บ](https://github.com/filebrowser/filebrowser) diff --git a/src/content/docs/knowledge-base/services/firefly-iii.mdx b/src/content/docs/knowledge-base/services/firefly-iii.mdx new file mode 100644 index 0000000..e042c3c --- /dev/null +++ b/src/content/docs/knowledge-base/services/firefly-iii.mdx @@ -0,0 +1,32 @@ +--- +title: Firefly III +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Firefly III with Coolify" +description: "Here you can find the documentation for hosting Firefly III with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Firefly III](https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png) + +## What is Firefly III? + +"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. Using a bunch of external tools, you can import data. It also has many neat financial reports available. + +Firefly III should give you insight into and control over your finances. Money should be useful, not scary. You should be able to see where it is going, to feel your expenses and to... wow, I'm going overboard with this aren't I? + +But you get the idea: this is your money. These are your expenses. Stop them from controlling you. I built this tool because I started to dislike money. Having money, not having money, paying bills with money, you get the idea. But no more. I want to feel "safe", whatever my balance is. And I hope this tool can help you. I know it helps me. + +## Screenshots + +![Firefly III screenshot](https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/imac-complete.png) + +## Links + +- [The official website โ€บ](https://firefly-iii.org/) +- [GitHub โ€บ](https://github.com/firefly-iii/firefly-iii/) diff --git a/src/content/docs/knowledge-base/services/formbricks.mdx b/src/content/docs/knowledge-base/services/formbricks.mdx new file mode 100644 index 0000000..468319f --- /dev/null +++ b/src/content/docs/knowledge-base/services/formbricks.mdx @@ -0,0 +1,28 @@ +--- +title: Formbricks +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Formbricks with Coolify" +description: "Here you can find the documentation for hosting Formbricks with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Formbricks](https://github.com/formbricks/formbricks/assets/72809645/0086704f-bee7-4d38-9cc8-fa42ee59e004) + +## What is Formbricks? + +Formbricks provides a free and open source surveying platform. Gather feedback at every point in the user journey with beautiful in-app, website, link and email surveys. Build on top of Formbricks or leverage prebuilt data analysis capabilities. + +## Screenshots + +![Formbricks screenshot](https://camo.githubusercontent.com/d66ab4c7e282af440ec47c73c5c730833eb9c75d3bbcd226bf33dcacd9d7014c/68747470733a2f2f6769746875622d70726f64756374696f6e2d757365722d61737365742d3632313064662e73332e616d617a6f6e6177732e636f6d2f3637353036352f3234393434313936372d63636238396561332d383262342d346266322d386432632d3532383732316563333133622e706e67) + +## Links + +- [The official website โ€บ](https://formbricks.com/) +- [GitHub โ€บ](https://github.com/formbricks/formbricks) diff --git a/src/content/docs/knowledge-base/services/ghost.mdx b/src/content/docs/knowledge-base/services/ghost.mdx new file mode 100644 index 0000000..1afc53d --- /dev/null +++ b/src/content/docs/knowledge-base/services/ghost.mdx @@ -0,0 +1,24 @@ +--- +title: Ghost +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Ghost with Coolify" +description: "Here you can find the documentation for hosting Ghost with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Ghost](https://user-images.githubusercontent.com/353959/169805900-66be5b89-0859-4816-8da9-528ed7534704.png) + +## What is Ghost? + +Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members. + +## Links + +- [The official website โ€บ](https://ghost.org/) +- [GitHub โ€บ](https://github.com/TryGhost/Ghost) diff --git a/src/content/docs/knowledge-base/services/gitea.mdx b/src/content/docs/knowledge-base/services/gitea.mdx new file mode 100644 index 0000000..ea78672 --- /dev/null +++ b/src/content/docs/knowledge-base/services/gitea.mdx @@ -0,0 +1,28 @@ +--- +title: Gitea +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Gitea with Coolify" +description: "Here you can find the documentation for hosting Gitea with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Gitea](https://about.gitea.com/gitea-text.svg) + +## What is Gitea? + +Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD. + +## Demo + +- [Demo โ€บ](https://try.gitea.io/) + +## Links + +- [The official website โ€บ](https://gitea.com) +- [GitHub โ€บ](https://github.com/go-gitea/gitea) diff --git a/src/content/docs/knowledge-base/services/glitchtip.mdx b/src/content/docs/knowledge-base/services/glitchtip.mdx new file mode 100644 index 0000000..265aeff --- /dev/null +++ b/src/content/docs/knowledge-base/services/glitchtip.mdx @@ -0,0 +1,24 @@ +--- +title: Glitchtip +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Glitchtip with Coolify" +description: "Here you can find the documentation for hosting Glitchtip with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Glitchtip](https://glitchtip.com/assets/logo-again.svg) + +## What is Glitchtip? + +Track errors, uptime, and performance. An open source reimplementation of Sentry error tracking platform. + +## Links + +- [The official website โ€บ](https://glitchtip.com/) +- [GitHub โ€บ](https://gitlab.com/glitchtip) diff --git a/src/content/docs/knowledge-base/services/grafana.mdx b/src/content/docs/knowledge-base/services/grafana.mdx new file mode 100644 index 0000000..da72dcd --- /dev/null +++ b/src/content/docs/knowledge-base/services/grafana.mdx @@ -0,0 +1,35 @@ +--- +title: Grafana +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Grafana with Coolify" +description: "Here you can find the documentation for hosting Grafana with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Grafana](https://github.com/grafana/grafana/raw/main/docs/logo-horizontal.png#gh-light-mode-only) + +## What is Grafana? + +The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more. + +## Features + +Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture: + +- **Visualizations:** Fast and flexible client side graphs with a multitude of options. Panel plugins offer many different ways to visualize metrics and logs. +- **Dynamic Dashboards:** Create dynamic & reusable dashboards with template variables that appear as dropdowns at the top of the dashboard. +- **Explore Metrics:** Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side. +- **Explore Logs:** Experience the magic of switching from metrics to logs with preserved label filters. Quickly search through all your logs or streaming them live. +- **Alerting:** Visually define alert rules for your most important metrics. Grafana will continuously evaluate and send notifications to systems like Slack, PagerDuty, VictorOps, OpsGenie. +- **Mixed Data Sources:** Mix different data sources in the same graph! You can specify a data source on a per-query basis. This works for even custom datasources. + +## Links + +- [The official website โ€บ](https://grafana.com/) +- [GitHub โ€บ](https://github.com/grafana/grafana) diff --git a/src/content/docs/knowledge-base/services/grocy.mdx b/src/content/docs/knowledge-base/services/grocy.mdx new file mode 100644 index 0000000..068a8b7 --- /dev/null +++ b/src/content/docs/knowledge-base/services/grocy.mdx @@ -0,0 +1,24 @@ +--- +title: Grocy +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Grocy with Coolify" +description: "Here you can find the documentation for hosting Grocy with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Grocy](https://raw.githubusercontent.com/grocy/grocy/master/public/img/logo.svg?sanitize=true) + +## What is Grocy? + +Grocy is a web-based self-hosted groceries & household management solution for your home + +## Links + +- [The official website โ€บ](https://grocy.info) +- [GitHub โ€บ](https://github.com/grocy/grocy) diff --git a/src/content/docs/knowledge-base/services/heimdall.mdx b/src/content/docs/knowledge-base/services/heimdall.mdx new file mode 100644 index 0000000..36a8637 --- /dev/null +++ b/src/content/docs/knowledge-base/services/heimdall.mdx @@ -0,0 +1,28 @@ +--- +title: Heimdall +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Heimdall with Coolify" +description: "Here you can find the documentation for hosting Heimdall with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Heimdall](https://camo.githubusercontent.com/3a9babdb52929de80a0a4d067097622216dd1f4637c24a60c742757d24687034/68747470733a2f2f692e696d6775722e636f6d2f4d72433451704e2e676966) + +## What is Heimdall? + +As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like. + +Heimdall is an elegant solution to organise all your web applications. Itโ€™s dedicated to this purpose so you wonโ€™t lose your links in a sea of bookmarks. + +Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo. + +## Links + +- [The official website โ€บ](https://heimdall.site/) +- [GitHub โ€บ](https://github.com/linuxserver/Heimdall) diff --git a/src/content/docs/knowledge-base/services/index.mdx b/src/content/docs/knowledge-base/services/index.mdx new file mode 100644 index 0000000..5f66e9d --- /dev/null +++ b/src/content/docs/knowledge-base/services/index.mdx @@ -0,0 +1,50 @@ +--- +title: Introduction +head: + - tag: "meta" + attrs: + property: "og:title" + content: "What kind of one-click services could you host with Coolify" +description: "Here you can find all the one-click services that you can host with Coolify." +--- + +All services are open source and self-hostable. + +## Services + +- [ActivePieces](/docs/knowledge-base/services/activepieces) - Open source no-code business automation. +- [Appsmith](/docs/knowledge-base/services/appsmith) - A low-code application platform for building internal tools. +- [Appwrite](/docs/knowledge-base/services/appwrite) - A backend-as-a-service platform that simplifies the web & mobile app development. +- [Authentik](/docs/knowledge-base/services/authentik) - An open-source Identity Provider, focused on flexibility and versatility. +- [Baby Buddy](/docs/knowledge-base/services/babybuddy) - It helps parents track their baby's daily activities, growth, and health with ease. +- [Budge](/docs/knowledge-base/services/budge) - A budgeting personal finance app. +- [Change Detection](/docs/knowledge-base/services/changedetection) - Website change detection monitor and notifications. +- [ClassicPress](/docs/knowledge-base/services/classicpress) - A business-focused CMS with a strong community. +- [Code Server](/docs/knowledge-base/services/code-server) - Run VS Code on any machine anywhere and access it in the browser. +- [Dashboard](/docs/knowledge-base/services/dashboard) - A simple dashboard for your server. +- [Directus](/docs/knowledge-base/services/directus) - An open-source headless CMS and API for custom databases. +- [Docker Registry](/docs/knowledge-base/docker/registry) - A Docker registry to store and manage your Docker images. +- [DocuWiki](/docs/knowledge-base/services/dokuwiki) - A simple to use and highly versatile Open Source wiki software that doesn't require a database. +- [Duplicati](/docs/knowledge-base/services/duplicati) - A free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers. +- [Emby](/docs/knowledge-base/services/emby) - A media server to organize, play, and stream audio and video to a variety of devices. +- [Emby Stat](/docs/knowledge-base/services/emby-stat) - A simple and easy-to-use Emby statistics dashboard. +- [Fider](/docs/knowledge-base/services/fider) - An open platform to collect and organize customer feedback. +- [Filebrowser](/docs/knowledge-base/services/filebrowser) - A file manager for the web. +- [Firefly III](/docs/knowledge-base/services/firefly-iii) - A personal finances manager. +- [Formbricks](/docs/knowledge-base/services/formbricks) - A form builder for static sites. +- [Ghost](/docs/knowledge-base/services/ghost) - A professional publishing platform. +- [Gitea](/docs/knowledge-base/services/gitea) - A painless self-hosted Git service. +- [GlitchTip](/docs/knowledge-base/services/glitchtip) - An open-source error tracking tool. +- [Grafana](/docs/knowledge-base/services/grafana) - The open platform for beautiful analytics and monitoring. +- [Grocy](/docs/knowledge-base/services/grocy) - A self-hosted groceries & household management solution for your home. +- [Heimdall](/docs/knowledge-base/services/heimdall) - An elegant solution to organize all your web applications. +- [Jellyfin](/docs/knowledge-base/services/jellyfin) - The Free Software Media System. +- [Kuzzle](/docs/knowledge-base/services/kuzzle) - A powerful backend that enables you to build modern apps faster. +- [Logto](/docs/knowledge-base/services/logto) - Logto is an Auth0 alternative designed for modern apps and SaaS products. +- [MeiliSearch](/docs/knowledge-base/services/meilisearch) - A powerful, fast, open-source, easy to use, and deploy search engine. +- [Metabase](/docs/knowledge-base/services/metabase) - The simplest, fastest way to share data and analytics inside your company. +- [Metube](/docs/knowledge-base/services/metube) - A self-hosted video sharing platform. +- [Plausible Analytics](/docs/knowledge-base/services/plausible) - Simple and privacy-friendly alternative to Google Analytics. +- [MinIO](/docs/knowledge-base/services/minio) - A high-performance, distributed object storage system. +- [StatusNook](/docs/knowledge-base/services/statusnook) - A status page system for your website. + diff --git a/src/content/docs/knowledge-base/services/jellyfin.mdx b/src/content/docs/knowledge-base/services/jellyfin.mdx new file mode 100644 index 0000000..3c31902 --- /dev/null +++ b/src/content/docs/knowledge-base/services/jellyfin.mdx @@ -0,0 +1,24 @@ +--- +title: Jellyfin +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Jellyfin with Coolify" +description: "Here you can find the documentation for hosting Jellyfin with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Jellyfin](https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/banner-logo-solid.svg?sanitize=true) + +## What is Jellyfin? + +Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! + +## Links + +- [The official website โ€บ](https://jellyfin.org/) +- [GitHub โ€บ](https://github.com/jellyfin/jellyfin) diff --git a/src/content/docs/knowledge-base/services/kuzzle.mdx b/src/content/docs/knowledge-base/services/kuzzle.mdx new file mode 100644 index 0000000..0389919 --- /dev/null +++ b/src/content/docs/knowledge-base/services/kuzzle.mdx @@ -0,0 +1,37 @@ +--- +title: Kuzzle +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Kuzzle with Coolify" +description: "Here you can find the documentation for hosting Kuzzle with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Kuzzle](https://user-images.githubusercontent.com/7868838/103797784-32337580-5049-11eb-8917-3fcf4487644c.png) + +## What is Kuzzle? + +Kuzzle is a generic backend offering the basic building blocks common to every application. + +Rather than developing the same standard features over and over again each time you create a new application, Kuzzle proposes them off the shelf, allowing you to focus on building high-level, high-value business functionalities. + +## Features + +Kuzzle enables you to build modern web applications and complex IoT networks in no time. + +- API First: use a standardised multi-protocol API. +- Persisted Data: store your data and perform advanced searches on it. +- Realtime Notifications: use the pub/sub system or subscribe to database notifications. +- User Management: login, logout and security rules are no more a burden. +- Extensible: develop advanced business feature directly with the integrated framework. +- Client SDKs: use our SDKs to accelerate the frontend development. + +## Links + +- [The official website โ€บ](https://kuzzle.io/) +- [GitHub โ€บ](https://github.com/kuzzleio/kuzzle) diff --git a/src/content/docs/knowledge-base/services/logto.mdx b/src/content/docs/knowledge-base/services/logto.mdx new file mode 100644 index 0000000..cbfbe97 --- /dev/null +++ b/src/content/docs/knowledge-base/services/logto.mdx @@ -0,0 +1,45 @@ +--- +title: Logto +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Logto with Coolify" +description: "Here you can find the documentation for hosting Logto with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Logto](https://github.com/logto-io/logto/raw/master/logo.png) + +## What is Logto? + +Logto is an Auth0 alternative designed for modern apps and SaaS products. It offers a seamless developer experience and is well-suited for individuals and growing companies. + +๐Ÿง‘โ€๐Ÿ’ป **Comprehensive frontend-to-backend identity solution** + +- Enables OIDC-based authentication with Logto SDKs. +- Supports passwordless sign-in, along with various options like email, phone number, username, Google, Facebook, and other social sign-in methods. +- Offers beautiful UI components with customizable CSS to suit your business needs. + +๐Ÿ“ฆ **Out-of-the-box infrastructure** + +- Includes a ready-to-use Management API, serving as your authentication provider, thus eliminating the need for extra implementation. +- Provides SDKs that seamlessly integrate your apps with Logto across multiple platforms and languages, tailored to your development environment. +- Offers flexible connectors that can be scaled with community contributions and customized with SAML, OAuth, and OIDC protocols. + +๐Ÿ’ป **Enterprise-ready solutions** + +- Implements role-based access control (RBAC) for scalable role authorization, catering to a wide range of use cases. +- Facilitates user management and provides audit logs for understanding identity-related user information and maintaining security. +- Enables single sign-on (SSO) and multi-factor authentication (MFA) without extra coding. +- Leverages Logto Organizations to build multi-tenancy apps with ease. + +In a more approachable way, we refer to this solution as "[Customer Identity Access Management (CIAM)](https://en.wikipedia.org/wiki/Customer_identity_access_management)" or simply, the "Customer Identity Solution." + +## Links + +- [The official website โ€บ](https://logto.io) +- [GitHub โ€บ](https://github.com/logto-io/logto) diff --git a/src/content/docs/knowledge-base/services/meilisearch.mdx b/src/content/docs/knowledge-base/services/meilisearch.mdx new file mode 100644 index 0000000..4033a2f --- /dev/null +++ b/src/content/docs/knowledge-base/services/meilisearch.mdx @@ -0,0 +1,45 @@ +--- +title: Meilisearch +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Meilisearch with Coolify" +description: "Here you can find the documentation for hosting Meilisearch with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Meilisearch](https://github.com/meilisearch/meilisearch/raw/main/assets/meilisearch-logo-light.svg?sanitize=true#gh-light-mode-only) + +## What is Meilisearch? + +A lightning-fast search engine that fits effortlessly into your apps, websites, and workflow + +Meilisearch helps you shape a delightful search experience in a snap, offering features that work out-of-the-box to speed up your workflow. + +## Screenshot + +![Meilisearch screenshot](https://github.com/meilisearch/meilisearch/raw/main/assets/demo-light.gif#gh-light-mode-only) + +## โœจ Features + +- **Search-as-you-type:** find search results in less than 50 milliseconds +- **[Typo tolerance](https://www.meilisearch.com/docs/learn/configuration/typo_tolerance?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** get relevant matches even when queries contain typos and misspellings +- **[Filtering](https://www.meilisearch.com/docs/learn/fine_tuning_results/filtering?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features) and [faceted search](https://www.meilisearch.com/docs/learn/fine_tuning_results/faceted_search?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** enhance your users' search experience with custom filters and build a faceted search interface in a few lines of code +- **[Sorting](https://www.meilisearch.com/docs/learn/fine_tuning_results/sorting?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** sort results based on price, date, or pretty much anything else your users need +- **[Synonym support](https://www.meilisearch.com/docs/learn/configuration/synonyms?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** configure synonyms to include more relevant content in your search results +- **[Geosearch](https://www.meilisearch.com/docs/learn/fine_tuning_results/geosearch?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** filter and sort documents based on geographic data +- **[Extensive language support](https://www.meilisearch.com/docs/learn/what_is_meilisearch/language?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** search datasets in any language, with optimized support for Chinese, Japanese, Hebrew, and languages using the Latin alphabet +- **[Security management](https://www.meilisearch.com/docs/learn/security/master_api_keys?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** control which users can access what data with API keys that allow fine-grained permissions handling +- **[Multi-Tenancy](https://www.meilisearch.com/docs/learn/security/tenant_tokens?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** personalize search results for any number of application tenants +- **Highly Customizable:** customize Meilisearch to your specific needs or use our out-of-the-box and hassle-free presets +- **[RESTful API](https://www.meilisearch.com/docs/reference/api/overview?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** integrate Meilisearch in your technical stack with our plugins and SDKs +- **Easy to install, deploy, and maintain** + +## Links + +- [The official website โ€บ](https://www.meilisearch.com) +- [GitHub โ€บ](https://github.com/meilisearch/meilisearch) diff --git a/src/content/docs/knowledge-base/services/metabase.mdx b/src/content/docs/knowledge-base/services/metabase.mdx new file mode 100644 index 0000000..2879933 --- /dev/null +++ b/src/content/docs/knowledge-base/services/metabase.mdx @@ -0,0 +1,37 @@ +--- +title: Metabase +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Metabase with Coolify" +description: "Here you can find the documentation for hosting Metabase with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Metabase](https://github.com/metabase/metabase/raw/master/docs/images/metabase-product-screenshot.svg) + +## What is Metabase? + +Metabase is the easy, open-source way for everyone in your company to ask questions and learn from data. + +## Features + +- [Set up in five minutes](https://www.metabase.com/docs/latest/setting-up-metabase.html) (we're not kidding). +- Let anyone on your team [ask questions](https://www.metabase.com/docs/latest/users-guide/04-asking-questions.html) without knowing SQL. +- Use the [SQL editor](https://www.metabase.com/docs/latest/questions/native-editor/writing-sql) for more complex queries. +- Build handsome, interactive [dashboards](https://www.metabase.com/docs/latest/users-guide/07-dashboards.html) with filters, auto-refresh, fullscreen, and custom click behavior. +- Create [models](https://www.metabase.com/learn/getting-started/models) that clean up, annotate, and/or combine raw tables. +- Define canonical [segments and metrics](https://www.metabase.com/docs/latest/administration-guide/07-segments-and-metrics.html) for your team to use. +- Send data to Slack or email on a schedule with [dashboard subscriptions](https://www.metabase.com/docs/latest/users-guide/dashboard-subscriptions). +- Set up [alerts](https://www.metabase.com/docs/latest/users-guide/15-alerts.html) to have Metabase notify you when your data changes. +- [Embed charts and dashboards](https://www.metabase.com/docs/latest/administration-guide/13-embedding.html) in your app, or even [your entire Metabase](https://www.metabase.com/docs/latest/enterprise-guide/full-app-embedding.html). + +## Links + +- [The official website โ€บ](https://www.metabase.com/) +- [Github โ€บ](https://github.com/metabase/metabase) + diff --git a/src/content/docs/knowledge-base/services/metube.mdx b/src/content/docs/knowledge-base/services/metube.mdx new file mode 100644 index 0000000..80d8080 --- /dev/null +++ b/src/content/docs/knowledge-base/services/metube.mdx @@ -0,0 +1,23 @@ +--- +title: Metube +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Metube with Coolify" +description: "Here you can find the documentation for hosting Metube with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Metube](https://github.com/alexta69/metube/raw/master/screenshot.gif) + +## What is Metube? + +Web GUI for youtube-dl (using the yt-dlp fork) with playlist support. Allows you to download videos from YouTube and dozens of other sites. + +## Links + +- [GitHub โ€บ](https://github.com/alexta69/metube) diff --git a/src/content/docs/knowledge-base/services/minio.mdx b/src/content/docs/knowledge-base/services/minio.mdx new file mode 100644 index 0000000..d9fbbf9 --- /dev/null +++ b/src/content/docs/knowledge-base/services/minio.mdx @@ -0,0 +1,29 @@ +--- +title: MinIO +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host MinIO with Coolify" +description: "Here you can find the documentation for hosting MinIO with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![MinIO](https://github.com/minio.png) + +## What is MinIO? + +MinIO is a high-performance, distributed object storage system. It is software-defined, runs on industry-standard hardware, and is 100% open source under the AGPL v3.0 license. + +## Links + +- [The official website โ€บ](https://min.io/) + +## FAQ + +### Invalid login credentials + +You need to run MinIO on `https` (not self-signed) to avoid this issue. MinIO doesn't support http based authentication. diff --git a/src/content/docs/knowledge-base/services/plausible.mdx b/src/content/docs/knowledge-base/services/plausible.mdx new file mode 100644 index 0000000..1a6c0af --- /dev/null +++ b/src/content/docs/knowledge-base/services/plausible.mdx @@ -0,0 +1,34 @@ +--- +title: Plausible Analytics +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Plausible Analytics with Coolify" +description: "Here you can find the documentation for hosting Plausible Analytics with Coolify." +--- + +![Plausible Analytics](https://plausible.io/images/ee/logo_light-38aed73a70daced020b53243966ed15e.svg?vsn=d) + +## What is Plausible Analytics? + +Plausible is intuitive, lightweight and open source web analytics. No cookies and fully compliant with GDPR, CCPA and PECR. Made and hosted in the EU, powered by European-owned cloud infrastructure ๐Ÿ‡ช๐Ÿ‡บ + +## How to deploy Plausible Analytics with Coolify? + +Due to trademark issues, we can't make a fully automated installation for Plausible Analytics. But don't worry, it's still easy to install it. + +## Installation + +1. You need to select the `Based on Docker Compose` application type where you can add any docker-compose file you want. +2. Copy the following [file](https://raw.githubusercontent.com/coollabsio/coolify/main/templates/compose/plausible.yaml) to the input box (with the comments). +3. Click on the `Save` button. +4. Go to the `Plausible` service's settings page (gear icon on the right side). +5. Add your custom domain name to the `FQDN` input box. +6. Click on the `Save` button. +7. Click on the `Deploy` button. + +## Links + +- [The official website โ€บ](https://plausible.io/) +- [GitHub โ€บ](https://github.com/plausible/analytics) diff --git a/src/content/docs/knowledge-base/services/statusnook.mdx b/src/content/docs/knowledge-base/services/statusnook.mdx new file mode 100644 index 0000000..f3dc4a0 --- /dev/null +++ b/src/content/docs/knowledge-base/services/statusnook.mdx @@ -0,0 +1,24 @@ +--- +title: Statusnook +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to host Statusnook with Coolify" +description: "Here you can find the documentation for hosting Statusnook with Coolify." +--- + +import { Badge } from '@astrojs/starlight/components'; + + + +![Statusnook](https://github.com/goksan/statusnook/assets/17437810/ff2bb1d4-5d75-4b6e-b8d9-a7227d1aee6c) + +## What is Statusnook? + +Statusnook allows you to effortlessly deploy a status page and start monitoring endpoints in minutes + +## Links + +- [The official website โ€บ](https://statusnook.com) +- [GitHub โ€บ](https://github.com/goksan/statusnook) diff --git a/src/content/docs/knowledge-base/traefik/astro.config.mjs b/src/content/docs/knowledge-base/traefik/astro.config.mjs new file mode 100644 index 0000000..0b2e93d --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/astro.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'astro/config'; +import tailwind from '@astrojs/tailwind'; +// https://astro.build/config +export default defineConfig({ + integrations: [tailwind()] +}); \ No newline at end of file diff --git a/src/content/docs/knowledge-base/traefik/basic-auth.mdx b/src/content/docs/knowledge-base/traefik/basic-auth.mdx new file mode 100644 index 0000000..249311b --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/basic-auth.mdx @@ -0,0 +1,136 @@ +--- +title: "Basic Auth Middleware" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure basic auth with Traefik in Coolify" +description: "A guide to configure basic auth with Traefik in Coolify" +--- + +import { Aside } from '@astrojs/starlight/components'; + +The configuration is slightly different for [`Standard Applications`](#standard-applications) and [`Docker Compose based applications/one-click services`](#docker-compose-and-services). + +## Standard Applications + +```bash +traefik.http.middlewares..basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG +traefik.http.routers..middlewares= +``` + +In the example above, we are using `test` as username and `test` as password. + + + +Note: The `` and `` are placeholders. You need to replace them when you add them to your own labels section. +The `` is a unique name for the middleware and you need to make that up yourself. The `` +is the unique name for the router that Coolify has already generated for you. + +### An ngnix Simple Web Container Example + +Let's say you have an ngnix simple web container that was generated by Coolify with the following Dockerfile: +```Dockerfile +FROM nginx:alpine +COPY . /usr/share/nginx/html +``` + +The `Container Labels` generated by Coolify would look like this: + +```bash +traefik.enable=true +traefik.http.middlewares.gzip.compress=true +traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.entryPoints=http +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.middlewares=redirect-to-https +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.rule=Host(`ngnixsite.mysite.com`) && PathPrefix(`/`) +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.service=http-0-wc04wo4ow4scokgsw8wow4s8 +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.entryPoints=https +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.middlewares=gzip +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.rule=Host(`ngnixsite.mysite.com`) && PathPrefix(`/`) +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.service=https-0-wc04wo4ow4scokgsw8wow4s8 +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.tls.certresolver=letsencrypt +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.tls=true +traefik.http.services.http-0-wc04wo4ow4scokgsw8wow4s8.loadbalancer.server.port=80 +traefik.http.services.https-0-wc04wo4ow4scokgsw8wow4s8.loadbalancer.server.port=80 +caddy_0.encode=zstd gzip +caddy_0.handle_path.0_reverse_proxy={{upstreams 80}} +caddy_0.handle_path=/* +caddy_0.header=-Server +caddy_0.try_files={path} /index.html /index.php +caddy_0=https://ngnixsite.73rdst.com +caddy_ingress_network=coolify +``` + +If you want to add basic authentication to this service, assuming you want to name your auth middleware `mybasicauth`, you could add the following label below the +first line `traefik.enable=true`: + +`traefik.http.middlewares.mybasicauth.basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG` + +Notice that `mybasicauth` has replaced the `` placeholder. In other words, you have named your own auth middleware `mybasicauth`. + +Then you need to add the middleware to the router label, and since one or more middlewares are already set, you need to append the new middleware to the existing value. + +For example you would update the current line + +`traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.middlewares=redirect-to-https` + +to: + +`traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.middlewares=gzip,mybasicauth` + +Notice that in this case `` has been replaced with `https-0-wc04wo4ow4scokgsw8wow4s8` which is the unique name for the router that Coolify has already generated for you. + +Your `ngnix` simple web container is protected by basic authentication. + +## Docker Compose And Services + +To add `basicauth` middleware to your service, you need to add the following labels to your `docker-compose.yml` file.: + +```yaml +services: + ngnix-simple-web-container:: + image: 'nginx:alpine' + ports: + - '8080:80' + labels: + - 'traefik.http.middlewares..basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG' +``` + +You should replace the placeholders `` with a unique name for the middleware. For example, you might name it `mybasicauth`, and then +replace the placeholder with `mybasicauth`. That label would then look like this: + +``` + labels: + - 'traefik.http.middlewares.mybasicauth.basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG' +``` + +We have now added `basicauth` middleware to the `nginx-simple-web-container` service. + +Your `ngnix` simple web container is protected by basic authentication with a username of test and password of test. + +Note: When applying basic authentication labels, special characters like $, @, and , must be escaped to avoid parsing errors. +That is for example, enclose the label values in quotes and use a backslash (\) before special characters if you're using double quotes. + +## How to generate user/password? + +You need to set your username and password in the `basicauth.users` label. + +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +This will generate a password hash for the user `test` with the password `test`. +You can then replace `test` with the desired username and password. Then substitute the generated hash in the `basicauth.users` label above. + +Note: the `htpasswd` command is available on most Linux distributions. It is part of the `apache2-utils` package on Debian/Ubuntu and +can be found [here](https://httpd.apache.org/docs/current/programs/htpasswd.html). \ No newline at end of file diff --git a/src/content/docs/knowledge-base/traefik/custom-ssl-certs.mdx b/src/content/docs/knowledge-base/traefik/custom-ssl-certs.mdx new file mode 100644 index 0000000..ff4097d --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/custom-ssl-certs.mdx @@ -0,0 +1,63 @@ +--- +title: "Custom SSL Certificates" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure custom SSL certificates with Traefik in Coolify" +description: "A guide to configure custom SSL certificates with Traefik in Coolify" +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +If you want to use custom SSL certificates with Traefik, you can easily do so by following the steps below. + +On each server, `/data/coolify/proxy` is mounted into the Coolify Proxy (Traefik) container. + +You can add your custom SSL certificates in the `/data/coolify/proxy/certs` directory. + + +1. Generate or request an SSL certificate + Generate or request an SSL certificate for your domain. It can be a + self-signed certificate, a certificate from a public CA, or a certificate + from Let's Encrypt. + + Read more [here](https://certbot.eff.org/instructions) about certbot and Let's Encrypt. + +2. Copy the key and cert files to the server + Copy the key and cert files to the server where your resource that will use the certificate is running. + Use `scp` or any other method to copy the files. + + It should be placed under `/data/coolify/proxy` directory, for example: + + ```bash + scp /path/to/your/domain.cert root@your-server-ip:/data/coolify/proxy/certs/domain.cert + scp /path/to/your/domain.key root@your-server-ip:/data/coolify/proxy/certs/domain.key + ``` + + + +3. Configure Traefik + You can configure Traefik to use the custom SSL certificates by adding a dynamic configuration file through Coolify's UI or directly adding it to `/data/coolify/proxy/dynamic`: + + ```yaml + tls: + certificates: + - certFile: /traefik/certs/domain.cert + keyFile: /traefik/certs/domain.key + - certFile: /traefik/certs/domain2.cert + keyFile: /traefik/certs/domain2.key + ``` + + + + Traefik will automatically use this certificate if it matches the domain of the incoming request and the certificate in any of the provided files. + + + +For more information check Traefik's [official documentation](https://doc.traefik.io/traefik/https/tls/). diff --git a/src/content/docs/knowledge-base/traefik/dashboard.mdx b/src/content/docs/knowledge-base/traefik/dashboard.mdx new file mode 100644 index 0000000..3143616 --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/dashboard.mdx @@ -0,0 +1,67 @@ +--- +title: "Enable Dashboard" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to enable Traefik's dashboard with Coolify" +description: "A guide on how to enable Traefik's dashboard with Coolify" +--- + +import { Aside } from '@astrojs/starlight/components'; + +By default, the Traefik dashboard is enabled in secure mode, but not configured to be accessible from the internet. + +To enable access from the internet, you need to add a dynamic configuration and secure it with a username and password. + +## Secure mode (with Dynamic Configuration) + + + +You can enable Traefik's dashboard by adding the following dynamic configuration: + +```yaml +http: + routers: + dashboard: + rule: Host(``) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`)) + service: api@internal + tls: + certResolver: letsencrypt + middlewares: + - auth + middlewares: + auth: + basicAuth: + users: + - ":" +``` + +Replace ``, ``, and `` with your own values. + +You can reach the dashboard by visiting `http:///dashboard/#/`. + +### How to generate user/password? + +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +Example output: + +```bash +test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/ +``` + +## Insecure Mode (Not Recommended) + +If you want to enable the dashboard in insecure mode (without a password), all you need to do is go to the proxy configurations view and change the `insecure` setting to `true`, then restart the proxy.. + +```yaml + - '--api.insecure=true' +``` diff --git a/src/content/docs/knowledge-base/traefik/dynamic-configurations.mdx b/src/content/docs/knowledge-base/traefik/dynamic-configurations.mdx new file mode 100644 index 0000000..0429fe1 --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/dynamic-configurations.mdx @@ -0,0 +1,19 @@ +--- +title: "Dynamic Configurations" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to make dynamic configurations with Traefik in Coolify" +description: "A guide on how to make dynamic configurations with Traefik in Coolify" +--- +import { Aside } from '@astrojs/starlight/components'; + +Dynamic configurations are used to configure Traefik on the fly, without restarting it. + +You can add them by going to the `Server/Proxy` view, and select `Dynamic Configurations` from the sidebar. + + diff --git a/src/content/docs/knowledge-base/traefik/healthcheck.mdx b/src/content/docs/knowledge-base/traefik/healthcheck.mdx new file mode 100644 index 0000000..ffe7404 --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/healthcheck.mdx @@ -0,0 +1,31 @@ +--- +title: "Healthcheck" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure healthchecks with Coolify" +description: "A guide on how to configure healthchecks with Coolify" +--- + +For Traefik to be able to route traffic to your services, it needs to know if they are healthy or not. This is done by using healthchecks. + +## Enabled + +If your resource has healthchecks enabled, Traefik will only route traffic to it if the healthcheck passes. If the healthcheck fails, Traefik will not route traffic to the resource. + +**It will cause the resource to be 404'd.** + +## Disabled + +If your resource has healthchecks disabled, Traefik will route traffic to it regardless of the healthcheck status. + +You can disable healthchecks on Coolify's UI in your resource's settings. + +## Which one should I use? + +It is recommended to enable healthchecks for all your resources. This way, you can ensure that only healthy resources are receiving traffic. + +But if you cannot set up healthchecks for some reason, you can disable them. + +Just be aware that if the resource is unhealthy, it will still receive traffic. diff --git a/src/content/docs/knowledge-base/traefik/load-balancing.mdx b/src/content/docs/knowledge-base/traefik/load-balancing.mdx new file mode 100644 index 0000000..18b50f9 --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/load-balancing.mdx @@ -0,0 +1,181 @@ +--- +title: "Load-balancing" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure a load-balancer with Traefik in Coolify" +description: "A guide to configure load-balancing with Traefik in Coolify" +--- + + +You can easily use Traefik to loadbalance an application between: + +- 2+ servers +- 2+ containers in one server + +## 2+ servers + +### Prerequisites + +1. Make sure you set the right DNS record for your domain. Your loadbalanced domain should point to the server's IP address where you are setting up the loadbalancer. +2. You must deploy your application to more than one servers: read more [here](/docs/knowledge-base/server/multiple-servers). +3. Make sure Traefik is running on all servers. +4. Set your `fqdn` to the fqdn you would like to use to reach your application. +5. After your application are deployed on all servers, you need to make a dynamic configuration for Traefik to loadbalance between your servers in the `/data/coolify/proxy/dynamic` directory. + +### Dynamic Configuration + +On your Coolify's UI, you can go the your Server settings / Proxy tab where you can add the dynamic configuration. + +The following configuration is valid if you would like to use https. + +```yaml {16,26,32,33} +http: + middlewares: + redirect-to-https: + redirectscheme: + scheme: https + gzip: + compress: true + routers: + lb-http: + middlewares: + - redirect-to-https + entryPoints: + - http + service: noop + # Change to your domain, like `example.com` without `https://` + rule: Host(``) + lb-https: + middlewares: + - gzip + entryPoints: + - https + service: lb-https + tls: + certResolver: letsencrypt + # Change to your domain, like `example.com` without `https://` + rule: Host(``) + services: + lb-https: + loadBalancer: + servers: + # Change to your servers IP addresses + - url: 'http://' + - url: 'http://' + # Add any number of servers you want to loadbalance between + noop: + loadBalancer: + servers: + - url: '' +``` + +The following configuration is valid if you would like to use http. + +```yaml {13,19,20} +http: + middlewares: + gzip: + compress: true + routers: + lb-http: + middlewares: + - gzip + entryPoints: + - http + service: lb-http + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-http: + loadBalancer: + servers: + # Change to your servers IP addresses + - url: 'http://' + - url: 'http://' + # Add any number of servers you want to loadbalance between +``` + +## 2+ containers in one server + +### Prerequisites + +1. Make sure you set the right DNS record for your domain. Your loadbalanced domain should point to the server's IP address where you are setting up the loadbalancer. +2. You must deploy your application to more than one containers in one server. +3. Make sure Traefik is running on the server. + +### Dynamic Configuration + +The following configuration is valid if you would like to use https. + +```yaml {18,26,34,35} +http: + middlewares: + redirect-to-https: + redirectscheme: + scheme: https + gzip: + compress: true + routers: + lb-https: + tls: + certResolver: letsencrypt + middlewares: + - gzip + entryPoints: + - https + service: lb-https + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + lb-http: + middlewares: + - redirect-to-https + entryPoints: + - http + service: noop + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-https: + loadBalancer: + servers: + # Change : to your containers UUID or host.docker.internal and port + # UUID is when you mapped a port to the host system + # host.docker.internal is when you are not exposed any port to the host system + - url: 'http://:' + - url: 'http://::' + # Add any number of containers you want to loadbalance between + noop: + loadBalancer: + servers: + - url: '' +``` + +The following configuration is valid if you would like to use http. + +```yaml {13,21,22} +http: + middlewares: + gzip: + compress: true + routers: + lb-http: + middlewares: + - gzip + entryPoints: + - http + service: lb-http + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-http: + loadBalancer: + servers: + # Change : to your containers UUID or host.docker.internal and port + # UUID is when you mapped a port to the host system + # host.docker.internal is when you are not exposed any port to the host system + - url: 'http://:' + - url: 'http://:' + # Add any number of containers you want to loadbalance between +``` diff --git a/src/content/docs/knowledge-base/traefik/redirects.mdx b/src/content/docs/knowledge-base/traefik/redirects.mdx new file mode 100644 index 0000000..966480f --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/redirects.mdx @@ -0,0 +1,75 @@ +--- +title: "Redirects" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to configure redirects with Traefik in Coolify" +description: "A guide to configure redirects with Traefik in Coolify" +--- + +# Redirects with Traefik + +This guide will help you to configure redirects in Coolify with Traefik. + +The configuration is slightly different for `Standard Applications` and `Docker Compose` based applications/one-click services. + +## Standard Applications + +- You need to set both FQDNs for your resource, so for example: `coolify.io,www.coolify.io` +- Add a unique middleware to your resource. + +### www -> non-www + +```bash {4,8-10} +# A similar line is already defined. +traefik.http.routers..rule=Host(`www.coolify.io`) && PathPrefix(`/`) + +# You need to add the middleware to the router. +traefik.http.routers..middlewares=example-middleware + +# If you have multiple middlewares, you need to add them comma separated. +# traefik.http.routers..middlewares=gzip,example-middleware +# +traefik.http.middlewares.example-middleware.redirectregex.regex=^(http|https)://www\.(.+) +traefik.http.middlewares.example-middleware.redirectregex.replacement=${1}://${2} +traefik.http.middlewares.example-middleware.redirectregex.permanent=true +``` + +### non-www -> www + +```bash {4,8-10} +# A similar line is already defined. +traefik.http.routers..rule=Host(`coolify.io`) && PathPrefix(`/`) + +# You need to add the middleware to the router. +traefik.http.routers..middlewares=example-middleware + +# If you have multiple middlewares, you need to add them comma separated. +# traefik.http.routers..middlewares=gzip,example-middleware +# +traefik.http.middlewares.example-middleware.redirectregex.regex=^(http|https)://(?:www\.)?(.+) +traefik.http.middlewares.example-middleware.redirectregex.replacement=${1}://www.${2} +traefik.http.middlewares.example-middleware.redirectregex.permanent=true +``` + +## Docker Compose based Applications & one-click Services + +- You need to set both FQDNs for your resource, so for example: `coolify.io,www.coolify.io` +- You only need add the middleware to the router. + +### www -> non-www + +```bash +traefik.http.middlewares.example-middleware.redirectregex.regex=^(http|https)://www\.(.+) +traefik.http.middlewares.example-middleware.redirectregex.replacement=${1}://${2} +traefik.http.middlewares.example-middleware.redirectregex.permanent=true +``` + +### non-www -> www + +```bash +traefik.http.middlewares.example-middleware.redirectregex.regex=^(http|https)://(?:www\.)?(.+) +traefik.http.middlewares.example-middleware.redirectregex.replacement=${1}://www.${2} +traefik.http.middlewares.example-middleware.redirectregex.permanent=true +``` diff --git a/src/content/docs/knowledge-base/traefik/wildcard-certificates.mdx b/src/content/docs/knowledge-base/traefik/wildcard-certificates.mdx new file mode 100644 index 0000000..dabce26 --- /dev/null +++ b/src/content/docs/knowledge-base/traefik/wildcard-certificates.mdx @@ -0,0 +1,148 @@ +--- +title: "Wildcard SSL Certificates" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to create wildcard SSL certificates with Traefik in Coolify" +description: "A guide to configure wildcard subdomain redirects (with Traefik wildcard certificates) in Coolify." +--- + +import { Aside } from '@astrojs/starlight/components'; + +## Prerequisites + +- You need to have a domain name and a DNS provider that supports wildcard subdomains. +- You need to use [dnsChallenge](https://doc.traefik.io/traefik/https/acme/#dnschallenge) in Traefik to get wildcard certificates from Let's Encrypt. +- You need to use one of the supported DNS [providers](https://doc.traefik.io/traefik/https/acme/#providers). + + + + +## Configuration + +1. Setup your wildcard subdomain DNS records, `*.coolify.io`. +2. Go to your Proxy settings (Servers / Proxy menu) and add the following configuration based on your [providers](https://doc.traefik.io/traefik/https/acme/#providers). The example will use `Hetzner` as a provider. + + +```bash +version: '3.8' +networks: + coolify: + external: true +services: + traefik: + container_name: coolify-proxy + image: 'traefik:v2.10' + restart: unless-stopped + environment: + - HETZNER_API_KEY= + extra_hosts: + - 'host.docker.internal:host-gateway' + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '8080:8080' + healthcheck: + test: 'wget -qO- http://localhost:80/ping || exit 1' + interval: 4s + timeout: 2s + retries: 5 + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy:/traefik' + command: + - '--ping=true' + - '--ping.entrypoint=http' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--entrypoints.http.address=:80' + - '--entrypoints.https.address=:443' + - '--entrypoints.http.http.encodequerysemicolons=true' + - '--entrypoints.https.http.encodequerysemicolons=true' + - '--providers.docker.exposedbydefault=false' + - '--providers.file.directory=/traefik/dynamic/' + - '--providers.file.watch=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http' + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hetzner' + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0' + - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json' + - '--providers.docker=true' + labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.middlewares=traefik-basic-auth@file + - traefik.http.routers.traefik.service=api@internal + - traefik.http.routers.traefik.tls.certresolver=letsencrypt + - traefik.http.routers.traefik.tls.domains[0].main=coolify.io + - traefik.http.routers.traefik.tls.domains[0].sans=*.coolify.io + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https + - traefik.http.middlewares.gzip.compress=true +``` + +> You can also set `env_file` instead of `environment` in the example above, but then you need to create a `.env` file with the `HETZNER_API_KEY` variable on the server. + +> Change `--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hetzner` to your provider. + +Now you have two options to configure your wildcard subdomain for your resources. + +### Normal + +If you would like to use one (wildcard) certificate for all of your resources, you can use this option. + +It is useful, because Traefik do not need to generate a new certificate for every resource, so new deployments will be available immediately without waiting for the certificate generation. + +- In your application, set your FQDN to a subdomain you would like to use: `https://example.coolify.io`. + +```bash +traefik.enable=true +traefik.http.routers..rule=Host(`example.coolify.io`) && PathPrefix(`/`) +traefik.http.routers..entryPoints=https +traefik.http.routers..middlewares=gzip +traefik.http.routers..service= +traefik.http.services..loadbalancer.server.port=80 +traefik.http.routers..tls=true +traefik.http.routers..tls.certresolver=letsencrypt +traefik.http.routers..rule=Host(`example.coolify.io`) && PathPrefix(`/`) +traefik.http.routers..entryPoints=http +traefik.http.routers..middlewares=redirect-to-https +``` + +### SaaS + +Redirect all subdomains to one application. You can use this option if you want to use Coolify as a SaaS provider. + +- In your application, leave the FQDN configuration `empty`. +- Add the following custom label configuration: + +```bash +traefik.enable=true +traefik.http.routers..rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.coolify.io`) +traefik.http.routers..entryPoints=https +traefik.http.routers..middlewares=gzip +traefik.http.routers..service= +traefik.http.services..loadbalancer.server.port=80 +traefik.http.routers..tls=true +traefik.http.routers..tls.certresolver=letsencrypt +traefik.http.routers..rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.coolify.io`) +traefik.http.routers..entryPoints=http +traefik.http.routers..middlewares=redirect-to-https +``` + +> `traefik.http.routers..tls.certresolver` should be the same as your `certresolver` name in Traefik proxy configuration, by default `letsencrypt`. + +> `traefik.http.services..loadbalancer.server.port` should be the same as your application listens on. Port 80 if you use a static deployment. + + diff --git a/src/content/docs/quickstart.mdx b/src/content/docs/quickstart.mdx new file mode 100644 index 0000000..25784ad --- /dev/null +++ b/src/content/docs/quickstart.mdx @@ -0,0 +1,43 @@ +--- +title: "Quickstart" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to get started with Coolify" +description: "Start building your infrastructure with ease." +sidebar: + order: 4 +--- + +## Cloud + +The cloud option is the easiest way to get started with Coolify. + +It is a paid service, where you can bring your own servers to a hosted Coolify instance. + +### Benefits of the cloud option + +- You do not need to take care of the maintenance of Coolify. +- You get it at the same price as if you host it for yourself. +- You get extra support. +- You get free email notifications. + +#### [Let's get started!](https://app.coolify.io) + +## Self-hosted + +You get all the features in the self-hosted version, but you need to take care of the maintenance of Coolify and all related services. + +### Benefits of the self-hosted option + +- No Hidden Costs. Cloud providers can become costly once you surpass the free tier. Once you go beyond the free tier, expenses can accumulate rapidly. There are plenty of horror stories. +- Cost Efficient. You get way more resources for your money and you can save a lot (thousands of $) every month, like this and this and this +- Easier Than You Think. Servers (hardware + software) have changed a lot since cloud providers emerged. And with software (like Coolify), you can start hosting in minutes without any maintanence work. +- Data Privacy. Currently, data privacy is a major issue. By self-hosting, you have complete control over your data and can guarantee that it is not being misused. +- No Features Behind Paywall. Everything is included in the open-source software (OSS) version. And will always be. +- No Limitations. You have the freedom to host an unlimited number of websites on any quantity of servers without any restrictions. +- Nice UI. You get a simple and easy to use UI to manage your servers and applications. +- Open Source. You can see the source code and contribute to it, if you want. You can shape the future of the software. + +#### [Let's get started!](/docs/installation) diff --git a/src/content/docs/screenshots.mdx b/src/content/docs/screenshots.mdx new file mode 100644 index 0000000..ad7888e --- /dev/null +++ b/src/content/docs/screenshots.mdx @@ -0,0 +1,30 @@ +--- +title: "Screenshots" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "A few screenshots of Coolify in action." +description: "A few screenshots of Coolify in action." +sidebar: + order: 2 +--- + +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.jpeg) +![screenshot](../../assets/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.jpeg) diff --git a/src/content/docs/uninstall.mdx b/src/content/docs/uninstall.mdx new file mode 100644 index 0000000..6a2387e --- /dev/null +++ b/src/content/docs/uninstall.mdx @@ -0,0 +1,61 @@ +--- +title: Uninstall - Self-hosted +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to uninstall the self-hosted version of Coolify from your server." +description: "A guide on how to uninstall the self-hosted version of Coolify from your server." +sidebar: + order: 6 +--- + +To uninstall the self-hosted version of Coolify from your server, follow these steps: + +1. **Stop and Remove Containers:** + + Use the following command to stop the Coolify containers with a timeout of 0, ensuring they stop immediately, and then remove them: + + ```bash + sudo docker stop -t 0 coolify coolify-realtime coolify-db coolify-redis coolify-proxy + sudo docker rm coolify coolify-realtime coolify-db coolify-redis coolify-proxy + ``` + +2. **Remove Docker Volumes:** + + Execute the command below to remove the Docker volumes associated with Coolify: + + ```bash + sudo docker volume rm coolify-db coolify-redis + ``` + +3. **Remove Docker Network:** + + Remove the custom Docker network named "coolify": + + ```bash + sudo docker network rm coolify + ``` + +4. **Delete Coolify Data Directory:** + + Delete the directory where Coolify data is stored: + + ```bash + sudo rm -rf /data/coolify + ``` + +5. **Remove Docker Images:** + + Use the following commands to remove the Docker images used by Coolify: + + ```bash + sudo docker rmi ghcr.io/coollabsio/coolify:latest + sudo docker rmi ghcr.io/coollabsio/coolify-helper:latest + sudo docker rmi quay.io/soketi/soketi:1.6-16-alpine + sudo docker rmi postgres:15-alpine + sudo docker rmi redis:alpine + sudo docker rmi traefik:v2.10 + ``` + +After completing these steps, Coolify will be uninstalled from your server. diff --git a/src/content/docs/upgrade.mdx b/src/content/docs/upgrade.mdx new file mode 100644 index 0000000..3f4fe03 --- /dev/null +++ b/src/content/docs/upgrade.mdx @@ -0,0 +1,29 @@ +--- +title: Upgrade - Self-hosted +head: + - tag: "meta" + attrs: + property: "og:title" + content: "How to upgrade the self-hosted version of Coolify" +description: "A guide on how to upgrade the self-hosted version of Coolify." +sidebar: + order: 7 +--- + +import { Aside } from '@astrojs/starlight/components'; + +There are several ways to upgrade your Coolify instance. + + + +1. **Automatic Upgrade**: Coolify will automatically check for updates and notify you when a new version is available. + + + +2. **Semi-Automatic Upgrade**: If there is a new version available, you can upgrade your Coolify instance by clicking the `Upgrade` button on the Navigation bar. + +3. **Manual Upgrade**: If you want to upgrade your Coolify instance manually, you can do so executing the following command in your server's terminal: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash +``` diff --git a/src/content/docs/videos.mdx b/src/content/docs/videos.mdx new file mode 100644 index 0000000..a3cafa6 --- /dev/null +++ b/src/content/docs/videos.mdx @@ -0,0 +1,71 @@ +--- +title: "Videos" +head: + - tag: "meta" + attrs: + property: "og:title" + content: "A few videos of Coolify in action." +description: "A few videos of Coolify in action." +sidebar: + order: 3 +--- + +- Syntax: 1.5 hours long complete walkthrough + + + +- WebdevCody: 6 minutes quick overview + + + +- DevelopedByEd: 20 minutes overview + + + +- Fireship video + + + +- MelkeyDev video + + diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..acef35f --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/src/tailwind.css b/src/tailwind.css new file mode 100644 index 0000000..95d77db --- /dev/null +++ b/src/tailwind.css @@ -0,0 +1,34 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Dark mode colors. */ +:root { + --sl-color-accent-low: #20261f; + --sl-color-accent: #5e7058; + --sl-color-accent-high: #c4cbc2; + --sl-color-white: #ffffff; + --sl-color-gray-1: #eeeded; + --sl-color-gray-2: #c2c2c2; + --sl-color-gray-3: #8c8b8b; + --sl-color-gray-4: #585858; + --sl-color-gray-5: #383838; + --sl-color-gray-6: #272727; + --sl-color-black: #181818; +} + +/* Light mode colors. */ +:root[data-theme='light'] { + --sl-color-accent-low: #d3d9d2; + --sl-color-accent: #5f7259; + --sl-color-accent-high: #2d352a; + --sl-color-white: #181818; + --sl-color-gray-1: #272727; + --sl-color-gray-2: #383838; + --sl-color-gray-3: #585858; + --sl-color-gray-4: #8c8b8b; + --sl-color-gray-5: #c2c2c2; + --sl-color-gray-6: #eeeded; + --sl-color-gray-7: #f6f6f6; + --sl-color-black: #ffffff; +} \ No newline at end of file diff --git a/tailwind.config.mjs b/tailwind.config.mjs new file mode 100644 index 0000000..b33dae4 --- /dev/null +++ b/tailwind.config.mjs @@ -0,0 +1,7 @@ +import starlightPlugin from '@astrojs/starlight-tailwind'; + +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + plugins: [starlightPlugin()], +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bcbf8b5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strict" +}