import 'dotenv/config'; import * as fs from 'fs'; import * as path from 'path'; import { fileURLToPath } from 'url'; import neo4j from 'neo4j-driver'; // SHIM: Define __dirname for ES Modules const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const SYSTEM_ROOT = path.resolve(__dirname, '../../../../'); const IGNORE_DIRS = ['node_modules', 'dist', 'build', '.git', 'coverage']; async function weaveGraph() { console.log('πŸ•·οΈ The Synaptic Weaver: Initializing...'); const uri = process.env.NEO4J_URI; const user = process.env.NEO4J_USER; const password = process.env.NEO4J_PASSWORD; if (!uri || !user || !password) { console.error('❌ FEJL: Mangler Neo4j credentials i .env'); process.exit(1); } const driver = neo4j.driver(uri, neo4j.auth.basic(user, password)); const session = driver.session(); try { await driver.verifyConnectivity(); console.log('βœ… Cloud Cortex Connected.'); const files = findAllFiles(SYSTEM_ROOT, '.ts'); console.log('πŸ“¦ Found ' + files.length + ' .ts files.'); let relationsCreated = 0; for (const filePath of files) { const content = fs.readFileSync(filePath, 'utf-8'); const imports = extractImports(content); if (imports.length === 0) continue; const sourceNodeId = filePath; for (const importPath of imports) { const resolvedPath = resolveImportPath(filePath, importPath); if (resolvedPath && fs.existsSync(resolvedPath)) { await session.run(` MATCH (a:File {path: $source}) MATCH (b:File {path: $target}) MERGE (a)-[r:DEPENDS_ON]->(b) SET r.type = 'static_import' `, { source: sourceNodeId, target: resolvedPath }); relationsCreated++; if (relationsCreated % 10 === 0) process.stdout.write('.'); } } } console.log('\nπŸ•ΈοΈ Weaving Complete! Created ' + relationsCreated + ' new synaptic connections.'); } catch (error) { console.error('πŸ’₯ Critical Weaver Failure:', error); } finally { await session.close(); await driver.close(); } } function findAllFiles(dir, ext, fileList = []) { const files = fs.readdirSync(dir); files.forEach(file => { const filePath = path.join(dir, file); const stat = fs.statSync(filePath); if (IGNORE_DIRS.includes(file)) return; if (stat.isDirectory()) { findAllFiles(filePath, ext, fileList); } else { if (path.extname(file) === ext) fileList.push(filePath); } }); return fileList; } function extractImports(content) { const regex = /import\s+.*?\s+from\s+['"](.*?)['"]/g; const paths = []; let match; while ((match = regex.exec(content)) !== null) paths.push(match[1]); return paths; } function resolveImportPath(currentFile, importPath) { if (importPath.startsWith('.')) { const dir = path.dirname(currentFile); let resolved = path.resolve(dir, importPath); if (!resolved.endsWith('.ts') && fs.existsSync(resolved + '.ts')) return resolved + '.ts'; if (fs.existsSync(path.join(resolved, 'index.ts'))) return path.join(resolved, 'index.ts'); return fs.existsSync(resolved) ? resolved : null; } return null; } weaveGraph();