- Add comprehensive database migrations (001-024) for schema evolution - Enhance API schema with expanded type definitions and resolvers - Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth - Implement new services: AI optimization, billing, blockchain, compliance, marketplace - Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage) - Update Crossplane provider with enhanced VM management capabilities - Add comprehensive test suite for API endpoints and services - Update frontend components with improved GraphQL subscriptions and real-time updates - Enhance security configurations and headers (CSP, CORS, etc.) - Update documentation and configuration files - Add new CI/CD workflows and validation scripts - Implement design system improvements and UI enhancements
109 lines
3.7 KiB
TypeScript
109 lines
3.7 KiB
TypeScript
#!/usr/bin/env tsx
|
|
/**
|
|
* Convert CSV export to JSON format for infrastructure documentation
|
|
* Usage: tsx scripts/infrastructure/convert-csv-to-json.ts
|
|
*/
|
|
|
|
import * as fs from 'fs'
|
|
import * as path from 'path'
|
|
|
|
const PROJECT_ROOT = path.resolve(__dirname, '../..')
|
|
const DATA_DIR = path.join(PROJECT_ROOT, 'docs/infrastructure/data')
|
|
|
|
interface Country {
|
|
name: string
|
|
region: 'Africa (Sub-Saharan)' | 'Middle East & North Africa' | 'Americas' | 'Asia-Pacific' | 'Europe'
|
|
relationshipType: 'Full Diplomatic Relations' | 'Official (Non-Diplomatic)' | 'Ambassador Level' | 'Full Diplomatic Relations (Special Mission)'
|
|
priority: 'Critical' | 'High' | 'Medium' | 'Low'
|
|
cloudflareCoverage: boolean
|
|
networkInfrastructurePriority: string
|
|
notes?: string
|
|
coordinates?: { lat: number; lng: number }
|
|
}
|
|
|
|
// Country coordinates (approximate, can be enhanced with geocoding)
|
|
const COUNTRY_COORDINATES: Record<string, { lat: number; lng: number }> = {
|
|
'Italy': { lat: 41.9028, lng: 12.4964 },
|
|
'Germany': { lat: 51.1657, lng: 10.4515 },
|
|
'France': { lat: 46.2276, lng: 2.2137 },
|
|
'Spain': { lat: 40.4637, lng: -3.7492 },
|
|
'Brazil': { lat: -14.2350, lng: -51.9253 },
|
|
'Argentina': { lat: -38.4161, lng: -63.6167 },
|
|
'Philippines': { lat: 12.8797, lng: 121.7740 },
|
|
'Kenya': { lat: -0.0236, lng: 37.9062 },
|
|
'Ethiopia': { lat: 9.1450, lng: 38.7667 },
|
|
'Lebanon': { lat: 33.8547, lng: 35.8623 },
|
|
'Holy See (Vatican City)': { lat: 41.9029, lng: 12.4534 },
|
|
}
|
|
|
|
function parseCSV(csvContent: string): Country[] {
|
|
const lines = csvContent.trim().split('\n')
|
|
const headers = lines[0].split(',').map(h => h.trim())
|
|
|
|
return lines.slice(1).map(line => {
|
|
const values = line.split(',').map(v => v.trim())
|
|
const country: Country = {
|
|
name: values[0],
|
|
region: values[1] as Country['region'],
|
|
relationshipType: values[2] as Country['relationshipType'],
|
|
priority: values[3] as Country['priority'],
|
|
cloudflareCoverage: values[4] === 'Yes',
|
|
networkInfrastructurePriority: values[5],
|
|
notes: values[6] || undefined,
|
|
coordinates: COUNTRY_COORDINATES[values[0]] || undefined,
|
|
}
|
|
return country
|
|
})
|
|
}
|
|
|
|
function main() {
|
|
// Find the most recent CSV file
|
|
const files = fs.readdirSync(DATA_DIR)
|
|
.filter(f => f.startsWith('smom_countries_full_') && f.endsWith('.csv'))
|
|
.sort()
|
|
.reverse()
|
|
|
|
if (files.length === 0) {
|
|
console.error('No CSV files found. Please run export-smom-countries.sh first.')
|
|
process.exit(1)
|
|
}
|
|
|
|
const csvFile = path.join(DATA_DIR, files[0])
|
|
console.log(`Reading CSV file: ${csvFile}`)
|
|
|
|
const csvContent = fs.readFileSync(csvFile, 'utf-8')
|
|
const countries = parseCSV(csvContent)
|
|
|
|
// Write JSON file
|
|
const jsonFile = path.join(DATA_DIR, 'smom_countries.json')
|
|
fs.writeFileSync(jsonFile, JSON.stringify(countries, null, 2))
|
|
console.log(`✓ Created ${jsonFile} with ${countries.length} countries`)
|
|
|
|
// Create summary statistics
|
|
const summary = {
|
|
total: countries.length,
|
|
byRegion: countries.reduce((acc, c) => {
|
|
acc[c.region] = (acc[c.region] || 0) + 1
|
|
return acc
|
|
}, {} as Record<string, number>),
|
|
byPriority: countries.reduce((acc, c) => {
|
|
acc[c.priority] = (acc[c.priority] || 0) + 1
|
|
return acc
|
|
}, {} as Record<string, number>),
|
|
byRelationshipType: countries.reduce((acc, c) => {
|
|
acc[c.relationshipType] = (acc[c.relationshipType] || 0) + 1
|
|
return acc
|
|
}, {} as Record<string, number>),
|
|
lastUpdated: new Date().toISOString(),
|
|
}
|
|
|
|
const summaryFile = path.join(DATA_DIR, 'smom_countries_summary.json')
|
|
fs.writeFileSync(summaryFile, JSON.stringify(summary, null, 2))
|
|
console.log(`✓ Created ${summaryFile}`)
|
|
}
|
|
|
|
if (require.main === module) {
|
|
main()
|
|
}
|
|
|