File size: 1,536 Bytes
39371ea | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import { readdir, readFile, mkdir, writeFile } from 'node:fs/promises';
import path from 'node:path';
// Include dependency notices with the static distributable, without fetching
// anything at build time. Some upstream Pi packages omit a LICENSE file;
// their repository license is included in public/licenses/pi-LICENSE.
export async function collectLicenses() {
const notices = [];
async function scan(root) {
for (const entry of await readdir(root, { withFileTypes: true })) {
if (!entry.isDirectory() || entry.name.startsWith('.')) continue;
const directory = path.join(root, entry.name);
if (entry.name.startsWith('@')) { await scan(directory); continue; }
let pkg;
try { pkg = JSON.parse(await readFile(path.join(directory, 'package.json'), 'utf8')); } catch { continue; }
const texts = [];
for (const file of await readdir(directory, { withFileTypes: true })) {
if (file.isFile() && /^(licen[cs]e|copying|notice|thirdpartynotices)/i.test(file.name)) texts.push(await readFile(path.join(directory, file.name), 'utf8'));
}
notices.push(`${pkg.name}@${pkg.version} (${pkg.license ?? 'see upstream'})\n${texts.join('\n')}\n`);
}
}
await scan('node_modules');
await mkdir('dist/licenses', { recursive: true });
await writeFile('dist/licenses/dependencies.txt', notices.sort().join('\n----------------------------------------\n\n'));
await writeFile('dist/licenses/pi-components.json', await readFile('vendor/pi-coding-agent/provenance.json'));
}
|