UNPKG

@jsdocs-io/extractor

Version:

Analyze and extract the API from npm packages

96 lines (89 loc) 2.96 kB
import { performance } from 'perf_hooks'; import { getPackageManifest } from 'query-registry'; import { RegistryPackageInfo } from '../types/registry-package-info'; import { log } from '../utils/log'; import { tryGetPackageAPI } from './try-get-package-api'; /** * `analyzeRegistryPackage` analyzes a package hosted on a registry and * tries to extract its public API. * * @example * Analyze the latest version of package `query-registry` from the npm registry: * * ```typescript * import { analyzeRegistryPackage } from '@jsdocs-io/extractor'; * * (async () => { * const info = await analyzeRegistryPackage({ name: 'query-registry' }); * * // Output: 'query-registry' * console.log(info.manifest.name); * * // Output: 'string' * console.log(typeof info.api?.overview); * })(); * ``` * * @param name - package name * @param version - package version (default: `latest`) * @param registry - registry URL (default: npm registry) * @param mirrors - URLs of registry mirrors (default: npm registry mirrors) * @param ignoreLicense - if `true`, extract API from unlicensed or proprietary packages (default: `false`) * @param ignoreFilePatternOptimizations - if `true`, ignore file pattern optimizations for known npm packages (default: `false`) * @param skipAPIExtraction - if `true`, do not extract the API from the package (default: `false`) * * @see {@link RegistryPackageInfo} */ export async function analyzeRegistryPackage({ name, version, registry, mirrors, ignoreLicense, ignoreFilePatternOptimizations, skipAPIExtraction = false, }: { name: string; version?: string; registry?: string; mirrors?: string[]; ignoreLicense?: boolean; ignoreFilePatternOptimizations?: boolean; skipAPIExtraction?: boolean; }): Promise<RegistryPackageInfo> { const start = performance.now(); log('analyzeRegistryPackage: analyzing package: %O', { name, version }); const manifest = await getPackageManifest({ name, version, registry, mirrors, }); const { id } = manifest; log('analyzeRegistryPackage: got manifest: %O', { id, manifest }); if (skipAPIExtraction) { log('analyzeRegistryPackage: skipping API extraction: %O', { id }); return { id, manifest, api: undefined, elapsed: Math.round(performance.now() - start), createdAt: new Date().toISOString(), }; } const api = await tryGetPackageAPI({ manifest, ignoreLicense, ignoreFilePatternOptimizations, }); log('analyzeRegistryPackage: extracted API: %O', { id, api }); const elapsed = Math.round(performance.now() - start); log('analyzeRegistryPackage: performance (ms): %O', { id, elapsed }); return { id, manifest, api, elapsed, createdAt: new Date().toISOString(), }; }