mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-04-22 07:57:55 +00:00
chore(project): Update dependencies, vite config, and clean up repository
This commit is contained in:
@@ -1,313 +0,0 @@
|
|||||||
name: Security Check
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# Automated Security Scanning
|
|
||||||
# ========================================
|
|
||||||
# This workflow runs on every PR and push to main
|
|
||||||
# Optimized to not fail on optional security tools
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, develop ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main, develop ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# ========================================
|
|
||||||
# CRITICAL: FILE VALIDATION
|
|
||||||
# ========================================
|
|
||||||
file-validation:
|
|
||||||
name: Critical File Validation
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Check for .env files
|
|
||||||
run: |
|
|
||||||
echo "==> Checking for .env files..."
|
|
||||||
if git ls-files | grep -E "^\.env$"; then
|
|
||||||
echo "ERROR: .env file found in repository!"
|
|
||||||
echo "This file contains sensitive data and must not be committed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "SUCCESS: No .env files in repository"
|
|
||||||
|
|
||||||
- name: Check for sensitive files
|
|
||||||
run: |
|
|
||||||
echo "==> Checking for sensitive files..."
|
|
||||||
|
|
||||||
# Files that should never be committed
|
|
||||||
sensitive_files=(
|
|
||||||
"*.key"
|
|
||||||
"*.pem"
|
|
||||||
"*.cert"
|
|
||||||
"*.p12"
|
|
||||||
"*.pfx"
|
|
||||||
)
|
|
||||||
|
|
||||||
found_sensitive=false
|
|
||||||
for pattern in "${sensitive_files[@]}"; do
|
|
||||||
# Exclude node_modules and .github
|
|
||||||
files=$(git ls-files | grep -i "$pattern" | grep -v "node_modules" | grep -v ".github" || true)
|
|
||||||
if [ -n "$files" ]; then
|
|
||||||
echo "WARNING: Sensitive file pattern found: $pattern"
|
|
||||||
echo "$files"
|
|
||||||
found_sensitive=true
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$found_sensitive" = true ]; then
|
|
||||||
echo "ERROR: Sensitive files detected. Please remove them."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "SUCCESS: No sensitive files found"
|
|
||||||
|
|
||||||
- name: Verify .gitignore
|
|
||||||
run: |
|
|
||||||
echo "==> Verifying .gitignore configuration..."
|
|
||||||
if ! grep -q "^\.env$" .gitignore; then
|
|
||||||
echo "ERROR: .env not found in .gitignore!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! grep -q "^\.env\.\*$" .gitignore; then
|
|
||||||
echo "WARNING: .env.* pattern not in .gitignore"
|
|
||||||
fi
|
|
||||||
echo "SUCCESS: .gitignore properly configured"
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# CRITICAL: ENVIRONMENT VALIDATION
|
|
||||||
# ========================================
|
|
||||||
env-validation:
|
|
||||||
name: Environment Configuration
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Verify .env.example exists
|
|
||||||
run: |
|
|
||||||
echo "==> Checking for .env.example..."
|
|
||||||
if [ ! -f .env.example ]; then
|
|
||||||
echo "ERROR: .env.example not found!"
|
|
||||||
echo "Please create .env.example with safe placeholder values"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "SUCCESS: .env.example exists"
|
|
||||||
|
|
||||||
- name: Check .env.example for real secrets
|
|
||||||
run: |
|
|
||||||
echo "==> Validating .env.example content..."
|
|
||||||
|
|
||||||
# .env.example should NOT contain real long secrets
|
|
||||||
if grep -E "(password|key|secret|token)=.{30,}" .env.example | grep -v "your_"; then
|
|
||||||
echo "WARNING: .env.example may contain real credentials!"
|
|
||||||
echo "Example files should only have placeholder values"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "SUCCESS: .env.example contains no real secrets"
|
|
||||||
|
|
||||||
- name: Validate environment variable usage
|
|
||||||
run: |
|
|
||||||
echo "==> Checking environment variable usage..."
|
|
||||||
|
|
||||||
if [ -f "src/contexts/AuthContext.tsx" ]; then
|
|
||||||
if grep -q "import.meta.env" src/contexts/AuthContext.tsx; then
|
|
||||||
echo "SUCCESS: AuthContext uses environment variables"
|
|
||||||
else
|
|
||||||
echo "WARNING: AuthContext may not use environment variables"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# CODE SECURITY ANALYSIS
|
|
||||||
# ========================================
|
|
||||||
code-security:
|
|
||||||
name: Code Security Analysis
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Check for hardcoded secrets
|
|
||||||
run: |
|
|
||||||
echo "==> Scanning for hardcoded secrets in code..."
|
|
||||||
|
|
||||||
has_issues=false
|
|
||||||
|
|
||||||
# Check for hardcoded passwords (8+ chars)
|
|
||||||
if grep -r "password\s*=\s*['\"][^'\"]\{8,\}['\"]" src/ --include="*.ts" --include="*.tsx" | grep -v "import.meta.env" | grep -v "placeholder" | grep -v "example"; then
|
|
||||||
echo "WARNING: Potential hardcoded password found"
|
|
||||||
has_issues=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for hardcoded API keys (20+ chars)
|
|
||||||
if grep -r "api[_-]\?key\s*=\s*['\"][^'\"]\{20,\}['\"]" src/ --include="*.ts" --include="*.tsx" | grep -v "import.meta.env" | grep -v "your_"; then
|
|
||||||
echo "WARNING: Potential hardcoded API key found"
|
|
||||||
has_issues=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$has_issues" = false ]; then
|
|
||||||
echo "SUCCESS: No hardcoded secrets detected"
|
|
||||||
else
|
|
||||||
echo "Please use environment variables for sensitive data"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Check for console.log statements
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
echo "==> Checking for console.log statements..."
|
|
||||||
if grep -r "console\.log" src/ --include="*.ts" --include="*.tsx" | head -10; then
|
|
||||||
echo "INFO: console.log statements found (consider removing for production)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# DEPENDENCY SECURITY
|
|
||||||
# ========================================
|
|
||||||
dependency-security:
|
|
||||||
name: Dependency Security Audit
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run npm audit
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
echo "==> Running npm audit..."
|
|
||||||
npm audit --audit-level=high || echo "WARNING: Vulnerabilities found, please review"
|
|
||||||
|
|
||||||
- name: Check for outdated critical packages
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
echo "==> Checking for outdated packages..."
|
|
||||||
npm outdated || true
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# OPTIONAL: ADVANCED SECRET SCANNING
|
|
||||||
# ========================================
|
|
||||||
advanced-secret-scan:
|
|
||||||
name: Advanced Secret Scanning (Optional)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: TruffleHog Secret Scan
|
|
||||||
continue-on-error: true
|
|
||||||
uses: trufflesecurity/trufflehog@main
|
|
||||||
with:
|
|
||||||
path: ./
|
|
||||||
base: ${{ github.event.repository.default_branch }}
|
|
||||||
head: HEAD
|
|
||||||
|
|
||||||
- name: Gitleaks Secret Scan
|
|
||||||
if: ${{ secrets.GITLEAKS_LICENSE != '' }}
|
|
||||||
continue-on-error: true
|
|
||||||
uses: gitleaks/gitleaks-action@v2
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
|
|
||||||
|
|
||||||
- name: Basic Pattern Check
|
|
||||||
run: |
|
|
||||||
echo "==> Running basic secret pattern check..."
|
|
||||||
if git diff-tree --no-commit-id --name-only -r HEAD 2>/dev/null | xargs grep -E "(password|secret|api[_-]?key|token)\s*=\s*['\"][A-Za-z0-9]{20,}['\"]" 2>/dev/null; then
|
|
||||||
echo "INFO: Potential secrets detected, please review"
|
|
||||||
else
|
|
||||||
echo "SUCCESS: No obvious secrets in recent changes"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# OPTIONAL: SNYK VULNERABILITY SCAN
|
|
||||||
# ========================================
|
|
||||||
snyk-scan:
|
|
||||||
name: Snyk Vulnerability Scan (Optional)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ secrets.SNYK_TOKEN != '' }}
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: Run Snyk
|
|
||||||
uses: snyk/actions/node@master
|
|
||||||
continue-on-error: true
|
|
||||||
env:
|
|
||||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
||||||
with:
|
|
||||||
args: --severity-threshold=high
|
|
||||||
|
|
||||||
# ========================================
|
|
||||||
# SUMMARY
|
|
||||||
# ========================================
|
|
||||||
security-summary:
|
|
||||||
name: Security Summary
|
|
||||||
needs: [file-validation, env-validation, code-security, dependency-security]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: always()
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Print Summary
|
|
||||||
run: |
|
|
||||||
echo "=========================================="
|
|
||||||
echo "Security Check Summary"
|
|
||||||
echo "=========================================="
|
|
||||||
echo ""
|
|
||||||
echo "Critical Checks:"
|
|
||||||
echo " File Validation: ${{ needs.file-validation.result }}"
|
|
||||||
echo " Environment Config: ${{ needs.env-validation.result }}"
|
|
||||||
echo ""
|
|
||||||
echo "Code Quality:"
|
|
||||||
echo " Code Security: ${{ needs.code-security.result }}"
|
|
||||||
echo " Dependency Security: ${{ needs.dependency-security.result }}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Fail if critical checks failed
|
|
||||||
if [ "${{ needs.file-validation.result }}" != "success" ] || \
|
|
||||||
[ "${{ needs.env-validation.result }}" != "success" ]; then
|
|
||||||
echo "=========================================="
|
|
||||||
echo "CRITICAL SECURITY ISSUES DETECTED!"
|
|
||||||
echo "=========================================="
|
|
||||||
echo ""
|
|
||||||
echo "Please fix the issues above before merging"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "=========================================="
|
|
||||||
echo "All critical security checks passed!"
|
|
||||||
echo "=========================================="
|
|
||||||
+11
@@ -137,3 +137,14 @@ dist
|
|||||||
# Vite logs files
|
# Vite logs files
|
||||||
vite.config.js.timestamp-*
|
vite.config.js.timestamp-*
|
||||||
vite.config.ts.timestamp-*
|
vite.config.ts.timestamp-*
|
||||||
|
|
||||||
|
# Local analysis and documentation
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
COMMISSION_SYSTEM_SUMMARY -
|
||||||
|
Copy.md:Zone.Identifier
|
||||||
|
|
||||||
|
# Local analysis and documentation
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
COMMISSION_SYSTEM_SUMMARY - Copy.md:Zone.Identifier
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
# CLAUDE İÇİN KRİTİK BİLGİLER - BUNU ÖNCE OKU!
|
|
||||||
|
|
||||||
## ⚠️ ÇOK ÖNEMLİ - DOKUNMA!
|
|
||||||
|
|
||||||
Bu sistem günlerdir emek verilerek kurulmuştur. Eğer nasıl çalıştığını BİLMİYORSAN hiçbir şeyi **DURDURMA** veya **DEĞİŞTİRME**!
|
|
||||||
|
|
||||||
## MEVCUT ÇALIŞAN SİSTEM
|
|
||||||
|
|
||||||
### VPS (37.60.230.9) - pezkuwi-vps
|
|
||||||
|
|
||||||
**ÇOK ÖNEMLİ:** VPS'te 7 validator çalışıyor ve blok finalize ediyorlar. **BUNLARA DOKUNMA!**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# VPS'teki validator durumunu kontrol et:
|
|
||||||
ssh pezkuwi-vps "ps aux | grep -E '[p]ezkuwi.*validator'"
|
|
||||||
|
|
||||||
# Blockchain durumunu kontrol et:
|
|
||||||
ssh pezkuwi-vps "tail -30 /tmp/validator-1.log | grep -E '(peers|finalized)' | tail -5"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Çalışan validatorlar:**
|
|
||||||
- VPS-Validator-1 (Bootnode): Port 30333, RPC 9944
|
|
||||||
- VPS-Validator-2: Port 30334, RPC 9945
|
|
||||||
- VPS-Validator-3: Port 30335, RPC 9946
|
|
||||||
- VPS-Validator-4: Port 30336, RPC 9947
|
|
||||||
- VPS-Validator-5: Port 30337, RPC 9948
|
|
||||||
- VPS-Validator-6: Port 30338, RPC 9949
|
|
||||||
- VPS-Validator-7: Port 30339, RPC 9950
|
|
||||||
|
|
||||||
**Chain Spec:** `/root/pezkuwi-sdk/chain-specs/beta/beta-testnet-raw.json`
|
|
||||||
|
|
||||||
**Başlatma scripti:** `/tmp/start-vps-with-public-addr.sh`
|
|
||||||
|
|
||||||
**Bootnode Peer ID:** `12D3KooWRyg1V1ay7aFbHWdpzYMnT3Nk6RLdM8GceqVQzp1GoEgZ`
|
|
||||||
|
|
||||||
### Local PC - 8. Validator (Planlanmış)
|
|
||||||
|
|
||||||
Local PC'den 8. validator VPS blockchain'e bağlanacak:
|
|
||||||
- Script: `/tmp/start-local-validator-8.sh`
|
|
||||||
- Bootnode: `/ip4/37.60.230.9/tcp/30333/p2p/12D3KooWRyg1V1ay7aFbHWdpzYMnT3Nk6RLdM8GceqVQzp1GoEgZ`
|
|
||||||
|
|
||||||
## FRONTEND DEPLOYMENT (VPS)
|
|
||||||
|
|
||||||
### Production Build Location
|
|
||||||
```
|
|
||||||
Kaynak: /home/mamostehp/pwap/web
|
|
||||||
Build: npm run build
|
|
||||||
Deploy: /var/www/pezkuwichain/web/dist/
|
|
||||||
```
|
|
||||||
|
|
||||||
### Environment
|
|
||||||
```
|
|
||||||
VITE_NETWORK=testnet
|
|
||||||
VITE_WS_ENDPOINT_TESTNET=wss://ws.pezkuwichain.io
|
|
||||||
VITE_API_BASE_URL=https://api.pezkuwichain.io/api
|
|
||||||
```
|
|
||||||
|
|
||||||
### Nginx Config
|
|
||||||
```
|
|
||||||
Server: /etc/nginx/sites-available/pezkuwichain.io
|
|
||||||
Root: /var/www/pezkuwichain/web/dist
|
|
||||||
SSL: /etc/letsencrypt/live/pezkuwichain.io/
|
|
||||||
```
|
|
||||||
|
|
||||||
### WebSocket Proxy
|
|
||||||
```nginx
|
|
||||||
location /ws {
|
|
||||||
proxy_pass http://127.0.0.1:9944;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "upgrade";
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## YASAKLAR - BUNLARI YAPMA!
|
|
||||||
|
|
||||||
1. ❌ **VPS'teki validatorları DURDURMA!** Blockchain çalışıyor, bozma!
|
|
||||||
2. ❌ **Chain spec değiştirme!** `/root/pezkuwi-sdk/chain-specs/beta/beta-testnet-raw.json` kullan
|
|
||||||
3. ❌ **Blockchain restart etme!** Eğer gerçekten gerekiyorsa ÖNCE KULLANICIYA SOR
|
|
||||||
4. ❌ **Base path değiştirme!** VPS: `/root/pezkuwi-data/beta-testnet/`
|
|
||||||
5. ❌ **Varsayımla iş yapma!** Bilmiyorsan SOR!
|
|
||||||
|
|
||||||
## SAĞLIKLI BLOCKCHAIN KONTROLÜ
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. VPS'te validator sayısı (7 olmalı)
|
|
||||||
ssh pezkuwi-vps "ps aux | grep -E '[p]ezkuwi.*validator' | wc -l"
|
|
||||||
|
|
||||||
# 2. Peer sayısı (6 olmalı - 7 validator birbirine bağlı)
|
|
||||||
ssh pezkuwi-vps "tail -30 /tmp/validator-1.log | grep -E 'peers' | tail -1"
|
|
||||||
|
|
||||||
# 3. Block finalization (devam ediyor mu?)
|
|
||||||
ssh pezkuwi-vps "tail -30 /tmp/validator-1.log | grep -E 'finalized' | tail -3"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Sağlıklı output örneği:**
|
|
||||||
```
|
|
||||||
💤 Idle (6 peers), best: #5722, finalized #5720, ⬇ 10.0kiB/s ⬆ 21.2kiB/s
|
|
||||||
```
|
|
||||||
|
|
||||||
## FRONTEND DEPLOYMENT ADIM ADIM
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Local PC'de build (pwap/web klasöründe)
|
|
||||||
cd /home/mamostehp/pwap/web
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
# 2. VPS'e deploy
|
|
||||||
rsync -avz dist/ pezkuwi-vps:/var/www/pezkuwichain/web/dist/
|
|
||||||
|
|
||||||
# 3. Nginx reload (gerekirse)
|
|
||||||
ssh pezkuwi-vps "systemctl reload nginx"
|
|
||||||
|
|
||||||
# 4. Kontrol
|
|
||||||
curl -I https://pezkuwichain.io
|
|
||||||
```
|
|
||||||
|
|
||||||
## SORUN GİDERME
|
|
||||||
|
|
||||||
### Frontend "connecting network" gösteriyor
|
|
||||||
1. Blockchain çalışıyor mu kontrol et (yukarıdaki komutlar)
|
|
||||||
2. WebSocket proxy çalışıyor mu: `curl -I http://37.60.230.9:9944`
|
|
||||||
3. SSL çalışıyor mu: `curl -I https://pezkuwichain.io`
|
|
||||||
|
|
||||||
### Blockchain blok üretmiyor
|
|
||||||
- **ÖNCE KULLANICIYA SOR!** Kendi başına restart etme!
|
|
||||||
- Peer sayısını kontrol et
|
|
||||||
- Session keys set edilmiş mi kontrol et
|
|
||||||
|
|
||||||
## CLAUDE, BU KURALLAR SANA:
|
|
||||||
|
|
||||||
1. **Eğer bir şey çalışıyorsa DOKUNMA!**
|
|
||||||
2. **Bilmiyorsan ÖNCE SOR, sonra yap**
|
|
||||||
3. **Varsayım yapma, kanıt topla**
|
|
||||||
4. **Kritik işlemlerde ONAY AL**
|
|
||||||
5. **Bu dosyayı her session başında OKU**
|
|
||||||
|
|
||||||
## SON GÜNCELLEME
|
|
||||||
|
|
||||||
Tarih: 2025-11-16
|
|
||||||
Durum: VPS'te 7 validator çalışıyor, blok finalize ediliyor
|
|
||||||
Son Blok: #5722 (finalized #5720)
|
|
||||||
Peer Count: 6 peers
|
|
||||||
@@ -1,420 +0,0 @@
|
|||||||
# 🚀 Production Readiness Report
|
|
||||||
**PezkuwiChain Mobile App - Digital Kurdistan**
|
|
||||||
|
|
||||||
Generated: 2025-11-15
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ OVERALL STATUS: PRODUCTION READY (95%)
|
|
||||||
|
|
||||||
The PezkuwiChain mobile application is **95% production ready** with world-class features for Digital Kurdistan citizens.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📱 MOBILE APP - Feature Completeness
|
|
||||||
|
|
||||||
### ✅ Completed Features (95%)
|
|
||||||
|
|
||||||
#### Core Authentication & Security (100%)
|
|
||||||
- ✅ Multi-language welcome screen (6 languages)
|
|
||||||
- ✅ Sign In / Sign Up with Supabase
|
|
||||||
- ✅ **Bank-grade biometric authentication** (Face ID/Touch ID/Fingerprint)
|
|
||||||
- ✅ **Encrypted PIN code backup** (device-only)
|
|
||||||
- ✅ **Auto-lock timer** (0min - Never)
|
|
||||||
- ✅ **Lock screen** with beautiful UI
|
|
||||||
- ✅ Privacy-first architecture (zero server data transmission)
|
|
||||||
|
|
||||||
#### Wallet Features (100%)
|
|
||||||
- ✅ Polkadot.js integration
|
|
||||||
- ✅ Live blockchain data (HEZ, PEZ, USDT)
|
|
||||||
- ✅ Multi-token support
|
|
||||||
- ✅ Send/Receive transactions
|
|
||||||
- ✅ QR code scanning
|
|
||||||
- ✅ Transaction signing
|
|
||||||
- ✅ Balance tracking
|
|
||||||
|
|
||||||
#### Staking (100%)
|
|
||||||
- ✅ View staked amount
|
|
||||||
- ✅ Stake/Unstake interface
|
|
||||||
- ✅ Tiki score calculation
|
|
||||||
- ✅ Monthly PEZ rewards
|
|
||||||
- ✅ APY estimation
|
|
||||||
- ✅ Unbonding status
|
|
||||||
- ✅ Live data from blockchain
|
|
||||||
|
|
||||||
#### Governance (100%)
|
|
||||||
- ✅ Active proposals list
|
|
||||||
- ✅ Vote FOR/AGAINST
|
|
||||||
- ✅ Real-time voting stats
|
|
||||||
- ✅ Vote progress visualization
|
|
||||||
- ✅ Proposal details
|
|
||||||
- ✅ Democratic participation
|
|
||||||
|
|
||||||
#### NFT Gallery (100%)
|
|
||||||
- ✅ Citizenship NFT display
|
|
||||||
- ✅ Tiki role badges
|
|
||||||
- ✅ Achievement NFTs
|
|
||||||
- ✅ Grid layout (OpenSea-style)
|
|
||||||
- ✅ Rarity system
|
|
||||||
- ✅ Filter tabs
|
|
||||||
- ✅ NFT details modal
|
|
||||||
- ✅ Metadata display
|
|
||||||
|
|
||||||
#### Citizenship (100%)
|
|
||||||
- ✅ Be Citizen application
|
|
||||||
- ✅ KYC form with encryption
|
|
||||||
- ✅ Blockchain submission
|
|
||||||
- ✅ Status tracking
|
|
||||||
- ✅ Region selection
|
|
||||||
- ✅ Data privacy (AES-GCM)
|
|
||||||
|
|
||||||
#### Referral System (100%)
|
|
||||||
- ✅ Referral code generation
|
|
||||||
- ✅ Share functionality
|
|
||||||
- ✅ Stats tracking
|
|
||||||
- ✅ Referred users list
|
|
||||||
- ✅ Rewards claiming
|
|
||||||
|
|
||||||
#### Profile & Settings (90%)
|
|
||||||
- ✅ Profile management
|
|
||||||
- ✅ Security settings
|
|
||||||
- ✅ Language preferences
|
|
||||||
- ✅ Notification settings
|
|
||||||
- ⏳ Dark mode toggle (pending)
|
|
||||||
- ⏳ Currency preferences (pending)
|
|
||||||
|
|
||||||
### ⏳ Pending Features (5%)
|
|
||||||
|
|
||||||
#### To Be Completed
|
|
||||||
- [ ] DEX/Swap screen (token swapping)
|
|
||||||
- [ ] Transaction history (enhanced with filters)
|
|
||||||
- [ ] Push notifications system
|
|
||||||
- [ ] Multi-account management
|
|
||||||
- [ ] Address book
|
|
||||||
- [ ] Dark mode implementation
|
|
||||||
- [ ] Onboarding tutorial
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 UI/UX Quality
|
|
||||||
|
|
||||||
### ✅ Design System (100%)
|
|
||||||
- ✅ **Modern component library** (6 core components)
|
|
||||||
- ✅ **Kurdistan color palette** throughout
|
|
||||||
- ✅ **Material Design 3** inspired
|
|
||||||
- ✅ **Smooth animations** and transitions
|
|
||||||
- ✅ **Accessibility-first** design
|
|
||||||
- ✅ **RTL support** for Arabic, Sorani, Farsi
|
|
||||||
- ✅ **Consistent spacing** and typography
|
|
||||||
|
|
||||||
### ✅ Components (100%)
|
|
||||||
1. **Card** - 3 variants (elevated, outlined, filled)
|
|
||||||
2. **Button** - 5 variants with Kurdistan colors
|
|
||||||
3. **Input** - Floating labels, validation, icons
|
|
||||||
4. **BottomSheet** - Swipe-to-dismiss modals
|
|
||||||
5. **LoadingSkeleton** - Shimmer animations
|
|
||||||
6. **Badge** - Status indicators and labels
|
|
||||||
|
|
||||||
### ✅ User Experience
|
|
||||||
- ✅ Pull-to-refresh on all screens
|
|
||||||
- ✅ Loading states with skeletons
|
|
||||||
- ✅ Error handling with clear messages
|
|
||||||
- ✅ Smooth transitions
|
|
||||||
- ✅ Haptic feedback ready
|
|
||||||
- ✅ Offline-ready architecture
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Security & Privacy
|
|
||||||
|
|
||||||
### ✅ Security Features (100%)
|
|
||||||
- ✅ **Biometric authentication** (Face ID/Touch ID)
|
|
||||||
- ✅ **Encrypted PIN storage** (SecureStore)
|
|
||||||
- ✅ **Auto-lock timer**
|
|
||||||
- ✅ **Session management**
|
|
||||||
- ✅ **Zero server data transmission**
|
|
||||||
- ✅ **AES-GCM encryption** for citizenship data
|
|
||||||
- ✅ **SHA-256 hashing** for commitments
|
|
||||||
|
|
||||||
### ✅ Privacy Guarantees
|
|
||||||
```
|
|
||||||
🔒 ALL DATA STAYS ON DEVICE
|
|
||||||
- Biometric data: iOS/Android secure enclave
|
|
||||||
- PIN code: Encrypted SecureStore (device-only)
|
|
||||||
- Settings: AsyncStorage (local-only)
|
|
||||||
- Auth state: React Context (runtime-only)
|
|
||||||
- NO DATA transmitted to servers
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⛓️ Blockchain Integration
|
|
||||||
|
|
||||||
### ✅ Network Configuration (100%)
|
|
||||||
|
|
||||||
#### Endpoints Configured:
|
|
||||||
1. **Production Mainnet**
|
|
||||||
- RPC: `https://rpc.pezkuwichain.io`
|
|
||||||
- WSS: `wss://mainnet.pezkuwichain.io`
|
|
||||||
|
|
||||||
2. **Beta Testnet** (Currently Active)
|
|
||||||
- RPC: `https://rpc.pezkuwichain.io`
|
|
||||||
- WSS: `wss://rpc.pezkuwichain.io:9944`
|
|
||||||
|
|
||||||
3. **Staging**
|
|
||||||
- WSS: `wss://staging.pezkuwichain.io`
|
|
||||||
- Port: 9945
|
|
||||||
|
|
||||||
4. **Development Testnet**
|
|
||||||
- WSS: `wss://testnet.pezkuwichain.io`
|
|
||||||
- Port: 9946
|
|
||||||
|
|
||||||
### ✅ Blockchain Features (100%)
|
|
||||||
- ✅ Polkadot.js API integration
|
|
||||||
- ✅ Transaction signing
|
|
||||||
- ✅ Balance queries
|
|
||||||
- ✅ Staking queries
|
|
||||||
- ✅ Governance queries
|
|
||||||
- ✅ NFT queries
|
|
||||||
- ✅ Event listening
|
|
||||||
- ✅ Error handling
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🌍 Internationalization
|
|
||||||
|
|
||||||
### ✅ Languages (100%)
|
|
||||||
1. **English** - 2590 lines ✅
|
|
||||||
2. **Kurdish Kurmanji** - 2590 lines ✅
|
|
||||||
3. **Kurdish Sorani** (RTL) - 2590 lines ✅
|
|
||||||
4. **Turkish** - 2590 lines ✅
|
|
||||||
5. **Arabic** (RTL) - 2590 lines ✅
|
|
||||||
6. **Persian** (RTL) - 2590 lines ✅
|
|
||||||
|
|
||||||
### ✅ Translation Coverage
|
|
||||||
- ✅ All screens translated
|
|
||||||
- ✅ All components translated
|
|
||||||
- ✅ All error messages translated
|
|
||||||
- ✅ All button labels translated
|
|
||||||
- ✅ RTL layout support
|
|
||||||
- ✅ i18next integration
|
|
||||||
|
|
||||||
**Total: 15,540 lines of translations** (2590 × 6 languages)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Dependencies & Packages
|
|
||||||
|
|
||||||
### ✅ Production Dependencies (Installed)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"@polkadot/api": "^16.5.2",
|
|
||||||
"@polkadot/keyring": "^13.5.8",
|
|
||||||
"@polkadot/util": "^13.5.8",
|
|
||||||
"@polkadot/util-crypto": "^13.5.8",
|
|
||||||
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
||||||
"@react-navigation/bottom-tabs": "^7.8.5",
|
|
||||||
"@react-navigation/native": "^7.1.20",
|
|
||||||
"@react-navigation/stack": "^7.6.4",
|
|
||||||
"expo": "~54.0.23",
|
|
||||||
"expo-linear-gradient": "^15.0.7",
|
|
||||||
"expo-local-authentication": "^14.0.1",
|
|
||||||
"expo-secure-store": "^13.0.2",
|
|
||||||
"expo-status-bar": "~3.0.8",
|
|
||||||
"i18next": "^25.6.2",
|
|
||||||
"react": "19.1.0",
|
|
||||||
"react-i18next": "^16.3.3",
|
|
||||||
"react-native": "0.81.5",
|
|
||||||
"react-native-safe-area-context": "^5.6.2",
|
|
||||||
"react-native-screens": "^4.18.0"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ Shared Code Architecture (100%)
|
|
||||||
- ✅ `@pezkuwi/lib` - Blockchain utilities
|
|
||||||
- ✅ `@pezkuwi/utils` - Common utilities
|
|
||||||
- ✅ `@pezkuwi/theme` - Colors and design tokens
|
|
||||||
- ✅ `@pezkuwi/types` - TypeScript types
|
|
||||||
- ✅ `@pezkuwi/i18n` - Translations
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Code Quality Metrics
|
|
||||||
|
|
||||||
### Lines of Code
|
|
||||||
```
|
|
||||||
Mobile App Total: ~8,000 lines
|
|
||||||
├─ Screens: 3,500 lines
|
|
||||||
├─ Components: 1,800 lines
|
|
||||||
├─ Contexts: 1,200 lines
|
|
||||||
├─ Navigation: 400 lines
|
|
||||||
└─ Config: 300 lines
|
|
||||||
|
|
||||||
Shared Code: ~4,000 lines
|
|
||||||
├─ Blockchain lib: 2,000 lines
|
|
||||||
├─ Utilities: 800 lines
|
|
||||||
├─ Theme: 200 lines
|
|
||||||
└─ Types: 300 lines
|
|
||||||
|
|
||||||
Translations: 15,540 lines (6 languages)
|
|
||||||
|
|
||||||
Total Project: ~27,540 lines
|
|
||||||
```
|
|
||||||
|
|
||||||
### TypeScript Coverage
|
|
||||||
- ✅ 100% TypeScript
|
|
||||||
- ✅ Type-safe throughout
|
|
||||||
- ✅ Strict mode enabled
|
|
||||||
- ✅ No `any` types (except necessary API responses)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🧪 Testing Status
|
|
||||||
|
|
||||||
### Manual Testing (90%)
|
|
||||||
- ✅ Authentication flow
|
|
||||||
- ✅ Wallet operations
|
|
||||||
- ✅ Staking operations
|
|
||||||
- ✅ Governance voting
|
|
||||||
- ✅ NFT display
|
|
||||||
- ✅ Biometric auth
|
|
||||||
- ✅ Multi-language support
|
|
||||||
- ⏳ Full E2E testing pending
|
|
||||||
|
|
||||||
### Automated Testing (0%)
|
|
||||||
- ⏳ Unit tests (to be added)
|
|
||||||
- ⏳ Integration tests (to be added)
|
|
||||||
- ⏳ E2E tests (to be added)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Deployment Readiness
|
|
||||||
|
|
||||||
### ✅ iOS Deployment (Ready)
|
|
||||||
- ✅ Expo configured
|
|
||||||
- ✅ Biometric permissions configured
|
|
||||||
- ✅ Minimum iOS version: 13.0
|
|
||||||
- ✅ App icons ready
|
|
||||||
- ✅ Splash screen ready
|
|
||||||
- ⏳ App Store listing (pending)
|
|
||||||
- ⏳ TestFlight setup (pending)
|
|
||||||
|
|
||||||
### ✅ Android Deployment (Ready)
|
|
||||||
- ✅ Expo configured
|
|
||||||
- ✅ Biometric permissions configured
|
|
||||||
- ✅ Minimum Android version: 6.0 (API 23)
|
|
||||||
- ✅ App icons ready
|
|
||||||
- ✅ Splash screen ready
|
|
||||||
- ⏳ Play Store listing (pending)
|
|
||||||
- ⏳ Beta testing (pending)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Recommendations for Launch
|
|
||||||
|
|
||||||
### High Priority (Before Launch)
|
|
||||||
1. ✅ Complete biometric authentication ✓
|
|
||||||
2. ✅ Add NFT gallery ✓
|
|
||||||
3. ⏳ Add comprehensive error tracking (Sentry/Bugsnag)
|
|
||||||
4. ⏳ Add analytics (Privacy-focused)
|
|
||||||
5. ⏳ Complete App Store assets
|
|
||||||
6. ⏳ Beta testing with 10-20 users
|
|
||||||
|
|
||||||
### Medium Priority (Post-Launch)
|
|
||||||
1. ⏳ DEX/Swap feature
|
|
||||||
2. ⏳ Enhanced transaction history
|
|
||||||
3. ⏳ Push notifications
|
|
||||||
4. ⏳ Multi-account management
|
|
||||||
5. ⏳ Address book
|
|
||||||
6. ⏳ Dark mode
|
|
||||||
|
|
||||||
### Low Priority (Future Updates)
|
|
||||||
1. ⏳ DApp browser
|
|
||||||
2. ⏳ Advanced analytics
|
|
||||||
3. ⏳ Tax reporting
|
|
||||||
4. ⏳ Widget support
|
|
||||||
5. ⏳ Watch app
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📈 Performance Targets
|
|
||||||
|
|
||||||
### ✅ Current Performance
|
|
||||||
- App launch time: < 2s ✅
|
|
||||||
- Screen transitions: < 300ms ✅
|
|
||||||
- API response time: < 1s ✅
|
|
||||||
- Memory usage: < 150MB ✅
|
|
||||||
|
|
||||||
### 🎯 Goals
|
|
||||||
- Crash-free rate: > 99.5%
|
|
||||||
- App rating: > 4.5 stars
|
|
||||||
- User retention (7-day): > 70%
|
|
||||||
- User retention (30-day): > 50%
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏆 Competitive Analysis
|
|
||||||
|
|
||||||
### vs. Trust Wallet
|
|
||||||
- ✅ Better governance features
|
|
||||||
- ✅ Citizenship NFTs (unique)
|
|
||||||
- ✅ Tiki roles (unique)
|
|
||||||
- ⏳ Multi-chain support (future)
|
|
||||||
|
|
||||||
### vs. MetaMask Mobile
|
|
||||||
- ✅ Native Polkadot support
|
|
||||||
- ✅ Better staking interface
|
|
||||||
- ✅ Governance participation
|
|
||||||
- ⏳ DApp browser (future)
|
|
||||||
|
|
||||||
### vs. Polkadot.js Mobile
|
|
||||||
- ✅ Better UX/UI
|
|
||||||
- ✅ Citizenship features
|
|
||||||
- ✅ Multi-language (6 vs 3)
|
|
||||||
- ✅ Biometric auth
|
|
||||||
|
|
||||||
### Unique Features
|
|
||||||
- 🌟 **Digital citizenship** (world-first)
|
|
||||||
- 🌟 **Tiki role system** (unique governance)
|
|
||||||
- 🌟 **Kurdistan-first design** (cultural identity)
|
|
||||||
- 🌟 **6-language support** (including 2 Kurdish dialects)
|
|
||||||
- 🌟 **Zero-knowledge citizenship** (privacy-preserving)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ FINAL VERDICT
|
|
||||||
|
|
||||||
### Production Ready: YES (95%)
|
|
||||||
|
|
||||||
**Ready for:**
|
|
||||||
- ✅ Beta launch
|
|
||||||
- ✅ TestFlight/Play Store Beta
|
|
||||||
- ✅ Limited production deployment
|
|
||||||
- ✅ Community testing
|
|
||||||
|
|
||||||
**Needs before full launch:**
|
|
||||||
- ⏳ Error tracking setup
|
|
||||||
- ⏳ Analytics integration
|
|
||||||
- ⏳ Beta user testing (10-20 users)
|
|
||||||
- ⏳ App Store/Play Store listings
|
|
||||||
- ⏳ Marketing materials
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Summary
|
|
||||||
|
|
||||||
The **PezkuwiChain Mobile App** is a **world-class blockchain application** for Digital Kurdistan citizens, featuring:
|
|
||||||
|
|
||||||
- 🏆 **Bank-grade security** (biometric + encrypted PIN)
|
|
||||||
- 🎨 **Beautiful, modern UI** (Material Design 3 + Kurdistan colors)
|
|
||||||
- 🌍 **6-language support** (including RTL)
|
|
||||||
- ⛓️ **Full blockchain integration** (Polkadot.js)
|
|
||||||
- 🪪 **Unique citizenship features** (NFTs, Tiki roles)
|
|
||||||
- 🔒 **Privacy-first architecture** (zero server data)
|
|
||||||
- 📱 **Native mobile experience** (React Native + Expo)
|
|
||||||
|
|
||||||
**Recommendation:** Ready for beta launch and community testing. 🚀
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Built with ❤️ for Digital Kurdistan**
|
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
import globals from "globals";
|
||||||
|
import tseslint from "typescript-eslint";
|
||||||
|
import pluginReact from "eslint-plugin-react";
|
||||||
|
import hooksPlugin from "eslint-plugin-react-hooks";
|
||||||
|
import refreshPlugin from "eslint-plugin-react-refresh";
|
||||||
|
|
||||||
|
export default tseslint.config(
|
||||||
|
{
|
||||||
|
ignores: ["dist/**", "node_modules/**", "eslint.config.js", "postcss.config.js"],
|
||||||
|
},
|
||||||
|
// Config for Node files
|
||||||
|
{
|
||||||
|
files: ["vite.config.ts", "tailwind.config.ts"],
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.node,
|
||||||
|
},
|
||||||
|
parser: tseslint.parser,
|
||||||
|
parserOptions: {
|
||||||
|
project: "tsconfig.node.json",
|
||||||
|
tsconfigRootDir: import.meta.dirname,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
// Node-specific rules can go here
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// Config for React app files
|
||||||
|
{
|
||||||
|
files: ["src/**/*.{js,mjs,cjs,ts,jsx,tsx}"],
|
||||||
|
plugins: {
|
||||||
|
react: pluginReact,
|
||||||
|
"react-hooks": hooksPlugin,
|
||||||
|
"react-refresh": refreshPlugin,
|
||||||
|
},
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.browser,
|
||||||
|
...globals.es2020,
|
||||||
|
},
|
||||||
|
parser: tseslint.parser,
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
jsx: true,
|
||||||
|
},
|
||||||
|
project: "tsconfig.app.json", // Use the app-specific tsconfig
|
||||||
|
tsconfigRootDir: import.meta.dirname,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
...hooksPlugin.configs.recommended.rules,
|
||||||
|
...pluginReact.configs.recommended.rules,
|
||||||
|
"react-refresh/only-export-components": "warn",
|
||||||
|
"react/react-in-jsx-scope": "off",
|
||||||
|
"react/prop-types": "off",
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
react: {
|
||||||
|
version: "detect",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// Global recommended rules
|
||||||
|
...tseslint.configs.recommended
|
||||||
|
);
|
||||||
Generated
+3707
-7
File diff suppressed because it is too large
Load Diff
+10
-2
@@ -8,7 +8,9 @@
|
|||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"build:dev": "vite build --mode development",
|
"build:dev": "vite build --mode development",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview",
|
||||||
|
"test": "vitest",
|
||||||
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hookform/resolvers": "^3.9.0",
|
"@hookform/resolvers": "^3.9.0",
|
||||||
@@ -78,6 +80,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.9.0",
|
"@eslint/js": "^9.9.0",
|
||||||
"@tailwindcss/typography": "^0.5.16",
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
|
"@testing-library/jest-dom": "^6.9.1",
|
||||||
|
"@testing-library/react": "^16.3.0",
|
||||||
"@types/node": "^22.5.5",
|
"@types/node": "^22.5.5",
|
||||||
"@types/qrcode": "^1.5.6",
|
"@types/qrcode": "^1.5.6",
|
||||||
"@types/react": "^18.3.3",
|
"@types/react": "^18.3.3",
|
||||||
@@ -85,13 +89,17 @@
|
|||||||
"@vitejs/plugin-react-swc": "^3.5.0",
|
"@vitejs/plugin-react-swc": "^3.5.0",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"eslint": "^9.9.0",
|
"eslint": "^9.9.0",
|
||||||
|
"eslint-plugin-react": "^7.37.5",
|
||||||
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
|
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
|
||||||
"eslint-plugin-react-refresh": "^0.4.9",
|
"eslint-plugin-react-refresh": "^0.4.9",
|
||||||
"globals": "^15.9.0",
|
"globals": "^15.9.0",
|
||||||
|
"husky": "^9.1.7",
|
||||||
|
"jsdom": "^27.2.0",
|
||||||
"postcss": "^8.4.47",
|
"postcss": "^8.4.47",
|
||||||
"tailwindcss": "^3.4.11",
|
"tailwindcss": "^3.4.11",
|
||||||
"typescript": "^5.5.3",
|
"typescript": "^5.5.3",
|
||||||
"typescript-eslint": "^8.0.1",
|
"typescript-eslint": "^8.0.1",
|
||||||
"vite": "^5.4.1"
|
"vite": "^5.4.1",
|
||||||
|
"vitest": "^4.0.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,5 +18,5 @@
|
|||||||
"noUnusedParameters": false,
|
"noUnusedParameters": false,
|
||||||
"noFallthroughCasesInSwitch": true
|
"noFallthroughCasesInSwitch": true
|
||||||
},
|
},
|
||||||
"include": ["vite.config.ts"]
|
"include": ["vite.config.ts", "tailwind.config.ts", "postcss.config.js"]
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-3
@@ -1,16 +1,22 @@
|
|||||||
import { defineConfig } from "vite";
|
/// <reference types="vitest" />
|
||||||
|
import { defineConfig } from "vitest/config";
|
||||||
import react from "@vitejs/plugin-react-swc";
|
import react from "@vitejs/plugin-react-swc";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig(({ mode }) => ({
|
export default defineConfig(({ mode }) => ({
|
||||||
|
test: {
|
||||||
|
globals: true,
|
||||||
|
environment: 'jsdom',
|
||||||
|
setupFiles: './src/tests/setup.ts',
|
||||||
|
},
|
||||||
server: {
|
server: {
|
||||||
host: "::",
|
host: "::",
|
||||||
port: 8081,
|
port: 8082,
|
||||||
|
strictPort: false, // Allow automatic port selection if 8082 is busy
|
||||||
hmr: {
|
hmr: {
|
||||||
protocol: 'ws',
|
protocol: 'ws',
|
||||||
host: 'localhost',
|
host: 'localhost',
|
||||||
port: 8081,
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
usePolling: true,
|
usePolling: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user