Files
theia-code-os/scripts/generate-typedoc-per-package.js
mawkone 8bb5110148
Some checks failed
Playwright Tests / Playwright Tests (ubuntu-22.04, Node.js 22.x) (push) Has been cancelled
3PP License Check / 3PP License Check (11, 22.x, ubuntu-22.04) (push) Has been cancelled
Publish packages to NPM / Perform Publishing (push) Has been cancelled
deploy: current vibn theia state
Made-with: Cursor
2026-02-27 12:01:08 -08:00

86 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
/**
* Generate TypeDoc docs for each non-private package in this monorepo.
*/
const fs = require('fs');
const path = require('path');
const cp = require('child_process');
const rootDir = process.cwd();
/**
* Collects all non-private packages from rootDir/packages and no other source.
*
* This function:
* 1. Queries lerna for all packages in the monorepo
* 2. Filters to only include packages located in rootDir/packages
* 3. Further filters to exclude:
* - Private packages (where package.json has "private": true)
* - Packages without a tsconfig.json file
*/
function getPackages() {
const lernaOutput = cp.execSync('npx lerna ls --loglevel=silent --all --json', {
cwd: rootDir,
encoding: 'utf8'
});
const packages = JSON.parse(lernaOutput);
const packagesDir = path.join(rootDir, 'packages');
return packages.filter(pkg => {
// Only include packages from rootDir/packages (excludes examples, dev-packages, etc.)
const isInPackagesDir = pkg.location.startsWith(packagesDir);
if (!isInPackagesDir) {
return false;
}
const pkgJson = JSON.parse(fs.readFileSync(path.join(pkg.location, 'package.json'), 'utf8'));
const tsconfigPath = path.join(pkg.location, 'tsconfig.json');
return fs.existsSync(tsconfigPath) && pkgJson.private !== true;
});
}
function runTypedoc(pkg) {
const outRoot = path.join(rootDir, 'gh-pages/packages');
const pkgName = path.basename(pkg.location);
const configFile = path.join(rootDir, 'configs/package.typedoc.json');
const outFile = path.join(outRoot, pkgName + '.json');
const tsconfigPath = path.join(pkg.location, 'tsconfig.json');
const readmePath = path.join(pkg.location, 'README.md');
if (!fs.existsSync(tsconfigPath)) {
console.warn(`⚠️ Skipping ${pkgName}: no tsconfig.json`);
return;
}
const args = [
'npx typedoc',
'--options', configFile,
'--json', outFile,
'--tsconfig', tsconfigPath,
'--readme', readmePath,
'./src'
];
const start = Date.now();
try {
cp.execSync(args.join(' '), { cwd: pkg.location, stdio: 'inherit' });
const duration = ((Date.now() - start) / 1000).toFixed(1);
console.log(`${pkgName} done in ${duration}s → ${path.relative(rootDir, outFile)}`);
} catch (err) {
console.error(`❌ Failed for ${pkgName}:`, err.message);
}
}
function main() {
const start = Date.now();
const packages = getPackages();
console.log(`\nFound ${packages.length} TypeScript packages.`);
for (const pkg of packages) {
runTypedoc(pkg);
}
const duration = ((Date.now() - start) / 1000).toFixed(1);
console.log(`\n✅ TypeDoc generation per package complete in ${duration}s`);
}
main();