Skip to content

Commit 1854aa9

Browse files
committed
Update collect-npm-stats.ts
1 parent a5a8ad7 commit 1854aa9

File tree

1 file changed

+23
-33
lines changed

1 file changed

+23
-33
lines changed

scripts/collect-npm-stats.ts

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import { mkdir, readFile, writeFile } from 'node:fs/promises';
55
import { dirname, join } from 'node:path';
6-
import * as semver from 'semver';
76

87
interface NpmDownloadResponse {
98
package: string;
@@ -32,22 +31,6 @@ async function fetchPackageStats(packageName: string): Promise<NpmDownloadRespon
3231
return response.json() as Promise<NpmDownloadResponse>;
3332
}
3433

35-
function aggregateByMajorVersion(downloads: Record<string, number>): Record<string, number> {
36-
const majorVersions: Record<string, number> = {};
37-
38-
for (const [version, count] of Object.entries(downloads)) {
39-
const major = semver.major(version);
40-
const majorKey = major.toString();
41-
42-
if (!majorVersions[majorKey]) {
43-
majorVersions[majorKey] = 0;
44-
}
45-
majorVersions[majorKey] += count;
46-
}
47-
48-
return majorVersions;
49-
}
50-
5134
async function readExistingData(filePath: string): Promise<HistoricalData | null> {
5235
try {
5336
const content = await readFile(filePath, 'utf-8');
@@ -70,8 +53,8 @@ async function updateHistoricalData(
7053
if (!existingData) {
7154
// Create new data structure
7255
const downloads: Record<string, number[]> = {};
73-
for (const [major, count] of Object.entries(newDownloads)) {
74-
downloads[major] = [count];
56+
for (const [version, count] of Object.entries(newDownloads)) {
57+
downloads[version] = [count];
7558
}
7659

7760
return {
@@ -89,18 +72,18 @@ async function updateHistoricalData(
8972
};
9073

9174
// Add new download counts
92-
for (const [major, count] of Object.entries(newDownloads)) {
93-
if (!updatedData.downloads[major]) {
94-
// New major version - backfill with zeros for historical timestamps
95-
updatedData.downloads[major] = new Array(existingData.timestamps.length).fill(0);
75+
for (const [version, count] of Object.entries(newDownloads)) {
76+
if (!updatedData.downloads[version]) {
77+
// New version - backfill with zeros for historical timestamps
78+
updatedData.downloads[version] = new Array(existingData.timestamps.length).fill(0);
9679
}
97-
updatedData.downloads[major].push(count);
80+
updatedData.downloads[version].push(count);
9881
}
9982

100-
// Ensure all existing major versions have a new entry (fill with 0 if no downloads)
101-
for (const major of Object.keys(existingData.downloads)) {
102-
if (!newDownloads[major]) {
103-
updatedData.downloads[major].push(0);
83+
// Ensure all existing versions have a new entry (fill with 0 if no downloads)
84+
for (const version of Object.keys(existingData.downloads)) {
85+
if (!newDownloads[version]) {
86+
updatedData.downloads[version].push(0);
10487
}
10588
}
10689

@@ -112,8 +95,15 @@ async function processPackage(packageName: string): Promise<void> {
11295
// Fetch current stats
11396
const stats = await fetchPackageStats(packageName);
11497

115-
// Aggregate by major version
116-
const aggregatedDownloads = aggregateByMajorVersion(stats.downloads);
98+
// Check if package has any download statistics
99+
if (!stats.downloads || Object.keys(stats.downloads).length === 0) {
100+
throw new Error(
101+
`Package ${packageName} has no download statistics - it may not exist or have no downloads`,
102+
);
103+
}
104+
105+
// Use all versions without aggregation
106+
const allVersionDownloads = stats.downloads;
117107

118108
// Determine file path
119109
const dataDir = join(process.cwd(), 'data', 'npm-versions');
@@ -126,15 +116,15 @@ async function processPackage(packageName: string): Promise<void> {
126116
const existingData = await readExistingData(filePath);
127117

128118
// Update historical data
129-
const updatedData = await updateHistoricalData(packageName, aggregatedDownloads, existingData);
119+
const updatedData = await updateHistoricalData(packageName, allVersionDownloads, existingData);
130120

131121
// Write back to file
132122
await writeFile(filePath, JSON.stringify(updatedData, null, 2));
133123

134124
console.log(`✅ Updated stats for ${packageName}`);
135-
console.log(` Major versions: ${Object.keys(aggregatedDownloads).join(', ')}`);
125+
console.log(` Versions: ${Object.keys(allVersionDownloads).join(', ')}`);
136126
console.log(
137-
` Total downloads: ${Object.values(aggregatedDownloads).reduce((a, b) => a + b, 0)}`,
127+
` Total downloads: ${Object.values(allVersionDownloads).reduce((a, b) => a + b, 0)}`,
138128
);
139129
} catch (error) {
140130
console.error(`❌ Failed to process ${packageName}:`, error);

0 commit comments

Comments
 (0)