UNPKG

3.56 kBPlain TextView Raw
1import { performance } from 'perf_hooks';
2import * as tsm from 'ts-morph';
3import { PackageAPI } from '../types/package-api';
4import { TaggedGitRepository } from '../types/tagged-git-repository';
5import { log } from '../utils/log';
6import { getOverview } from './get-overview';
7import { getPackageDeclarations } from './get-package-declarations';
8import { getPackageFiles } from './get-package-files';
9import { getProject } from './get-project';
10import { getRepositoryFileURLProvider } from './repository-file-url-provider';
11import { getSourceProvider } from './source-provider';
12import { getTypeChecker } from './type-checker';
13import { getUnpkgFileURLProvider } from './unpkg-file-url-provider';
14
15/**
16 * `extractPackageAPI` extracts the public API from a package.
17 *
18 * @param fileSystem - filesystem containing the package's source code
19 * @param entryPoint - absolute path of the file acting as the package's entry point
20 * @param maxDepth - maximum depth for analyzing nested namespaces (default: `5`)
21 * @param pattern - file pattern including files to be analyzed
22 * @param repository - a tagged git repository to enable linking to source
23 * @param id - npm-style package ID used for logging (for example, `foo@1.0.0`)
24 *
25 * @see {@link PackageAPI}
26 */
27export function extractPackageAPI({
28 fileSystem,
29 entryPoint,
30 maxDepth,
31 pattern,
32 repository,
33 id,
34}: {
35 fileSystem: tsm.FileSystemHost;
36 entryPoint: string;
37 maxDepth?: number;
38 pattern?: string;
39 repository?: TaggedGitRepository;
40 id?: string;
41}): PackageAPI {
42 const start = performance.now();
43 log('extractPackageAPI: extracting API: %O', {
44 id,
45 entryPoint,
46 maxDepth,
47 pattern,
48 repository,
49 fileSystem,
50 });
51
52 const project = getProject({ fileSystem, pattern });
53 log('extractPackageAPI: created project: %O', {
54 id,
55 files: project.getSourceFiles().map((file) => file.getFilePath()),
56 });
57
58 const indexFile = project.getSourceFileOrThrow(entryPoint);
59 log('extractPackageAPI: found index file: %O', {
60 id,
61 indexFile: indexFile.getFilePath(),
62 });
63
64 const getRepositoryFileURL = getRepositoryFileURLProvider({ repository });
65 log('extractPackageAPI: got repository file URL provider');
66
67 const getUnpkgFileURL = getUnpkgFileURLProvider({ id });
68 log('extractPackageAPI: got unpkg file URL provider');
69
70 const getSource = getSourceProvider({
71 getRepositoryFileURL,
72 getUnpkgFileURL,
73 });
74 log('extractPackageAPI: got source provider');
75
76 const getType = getTypeChecker({ project });
77 log('extractPackageAPI: got type checker');
78
79 const overview = getOverview({ indexFile });
80 log('extractPackageAPI: got package overview: %O', { id, overview });
81
82 const declarations = getPackageDeclarations({
83 project,
84 indexFile,
85 maxDepth,
86 getSource,
87 getType,
88 });
89 log('extractPackageAPI: got package declarations: %O', {
90 id,
91 declarations,
92 });
93
94 const files = getPackageFiles({
95 indexFile,
96 declarations,
97 getRepositoryFileURL,
98 getUnpkgFileURL,
99 });
100 log('extractPackageAPI: got package files: %O', { id, files });
101
102 const elapsed = Math.round(performance.now() - start);
103 log('extractPackageAPI: performance (ms): %O', { id, elapsed });
104
105 log('extractPackageAPI: extracted package API: %O', {
106 id,
107 api: { overview, declarations, files },
108 });
109
110 return { overview, declarations, files };
111}