import { existsSync, mkdirSync, createWriteStream, unlinkSync } from 'fs'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; import { get } from 'https'; const __dirname = dirname(fileURLToPath(import.meta.url)); const rootDir = resolve(__dirname, '..'); const libDir = resolve(rootDir, 'jars', 'pmd', 'lib'); const PMD_VERSION = '7.26.0'; const MAVEN_BASE = 'https://repo1.maven.org/maven2'; const JARS = [ { path: `net/sourceforge/pmd/pmd-core/${PMD_VERSION}/pmd-core-${PMD_VERSION}.jar` }, { path: `net/sourceforge/pmd/pmd-java/${PMD_VERSION}/pmd-java-${PMD_VERSION}.jar` }, { path: `net/sourceforge/pmd/pmd-javascript/${PMD_VERSION}/pmd-javascript-${PMD_VERSION}.jar` }, { path: `net/sourceforge/pmd/pmd-jsp/${PMD_VERSION}/pmd-jsp-${PMD_VERSION}.jar` }, { path: 'org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar' }, { path: 'org/slf4j/jul-to-slf4j/1.7.36/jul-to-slf4j-1.7.36.jar' }, { path: 'org/antlr/antlr4-runtime/4.13.2/antlr4-runtime-4.13.2.jar' }, { path: 'net/sf/saxon/Saxon-HE/12.9/Saxon-HE-12.9.jar' }, { path: 'org/apache/commons/commons-lang3/3.20.0/commons-lang3-3.20.0.jar' }, { path: 'org/ow2/asm/asm/9.10.1/asm-9.10.1.jar' }, { path: 'com/google/code/gson/gson/2.14.0/gson-2.14.0.jar' }, { path: 'org/checkerframework/checker-qual/4.2.0/checker-qual-4.2.0.jar' }, { path: 'org/pcollections/pcollections/4.0.2/pcollections-4.0.2.jar' }, { path: 'com/github/oowekyala/ooxml/nice-xml-messages/3.1/nice-xml-messages-3.1.jar' }, { path: 'org/xmlresolver/xmlresolver/5.3.3/xmlresolver-5.3.3.jar' }, { path: 'com/google/errorprone/error_prone_annotations/2.47.0/error_prone_annotations-2.47.0.jar' }, ]; function downloadFile(url, dest) { return new Promise((resolvePromise, reject) => { const file = createWriteStream(dest); get(url, (response) => { if (response.statusCode === 302 || response.statusCode === 301) { downloadFile(response.headers.location, dest).then(resolvePromise).catch(reject); return; } if (response.statusCode !== 200) { reject(new Error(`HTTP ${response.statusCode} for ${url}`)); return; } response.pipe(file); file.on('finish', () => { file.close(); resolvePromise(); }); file.on('error', (err) => { unlinkSync(dest); reject(err); }); }).on('error', (err) => { unlinkSync(dest); reject(err); }); }); } if (!existsSync(libDir)) { mkdirSync(libDir, { recursive: true }); } let count = 0; for (const jar of JARS) { const filename = jar.path.split('/').pop(); const dest = resolve(libDir, filename); if (existsSync(dest)) { console.log(`Skip: ${filename}`); continue; } const url = `${MAVEN_BASE}/${jar.path}`; console.log(`Downloading ${filename}...`); await downloadFile(url, dest); count++; } console.log(`Done. Downloaded ${count} new JARs. Total: ${JARS.length} JARs in ${libDir}`);