import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const scriptsDir = '/Users/adamavery/US_states_MCP/scripts';
const outputDir = path.join(__dirname, 'data', 'states', 'completed');
function extractStateData(scriptContent) {
const match = scriptContent.match(/const\s+\w+Data\s*=\s*(\{[\s\S]*?\n\};)/);
if (!match) return null;
try {
const dataStr = match[1].replace(/\};$/, '}');
return eval('(' + dataStr + ')');
} catch (e) {
console.error('Failed to parse data:', e.message);
return null;
}
}
function deriveStateCode(filename, data) {
if (data?.state_code) return data.state_code;
const match = filename.match(/save_(.+)\.js$/);
if (match) {
return match[1].toUpperCase().replace(/-/g, '_');
}
return null;
}
function convertToNevadaFormat(oldData, stateCode) {
let completeness = 50;
if (oldData.completeness) {
completeness = parseInt(oldData.completeness.replace('%', ''));
}
return {
state_code: stateCode,
state_name: oldData.state_name || stateCode.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()),
regulator: oldData.regulator || 'TBD',
regulation_source: oldData.regulation_source || 'TBD',
data_extraction_date: oldData.data_extraction_date || new Date().toISOString().split('T')[0],
effective_date: oldData.effective_date || 'TBD',
status: oldData.status || 'active',
completeness_score: completeness,
data_confidence: oldData.confidence_level || 'medium',
legal_framework: oldData.legal_framework || {},
license_types: oldData.license_types || {},
taxation: oldData.taxation || {},
compliance_requirements: oldData.compliance_requirements || {},
technical_requirements: oldData.technical_requirements || oldData.legal_framework?.technical_standards || {},
operational_requirements: oldData.operational_requirements || {},
market_data: oldData.market_data || {},
enforcement_actions: oldData.enforcement_actions || {},
key_features: oldData.key_features || {},
unique_aspects: oldData.unique_aspects || {},
contact_information: oldData.contact_information || {},
resources: oldData.resources || {},
data_sources: oldData.data_sources || [],
notes: oldData.notes || [],
comparison_notes: oldData.comparison_notes || {},
future_outlook: oldData.future_outlook || {}
};
}
const scriptFiles = fs.readdirSync(scriptsDir).filter(f => f.startsWith('save_') && f.endsWith('.js'));
console.log(`Found ${scriptFiles.length} state scripts to convert\n`);
let converted = 0;
let failed = 0;
scriptFiles.forEach(file => {
try {
const scriptPath = path.join(scriptsDir, file);
const content = fs.readFileSync(scriptPath, 'utf8');
const oldData = extractStateData(content);
if (!oldData) {
console.log(`⚠️ ${file} - Could not extract data`);
failed++;
return;
}
const stateCode = deriveStateCode(file, oldData);
if (!stateCode) {
console.log(`⚠️ ${file} - Could not determine state code`);
failed++;
return;
}
const newData = convertToNevadaFormat(oldData, stateCode);
const stateName = stateCode.toLowerCase().replace(/_/g, '-');
const outputPath = path.join(outputDir, `${stateName}.json`);
if (fs.existsSync(outputPath)) {
fs.writeFileSync(outputPath + '.backup', fs.readFileSync(outputPath));
}
fs.writeFileSync(outputPath, JSON.stringify(newData, null, 2));
console.log(`✅ ${newData.state_name} - Converted (${newData.completeness_score}% complete)`);
converted++;
} catch (error) {
console.error(`❌ ${file} - Error: ${error.message}`);
failed++;
}
});
console.log(`\n📊 Summary:`);
console.log(` ✅ Converted: ${converted}`);
console.log(` ❌ Failed: ${failed}`);
console.log(` 📁 Output: ${outputDir}`);
if (failed > 0) {
console.log(`\n⚠️ ${failed} files failed - check them manually`);
}
console.log(`\n🔄 Next: Rebuild MCP server with npx tsc`);