AT Protocol lexicon schemas for Sifa professional profiles (id.sifa.*)
sifa.id/
1/**
2 * Generate TypeScript types from lexicon schemas.
3 *
4 * Includes external lexicons (com.atproto.*, community.lexicon.*) that our
5 * schemas reference, so lex-cli can resolve all type references.
6 */
7import { readdirSync } from 'node:fs';
8import { join } from 'node:path';
9import { execFileSync } from 'node:child_process';
10
11const ROOT = new URL('..', import.meta.url).pathname;
12const LEXICONS_DIR = join(ROOT, 'lexicons');
13const EXTERNAL_DIR = join(ROOT, 'external-lexicons');
14const OUTPUT_DIR = join(ROOT, 'src', 'generated');
15
16const EXCLUDED_FILES = ['authProfileAccess.json'];
17
18function findJsonFiles(dir) {
19 const results = [];
20 for (const entry of readdirSync(dir, { withFileTypes: true })) {
21 const fullPath = join(dir, entry.name);
22 if (entry.isDirectory()) {
23 results.push(...findJsonFiles(fullPath));
24 } else if (entry.name.endsWith('.json') && !EXCLUDED_FILES.includes(entry.name)) {
25 results.push(fullPath);
26 }
27 }
28 return results;
29}
30
31const ownFiles = findJsonFiles(LEXICONS_DIR);
32const externalFiles = findJsonFiles(EXTERNAL_DIR);
33const allFiles = [...ownFiles, ...externalFiles];
34
35console.log(`Found ${ownFiles.length} own + ${externalFiles.length} external lexicon files`);
36
37execFileSync('npx', ['lex', 'gen-server', OUTPUT_DIR, ...allFiles, '--yes'], {
38 cwd: ROOT,
39 stdio: 'inherit',
40});
41
42console.log('Running fixup script...');
43execFileSync('node', ['scripts/fixup-generated.js'], { cwd: ROOT, stdio: 'inherit' });