#!/usr/bin/env node /** * Generate a manifest of LinkML schema files for the frontend * This script scans the schemas directory and creates a JSON manifest * that the frontend can use to dynamically load schema files. * * Run: node scripts/generate-schema-manifest.js */ const fs = require('fs'); const path = require('path'); const SCHEMAS_DIR = path.join(__dirname, '../public/schemas/20251121/linkml'); const OUTPUT_FILE = path.join(__dirname, '../public/schemas/20251121/linkml/manifest.json'); function scanDirectory(dir, category) { const files = []; if (!fs.existsSync(dir)) { console.warn(`Directory not found: ${dir}`); return files; } const entries = fs.readdirSync(dir); for (const entry of entries) { if (entry.endsWith('.yaml') && !entry.endsWith('.bak.yaml') && !entry.includes('.bak')) { const name = entry.replace('.yaml', ''); files.push({ name, path: `modules/${category}/${entry}`, category }); } } return files.sort((a, b) => a.name.localeCompare(b.name)); } function generateManifest() { const manifest = { generated: new Date().toISOString(), version: '1.0.0', categories: [ { name: 'main', displayName: 'Main Schema', files: [{ name: 'Heritage Custodian Ontology', path: '01_custodian_name_modular.yaml', category: 'main' }] }, { name: 'class', displayName: 'Classes', files: scanDirectory(path.join(SCHEMAS_DIR, 'modules/classes'), 'classes') }, { name: 'enum', displayName: 'Enumerations', files: scanDirectory(path.join(SCHEMAS_DIR, 'modules/enums'), 'enums') }, { name: 'slot', displayName: 'Slots', files: scanDirectory(path.join(SCHEMAS_DIR, 'modules/slots'), 'slots') } ] }; // Write manifest fs.writeFileSync(OUTPUT_FILE, JSON.stringify(manifest, null, 2)); // Print summary console.log('Schema manifest generated:'); for (const cat of manifest.categories) { console.log(` ${cat.displayName}: ${cat.files.length} files`); } console.log(`\nOutput: ${OUTPUT_FILE}`); } generateManifest();