-
Notifications
You must be signed in to change notification settings - Fork 2.4k
/
Copy pathTsJs.ts
77 lines (70 loc) · 2.37 KB
/
TsJs.ts
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { PackageCrawler } from "..";
import {
FilePathAndName,
PackageDetails,
PackageFilePathAndName,
ParsedPackageInfo,
} from "../../../..";
export class NodePackageCrawler implements PackageCrawler {
packageRegistry = "npm";
getPackageFiles(files: FilePathAndName[]): PackageFilePathAndName[] {
// For Javascript/TypeScript, we look for package.json file
return files
.filter((file) => file.name === "package.json")
.map((file) => ({
...file,
packageRegistry: this.packageRegistry,
}));
}
parsePackageFile(
file: PackageFilePathAndName,
contents: string,
): ParsedPackageInfo[] {
// Parse the package.json content
const jsonData = JSON.parse(contents) as Record<string, Object>;
const dependencies = Object.entries(jsonData.dependencies || {}).concat(
Object.entries(jsonData.devDependencies || {}),
);
// Filter out types packages and check if typescript is present
let foundTypes = false;
const filtered = dependencies.filter(([name, _]) => {
if (name.startsWith("@types/")) {
foundTypes = true;
return false;
}
if (name.includes("typescript")) {
foundTypes = true;
}
return true;
});
return filtered.map(([name, version]) => ({
name,
version,
packageFile: file,
language: foundTypes ? "ts" : "js",
}));
}
async getPackageDetails(
packageInfo: ParsedPackageInfo,
): Promise<PackageDetails> {
const { name } = packageInfo;
// Fetch metadata from the NPM registry to find the documentation link
const response = await fetch(`https://registry.npmjs.org/${name}`);
if (!response.ok) {
throw new Error(`Could not fetch data for package ${name}`);
}
const data = await response.json();
// const dependencies = Object.keys(packageContentData.dependencies || {})
// .concat(Object.keys(packageContentData.devDependencies || {}));
// const usesTypescript = dependencies.includes("typescript");
return {
docsLink: data.homepage as string | undefined,
title: name, // package.json doesn't have specific title field
description: data.description as string | undefined,
repo: Array.isArray(data.repository)
? (data.respository[0]?.url as string | undefined)
: undefined,
license: data.license as string | undefined,
};
}
}