~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/pds.js

An atproto PDS in JavaScript, for Cloudflare Workers and Node

0
0
main
36 lines · 1.1 KB Raw History
#!/usr/bin/env node
// Guards the atomic library: every component file exports exactly one
// component. Biome has no rule for this, so this runs in `npm run lint`.

import { readdirSync, readFileSync, statSync } from 'node:fs';
import { fileURLToPath } from 'node:url';

const root = fileURLToPath(new URL('../src/components/', import.meta.url));
const offenders = [];

/** @param {string} dir */
function walk(dir) {
  for (const name of readdirSync(dir)) {
    const path = `${dir}/${name}`;
    if (statSync(path).isDirectory()) {
      walk(path);
    } else if (name.endsWith('.jsx')) {
      const source = readFileSync(path, 'utf8');
      const components = [
        ...source.matchAll(/^export\s+function\s+([A-Z]\w*)/gm),
      ].map((match) => match[1]);
      if (components.length > 1) {
        offenders.push(`${path}: ${components.join(', ')}`);
      }
    }
  }
}

walk(root);

if (offenders.length) {
  console.error('Component files exporting more than one component:');
  for (const line of offenders) console.error(`  ${line}`);
  process.exit(1);
}
console.log('one-component-per-file: ok');