diff --git a/setup/install-prettier.sh b/setup/install-prettier.sh new file mode 100644 index 0000000..430def9 --- /dev/null +++ b/setup/install-prettier.sh @@ -0,0 +1,393 @@ +#!/usr/bin/env bash +# DevMagic - Prettier Installation Script +# Installs and configures Prettier, Husky, and lint-staged +# Usage: +# Latest version: curl -fsSL https://devmagic.run/install/prettier | bash +# With npm: curl -fsSL https://devmagic.run/install/prettier?pm=npm | bash + +set -euo pipefail + +# --- Configuration --- +PACKAGE_MANAGER="${PACKAGE_MANAGER:-pnpm}" + +# --- Colors for output --- +readonly RED='\033[0;31m' +readonly GREEN='\033[0;32m' +readonly YELLOW='\033[1;33m' +readonly BLUE='\033[0;34m' +readonly PURPLE='\033[0;35m' +readonly NC='\033[0m' + +# --- Helper Functions --- + +show_header() { + echo -e "${PURPLE}" + echo "✨ Prettier Installation" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "Setting up automatic code formatting" + echo -e "Package Manager: ${PACKAGE_MANAGER}${NC}" + echo +} + +check_prerequisites() { + echo -e "${BLUE}Checking prerequisites...${NC}" + + # Check if package.json exists + if [[ ! -f "package.json" ]]; then + echo -e "${RED}❌ package.json not found. This script must be run in a Node.js project.${NC}" + exit 1 + fi + + # Check if Git repository exists + if ! git rev-parse --is-inside-work-tree &>/dev/null; then + echo -e "${RED}❌ Not a Git repository. Husky requires Git to function.${NC}" + exit 1 + fi + + # Verify package manager is installed + if ! command -v "$PACKAGE_MANAGER" &>/dev/null; then + echo -e "${RED}❌ ${PACKAGE_MANAGER} is not installed. Please install it first.${NC}" + exit 1 + fi + + # Validate package manager + case "$PACKAGE_MANAGER" in + pnpm|npm|yarn|bun) + ;; + *) + echo -e "${RED}❌ Unsupported package manager: ${PACKAGE_MANAGER}${NC}" + echo -e "${YELLOW} Supported: pnpm, npm, yarn, bun${NC}" + exit 1 + ;; + esac + + echo -e "${GREEN}✓ Prerequisites check passed${NC}" + echo +} + +is_workspace() { + if [[ "$PACKAGE_MANAGER" == "pnpm" ]]; then + [[ -f "pnpm-workspace.yaml" ]] + elif [[ "$PACKAGE_MANAGER" == "npm" || "$PACKAGE_MANAGER" == "yarn" ]]; then + grep -q '"workspaces"' package.json 2>/dev/null + else + return 1 + fi +} + +get_install_cmd() { + local packages="$1" + local dev_flag="$2" + + case "$PACKAGE_MANAGER" in + pnpm) + if is_workspace; then + echo "pnpm add -w ${dev_flag} ${packages}" + else + echo "pnpm add ${dev_flag} ${packages}" + fi + ;; + npm) + echo "npm install ${dev_flag} ${packages}" + ;; + yarn) + echo "yarn add ${dev_flag} ${packages}" + ;; + bun) + echo "bun add ${dev_flag} ${packages}" + ;; + esac +} + +get_dev_flag() { + case "$PACKAGE_MANAGER" in + pnpm|npm) + echo "--save-dev" + ;; + yarn|bun) + echo "-D" + ;; + esac +} + +get_exact_flag() { + case "$PACKAGE_MANAGER" in + pnpm|npm) + echo "--save-exact" + ;; + yarn) + echo "--exact" + ;; + bun) + echo "" + ;; + esac +} + +get_exec_cmd() { + local cmd="$1" + + case "$PACKAGE_MANAGER" in + pnpm|npm|yarn) + echo "${PACKAGE_MANAGER} exec ${cmd}" + ;; + bun) + echo "bunx ${cmd}" + ;; + esac +} + +install_prettier() { + echo -e "${BLUE}📦 Step 1/7: Installing Prettier...${NC}" + + local dev_flag + dev_flag=$(get_dev_flag) + local exact_flag + exact_flag=$(get_exact_flag) + local install_cmd + install_cmd=$(get_install_cmd "prettier" "${dev_flag} ${exact_flag}") + + echo -e "${YELLOW}Running: ${install_cmd}${NC}" + eval "$install_cmd" + + echo -e "${GREEN}✓ Prettier installed${NC}" + echo +} + +create_prettierrc() { + echo -e "${BLUE}📝 Step 2/7: Creating .prettierrc...${NC}" + + if [[ -f ".prettierrc" ]]; then + echo -e "${YELLOW}⚠️ .prettierrc already exists, skipping...${NC}" + else + cat > .prettierrc << 'EOF' +{} +EOF + echo -e "${GREEN}✓ .prettierrc created${NC}" + fi + echo +} + +create_prettierignore() { + echo -e "${BLUE}📝 Step 3/7: Creating .prettierignore...${NC}" + + if [[ -f ".prettierignore" ]]; then + echo -e "${YELLOW}⚠️ .prettierignore already exists, skipping...${NC}" + else + cat > .prettierignore << 'EOF' +# Ignore artifacts: +build +coverage +dist +.next +out +node_modules +pnpm-lock.yaml +yarn.lock +package-lock.json +bun.lockb +EOF + echo -e "${GREEN}✓ .prettierignore created${NC}" + fi + echo +} + +create_editorconfig() { + echo -e "${BLUE}📝 Step 4/7: Creating .editorconfig...${NC}" + + if [[ -f ".editorconfig" ]]; then + echo -e "${YELLOW}⚠️ .editorconfig already exists, skipping...${NC}" + else + cat > .editorconfig << 'EOF' +root = true + +[*] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +charset = utf-8 +spelling_languages = en-US,en,pt-BR,pt +max_line_length = 120 + +[*.{lua,toml,yaml,yml,json,jsonc,json5}] +max_line_length = 80 + +[*.{fs,fsi,fsx}] +indent_size = 4 +# Simplifies reordering and adding new items. Details: +# https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting#multiline-bracket-formatting-style +fsharp_multiline_bracket_style = stroustrup + +[*.{py,sh,zsh,bash,gitconfig,tmux.conf}] +indent_size = 4 +max_line_length = 80 + +[*.{md,markdown,mdx}] +indent_size = 4 +max_line_length = unset # Not wrapping lines reduces diffs. +trim_trailing_whitespace = false # Double trailing spaces can be used to break lines. +EOF + echo -e "${GREEN}✓ .editorconfig created${NC}" + fi + echo +} + +install_husky_lintstaged() { + echo -e "${BLUE}📦 Step 5/7: Installing Husky and lint-staged...${NC}" + + local dev_flag + dev_flag=$(get_dev_flag) + local install_cmd + install_cmd=$(get_install_cmd "husky lint-staged" "${dev_flag}") + + echo -e "${YELLOW}Running: ${install_cmd}${NC}" + eval "$install_cmd" + + echo -e "${GREEN}✓ Husky and lint-staged installed${NC}" + echo +} + +configure_husky() { + echo -e "${BLUE}🪝 Step 6/7: Configuring Husky...${NC}" + + local husky_init + husky_init=$(get_exec_cmd "husky init") + echo -e "${YELLOW}Running: ${husky_init}${NC}" + eval "$husky_init" + + # Create pre-commit hook + local pre_commit_cmd + pre_commit_cmd=$(get_exec_cmd "lint-staged") + cat > .husky/pre-commit << EOF +${pre_commit_cmd} +EOF + + chmod +x .husky/pre-commit + + echo -e "${GREEN}✓ Husky configured${NC}" + echo +} + +configure_lintstaged() { + echo -e "${BLUE}⚙️ Step 7/7: Configuring lint-staged...${NC}" + + # Check if lint-staged config already exists (look for the config object, not just dependency name) + if grep -q '"lint-staged"[[:space:]]*:[[:space:]]*{' package.json; then + echo -e "${YELLOW}⚠️ lint-staged configuration already exists in package.json, skipping...${NC}" + else + # Use node to add lint-staged config to package.json + node --eval " +const fs = require('fs'); +const pkgPath = 'package.json'; +const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); +pkg['lint-staged'] = { + '**/*': 'prettier --write --ignore-unknown' +}; +fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); +" + echo -e "${GREEN}✓ lint-staged configured in package.json${NC}" + fi + echo +} + +create_github_workflow() { + echo -e "${BLUE}🔄 Creating GitHub Actions workflow...${NC}" + + local workflow_dir=".github/workflows" + local workflow_file="${workflow_dir}/format-check.yml" + + if [[ -f "$workflow_file" ]]; then + echo -e "${YELLOW}⚠️ GitHub Actions workflow already exists, skipping...${NC}" + else + mkdir -p "$workflow_dir" + + # Determine the install command for CI + local setup_step install_cmd_ci check_cmd + case "$PACKAGE_MANAGER" in + pnpm) + setup_step=' - uses: pnpm/action-setup@v4' + install_cmd_ci='pnpm install --frozen-lockfile' + check_cmd='pnpm exec prettier --check .' + ;; + npm) + setup_step='' + install_cmd_ci='npm ci' + check_cmd='npm exec prettier -- --check .' + ;; + yarn) + setup_step='' + install_cmd_ci='yarn install --frozen-lockfile' + check_cmd='yarn exec prettier --check .' + ;; + bun) + setup_step=' - uses: oven-sh/setup-bun@v2' + install_cmd_ci='bun install --frozen-lockfile' + check_cmd='bunx prettier --check .' + ;; + esac + + cat > "$workflow_file" << EOF +name: Format Check +on: [push, pull_request] + +jobs: + check-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 +${setup_step} + - uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "${PACKAGE_MANAGER}" + - run: ${install_cmd_ci} + - run: ${check_cmd} +EOF + echo -e "${GREEN}✓ GitHub Actions workflow created at ${workflow_file}${NC}" + fi + echo +} + +show_completion() { + echo -e "${GREEN}" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "✨ Prettier setup complete!" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo -e "${NC}" + echo "What was configured:" + echo " ✓ Prettier installed with exact version pinning" + echo " ✓ .prettierrc configuration file" + echo " ✓ .prettierignore for excluding files" + echo " ✓ .editorconfig for editor consistency" + echo " ✓ Husky for Git hooks" + echo " ✓ lint-staged for pre-commit formatting" + echo " ✓ GitHub Actions workflow for CI checks" + echo + echo "Next steps:" + echo " 1. Customize .prettierrc with your preferences (optional)" + echo " 2. Run '$(get_exec_cmd "prettier --write .")' to format all files" + echo " 3. Commit your changes - formatting will run automatically!" + echo + echo -e "${YELLOW}Note: Your commits will now be automatically formatted.${NC}" + echo +} + +# --- Main Pipeline --- +main() { + show_header + check_prerequisites + install_prettier + create_prettierrc + create_prettierignore + create_editorconfig + install_husky_lintstaged + configure_husky + configure_lintstaged + create_github_workflow + show_completion +} + +# Run main function +main "$@" diff --git a/www/app/install-scripts/page.tsx b/www/app/install-scripts/page.tsx new file mode 100644 index 0000000..7c9a72c --- /dev/null +++ b/www/app/install-scripts/page.tsx @@ -0,0 +1,124 @@ +import { loadInstallScripts } from '@/lib/install-scripts' +import Link from 'next/link' + +export default function InstallScriptsPage() { + const scripts = loadInstallScripts() + + return ( +
+
+

🚀 DevMagic Installation Scripts

+ +
+

Main DevMagic Installation

+

+ Install DevMagic dev container to your project: +

+
+            curl -fsSL https://devmagic.run/install | bash
+          
+

+ Or view the script:{' '} + + https://devmagic.run/install + + {' '}(curl/wget only) +

+
+ +

Additional Installation Scripts

+

+ Quick setup scripts for common development tools. Run with curl: +

+ +
+ {scripts.map((script) => ( +
+

{script.name}

+

{script.description}

+ + {script.requirements && script.requirements.length > 0 && ( +
+ Requirements: +
    + {script.requirements.map((req, idx) => ( +
  • {req}
  • + ))} +
+
+ )} + + {script.steps && script.steps.length > 0 && ( +
+ What it does: +
    + {script.steps.map((step, idx) => ( +
  1. {step}
  2. + ))} +
+
+ )} + +
+
+ Install with pnpm (default): +
+                    curl -fsSL https://devmagic.run/install/{script.id} | bash
+                  
+
+ + {script.supportsPackageManagers && ( +
+ Or with another package manager: +
+                      
+{`# npm
+curl -fsSL https://devmagic.run/install/${script.id}?pm=npm | bash
+
+# yarn
+curl -fsSL https://devmagic.run/install/${script.id}?pm=yarn | bash
+
+# bun
+curl -fsSL https://devmagic.run/install/${script.id}?pm=bun | bash`}
+                      
+                    
+
+ )} + +

+ View script:{' '} + + https://devmagic.run/install/{script.id} + + {' '}(curl/wget only) +

+
+
+ ))} + + {scripts.length === 0 && ( +
+

No installation scripts available yet.

+
+ )} +
+ +

+ + ← Back to DevMagic + +

+
+
+ ) +} diff --git a/www/app/install/[script]/route.ts b/www/app/install/[script]/route.ts new file mode 100644 index 0000000..cfb9e27 --- /dev/null +++ b/www/app/install/[script]/route.ts @@ -0,0 +1,115 @@ +import { NextRequest, NextResponse } from 'next/server' +import { getInstallScript } from '@/lib/install-scripts' + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ script: string }> } +) { + const { script: scriptId } = await params + + // Extract version from URL if present (e.g., /install/prettier@v1.0.0) + let ref = 'main' + let actualScriptId = scriptId + + const match = scriptId.match(/^(.+)@(.+)$/) + if (match && match[1] && match[2]) { + actualScriptId = match[1] + ref = match[2] + } + + // Get script metadata + const scriptMeta = getInstallScript(actualScriptId) + if (!scriptMeta) { + return new NextResponse(`Install script not found: ${actualScriptId}`, { + status: 404, + headers: { + 'Content-Type': 'text/plain', + }, + }) + } + + // Extract package manager from query params + const packageManager = request.nextUrl.searchParams.get('pm') || 'pnpm' + + // Validate package manager + const validPackageManagers = ['pnpm', 'npm', 'yarn', 'bun'] + if (!validPackageManagers.includes(packageManager)) { + return new NextResponse( + `Invalid package manager: ${packageManager}. Supported: ${validPackageManagers.join(', ')}`, + { + status: 400, + headers: { + 'Content-Type': 'text/plain', + }, + } + ) + } + + // Construct the GitHub raw URL + const scriptUrl = `https://raw.githubusercontent.com/marcelocra/devmagic/${ref}/${scriptMeta.scriptPath}` + + try { + // Fetch the script from GitHub + const response = await fetch(scriptUrl) + + if (!response.ok) { + return new NextResponse( + `Installation script not found for version: ${ref}\nScript: ${scriptMeta.name}`, + { + status: 404, + headers: { + 'Content-Type': 'text/plain', + }, + } + ) + } + + let script = await response.text() + + // If the script supports package managers, inject the PACKAGE_MANAGER variable + if (scriptMeta.supportsPackageManagers && packageManager !== 'pnpm') { + // Add the package manager as an environment variable at the top of the script + // Find the first non-shebang, non-comment line + const lines = script.split('\n') + let insertIndex = 0 + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim() + if (line && !line.startsWith('#')) { + insertIndex = i + break + } + if (i > 0 && !line.startsWith('#')) { + insertIndex = i + break + } + } + + // Insert the environment variable + lines.splice(insertIndex, 0, `export PACKAGE_MANAGER="${packageManager}"`) + script = lines.join('\n') + } + + // Serve the script as plain text + return new NextResponse(script, { + status: 200, + headers: { + 'Content-Type': 'text/plain; charset=utf-8', + 'Cache-Control': ref === 'main' ? 'public, max-age=300' : 'public, max-age=31536000', + 'X-DevMagic-Version': ref, + 'X-DevMagic-Script': actualScriptId, + 'X-DevMagic-PackageManager': packageManager, + }, + }) + } catch (error) { + return new NextResponse( + `Error fetching installation script: ${error instanceof Error ? error.message : 'Unknown error'}`, + { + status: 500, + headers: { + 'Content-Type': 'text/plain', + }, + } + ) + } +} diff --git a/www/data/install-scripts.yml b/www/data/install-scripts.yml new file mode 100644 index 0000000..4f0b73a --- /dev/null +++ b/www/data/install-scripts.yml @@ -0,0 +1,22 @@ +# DevMagic Install Scripts +# These scripts can be run with: curl -fsSL https://devmagic.run/install/{script} | bash +# Query parameters: +# - pm: package manager (pnpm, npm, yarn, bun) - defaults to pnpm + +scripts: + - id: prettier + name: Prettier + description: Install and configure Prettier with Husky and lint-staged for automatic code formatting + scriptPath: setup/install-prettier.sh + supportsPackageManagers: true + steps: + - Install Prettier with exact version + - Create .prettierrc and .prettierignore files + - Create .editorconfig file + - Install and configure Husky + - Install and configure lint-staged + - Add lint-staged configuration to package.json + - Create GitHub Actions workflow for format checking + requirements: + - Node.js project with package.json + - Git repository (for Husky) diff --git a/www/lib/install-scripts.ts b/www/lib/install-scripts.ts new file mode 100644 index 0000000..7d5dc38 --- /dev/null +++ b/www/lib/install-scripts.ts @@ -0,0 +1,40 @@ +import { readFileSync } from "fs"; +import { join } from "path"; +import yaml from "js-yaml"; + +export interface InstallScript { + id: string; + name: string; + description: string; + scriptPath: string; + supportsPackageManagers?: boolean; + steps: string[]; + requirements?: string[]; +} + +interface InstallScriptsData { + scripts: InstallScript[]; +} + +/** + * Load install scripts from www/data/install-scripts.yml + */ +export function loadInstallScripts(): InstallScript[] { + const installScriptsPath = join(process.cwd(), "data", "install-scripts.yml"); + + try { + const content = readFileSync(installScriptsPath, "utf-8"); + const data = yaml.load(content, { schema: yaml.FAILSAFE_SCHEMA }) as InstallScriptsData; + return data?.scripts ?? []; + } catch { + return []; + } +} + +/** + * Get a specific install script by ID + */ +export function getInstallScript(id: string): InstallScript | undefined { + const scripts = loadInstallScripts(); + return scripts.find((script) => script.id === id); +} diff --git a/www/pnpm-lock.yaml b/www/pnpm-lock.yaml index 5c239a1..73a8460 100644 --- a/www/pnpm-lock.yaml +++ b/www/pnpm-lock.yaml @@ -8,9 +8,15 @@ importers: .: dependencies: + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 next: - specifier: 16.0.3 - version: 16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: 16.0.7 + version: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next-intl: + specifier: ^4.5.6 + version: 4.6.1(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: 19.2.0 version: 19.2.0 @@ -21,6 +27,9 @@ importers: '@tailwindcss/postcss': specifier: ^4 version: 4.1.17 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 '@types/node': specifier: ^20 version: 20.19.25 @@ -163,6 +172,24 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@formatjs/ecma402-abstract@2.3.6': + resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} + + '@formatjs/fast-memoize@2.2.7': + resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} + + '@formatjs/icu-messageformat-parser@2.11.4': + resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} + + '@formatjs/icu-skeleton-parser@1.8.16': + resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} + + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + + '@formatjs/intl-localematcher@0.6.2': + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -335,56 +362,56 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/env@16.0.3': - resolution: {integrity: sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==} + '@next/env@16.0.7': + resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} '@next/eslint-plugin-next@16.0.3': resolution: {integrity: sha512-6sPWmZetzFWMsz7Dhuxsdmbu3fK+/AxKRtj7OB0/3OZAI2MHB/v2FeYh271LZ9abvnM1WIwWc/5umYjx0jo5sQ==} - '@next/swc-darwin-arm64@16.0.3': - resolution: {integrity: sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==} + '@next/swc-darwin-arm64@16.0.7': + resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.3': - resolution: {integrity: sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==} + '@next/swc-darwin-x64@16.0.7': + resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.3': - resolution: {integrity: sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==} + '@next/swc-linux-arm64-gnu@16.0.7': + resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.3': - resolution: {integrity: sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==} + '@next/swc-linux-arm64-musl@16.0.7': + resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.3': - resolution: {integrity: sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==} + '@next/swc-linux-x64-gnu@16.0.7': + resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.3': - resolution: {integrity: sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==} + '@next/swc-linux-x64-musl@16.0.7': + resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.3': - resolution: {integrity: sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==} + '@next/swc-win32-arm64-msvc@16.0.7': + resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.3': - resolution: {integrity: sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==} + '@next/swc-win32-x64-msvc@16.0.7': + resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -405,12 +432,172 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@schummar/icu-type-parser@1.21.5': + resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} + + '@swc/core-darwin-arm64@1.15.7': + resolution: {integrity: sha512-+hNVUfezUid7LeSHqnhoC6Gh3BROABxjlDNInuZ/fie1RUxaEX4qzDwdTgozJELgHhvYxyPIg1ro8ibnKtgO4g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.7': + resolution: {integrity: sha512-ZAFuvtSYZTuXPcrhanaD5eyp27H8LlDzx2NAeVyH0FchYcuXf0h5/k3GL9ZU6Jw9eQ63R1E8KBgpXEJlgRwZUQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.7': + resolution: {integrity: sha512-K3HTYocpqnOw8KcD8SBFxiDHjIma7G/X+bLdfWqf+qzETNBrzOub/IEkq9UaeupaJiZJkPptr/2EhEXXWryS/A==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.7': + resolution: {integrity: sha512-HCnVIlsLnCtQ3uXcXgWrvQ6SAraskLA9QJo9ykTnqTH6TvUYqEta+TdTdGjzngD6TOE7XjlAiUs/RBtU8Z0t+Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.7': + resolution: {integrity: sha512-/OOp9UZBg4v2q9+x/U21Jtld0Wb8ghzBScwhscI7YvoSh4E8RALaJ1msV8V8AKkBkZH7FUAFB7Vbv0oVzZsezA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.7': + resolution: {integrity: sha512-VBbs4gtD4XQxrHuQ2/2+TDZpPQQgrOHYRnS6SyJW+dw0Nj/OomRqH+n5Z4e/TgKRRbieufipeIGvADYC/90PYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.7': + resolution: {integrity: sha512-kVuy2unodso6p0rMauS2zby8/bhzoGRYxBDyD6i2tls/fEYAE74oP0VPFzxIyHaIjK1SN6u5TgvV9MpyJ5xVug==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.7': + resolution: {integrity: sha512-uddYoo5Xmo1XKLhAnh4NBIyy5d0xk33x1sX3nIJboFySLNz878ksCFCZ3IBqrt1Za0gaoIWoOSSSk0eNhAc/sw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.7': + resolution: {integrity: sha512-rqq8JjNMLx3QNlh0aPTtN/4+BGLEHC94rj9mkH1stoNRf3ra6IksNHMHy+V1HUqElEgcZyx+0yeXx3eLOTcoFw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.7': + resolution: {integrity: sha512-4BK06EGdPnuplgcNhmSbOIiLdRgHYX3v1nl4HXo5uo4GZMfllXaCyBUes+0ePRfwbn9OFgVhCWPcYYjMT6hycQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.7': + resolution: {integrity: sha512-kTGB8XI7P+pTKW83tnUEDVP4zduF951u3UAOn5eTi0vyW6MvL56A3+ggMdfuVFtDI0/DsbSzf5z34HVBbuScWw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@tailwindcss/node@4.1.17': resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} @@ -505,6 +692,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -851,6 +1041,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -862,6 +1055,11 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1208,6 +1406,9 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + intl-messageformat@10.7.18: + resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1498,9 +1699,27 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@16.0.3: - resolution: {integrity: sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-intl-swc-plugin-extractor@4.6.1: + resolution: {integrity: sha512-+HHNeVERfSvuPDF7LYVn3pxst5Rf7EYdUTw7C7WIrYhcLaKiZ1b9oSRkTQddAN3mifDMCfHqO4kAQ/pcKiBl3A==} + + next-intl@4.6.1: + resolution: {integrity: sha512-KlWgWtKLBPUsTPgxqwyjws1wCMD2QKxLlVjeeGj53DC1JWfKmBShKOrhIP0NznZrRQ0GleeoDUeHSETmyyIFeA==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + next@16.0.7: + resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} engines: {node: '>=20.9.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -1519,6 +1738,9 @@ packages: sass: optional: true + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -1596,6 +1818,9 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + po-parser@2.0.0: + resolution: {integrity: sha512-SZvoKi3PoI/hHa2V9je9CW7Xgxl4dvO74cvaa6tWShIHT51FkPxje6pt0gTJznJrU67ix91nDaQp2hUxkOYhKA==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -1870,6 +2095,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-intl@4.6.1: + resolution: {integrity: sha512-mUIj6QvJZ7Rk33mLDxRziz1YiBBAnIji8YW4TXXMdYHtaPEbVucrXD3iKQGAqJhbVn0VnjrEtIKYO1B18mfSJw==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -2077,6 +2307,36 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@formatjs/ecma402-abstract@2.3.6': + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/intl-localematcher': 0.6.2 + decimal.js: 10.6.0 + tslib: 2.8.1 + + '@formatjs/fast-memoize@2.2.7': + dependencies: + tslib: 2.8.1 + + '@formatjs/icu-messageformat-parser@2.11.4': + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-skeleton-parser': 1.8.16 + tslib: 2.8.1 + + '@formatjs/icu-skeleton-parser@1.8.16': + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.6.2': + dependencies: + tslib: 2.8.1 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -2211,34 +2471,34 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.0.3': {} + '@next/env@16.0.7': {} '@next/eslint-plugin-next@16.0.3': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@16.0.3': + '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@16.0.3': + '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.3': + '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@16.0.3': + '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@16.0.3': + '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@16.0.3': + '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.3': + '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@16.0.3': + '@next/swc-win32-x64-msvc@16.0.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -2255,12 +2515,126 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + '@rtsao/scc@1.1.0': {} + '@schummar/icu-type-parser@1.21.5': {} + + '@swc/core-darwin-arm64@1.15.7': + optional: true + + '@swc/core-darwin-x64@1.15.7': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.7': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.7': + optional: true + + '@swc/core-linux-arm64-musl@1.15.7': + optional: true + + '@swc/core-linux-x64-gnu@1.15.7': + optional: true + + '@swc/core-linux-x64-musl@1.15.7': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.7': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.7': + optional: true + + '@swc/core-win32-x64-msvc@1.15.7': + optional: true + + '@swc/core@1.15.7': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.7 + '@swc/core-darwin-x64': 1.15.7 + '@swc/core-linux-arm-gnueabihf': 1.15.7 + '@swc/core-linux-arm64-gnu': 1.15.7 + '@swc/core-linux-arm64-musl': 1.15.7 + '@swc/core-linux-x64-gnu': 1.15.7 + '@swc/core-linux-x64-musl': 1.15.7 + '@swc/core-win32-arm64-msvc': 1.15.7 + '@swc/core-win32-ia32-msvc': 1.15.7 + '@swc/core-win32-x64-msvc': 1.15.7 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/node@4.1.17': dependencies: '@jridgewell/remapping': 2.3.5 @@ -2337,6 +2711,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -2704,6 +3080,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + deep-is@0.1.4: {} define-data-property@1.1.4: @@ -2718,6 +3096,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + detect-libc@1.0.3: {} + detect-libc@2.1.2: {} doctrine@2.1.0: @@ -3214,6 +3594,13 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + intl-messageformat@10.7.18: + dependencies: + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/fast-memoize': 2.2.7 + '@formatjs/icu-messageformat-parser': 2.11.4 + tslib: 2.8.1 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -3477,9 +3864,29 @@ snapshots: natural-compare@1.4.0: {} - next@16.0.3(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + negotiator@1.0.0: {} + + next-intl-swc-plugin-extractor@4.6.1: {} + + next-intl@4.6.1(next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + dependencies: + '@formatjs/intl-localematcher': 0.5.10 + '@parcel/watcher': 2.5.1 + '@swc/core': 1.15.7 + negotiator: 1.0.0 + next: 16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next-intl-swc-plugin-extractor: 4.6.1 + po-parser: 2.0.0 + react: 19.2.0 + use-intl: 4.6.1(react@19.2.0) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@swc/helpers' + + next@16.0.7(@babel/core@7.28.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 16.0.3 + '@next/env': 16.0.7 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001756 postcss: 8.4.31 @@ -3487,19 +3894,21 @@ snapshots: react-dom: 19.2.0(react@19.2.0) styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.3 - '@next/swc-darwin-x64': 16.0.3 - '@next/swc-linux-arm64-gnu': 16.0.3 - '@next/swc-linux-arm64-musl': 16.0.3 - '@next/swc-linux-x64-gnu': 16.0.3 - '@next/swc-linux-x64-musl': 16.0.3 - '@next/swc-win32-arm64-msvc': 16.0.3 - '@next/swc-win32-x64-msvc': 16.0.3 + '@next/swc-darwin-arm64': 16.0.7 + '@next/swc-darwin-x64': 16.0.7 + '@next/swc-linux-arm64-gnu': 16.0.7 + '@next/swc-linux-arm64-musl': 16.0.7 + '@next/swc-linux-x64-gnu': 16.0.7 + '@next/swc-linux-x64-musl': 16.0.7 + '@next/swc-win32-arm64-msvc': 16.0.7 + '@next/swc-win32-x64-msvc': 16.0.7 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + node-addon-api@7.1.1: {} + node-releases@2.0.27: {} object-assign@4.1.1: {} @@ -3583,6 +3992,8 @@ snapshots: picomatch@4.0.3: {} + po-parser@2.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.4.31: @@ -3968,6 +4379,13 @@ snapshots: dependencies: punycode: 2.3.1 + use-intl@4.6.1(react@19.2.0): + dependencies: + '@formatjs/fast-memoize': 2.2.7 + '@schummar/icu-type-parser': 1.21.5 + intl-messageformat: 10.7.18 + react: 19.2.0 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0