glam/frontend/scripts/generate-schema-manifest.cjs
2025-11-30 23:30:29 +01:00

83 lines
2.2 KiB
JavaScript

#!/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();